#include "httpd.h" #include "httpd_commands.h" #include "conf.h" #include #include GSocketService *ss = NULL; static gboolean service_incoming(GSocketService *service, GSocketConnection *connection, GObject *source_object, gpointer user_data) { GSocket *socket; GError *error = NULL; socket = g_socket_connection_get_socket(connection); if(socket == NULL) { g_warning("g_socket_connection_get_socket() returned NULL"); return FALSE; } GDataInputStream *input = g_data_input_stream_new(g_io_stream_get_input_stream((GIOStream*)connection)); g_data_input_stream_set_newline_type(input, G_DATA_STREAM_NEWLINE_TYPE_CR_LF); GString *string = g_string_new(NULL); gchar *line; gsize size; gchar *path = NULL; while(g_socket_is_connected(socket) == TRUE && (line = g_data_input_stream_read_line(input, &size, NULL, &error)) != NULL) { if(strlen(line) == 0) { break; } if(path == NULL) { gchar **firstline = g_strsplit(line, " ", 0); /* this sets the first character of the last string in * firstline to \0 (HTTP version) */ firstline[g_strv_length(firstline)-1] = '\0'; /* now join from the second string to get the request path */ gchar *path_escaped = g_strjoinv(" ", firstline + 1); path = g_uri_unescape_string(path_escaped, NULL); g_free(path_escaped); } else { g_string_append(string, line); } } g_object_unref(input); /* not yet used */ g_string_free(string, TRUE); httpd_commands_handle(connection, path); g_free(path); if(g_socket_close(socket, &error) == FALSE) { g_warning(error->message); g_error_free(error); } return FALSE; } gboolean httpd_start() { gint port = conf_get_int("audist", "httpd_port"); if(port <= 0) { g_warning("invalid httpd port"); return FALSE; } ss = g_threaded_socket_service_new(10); if(g_socket_listener_add_inet_port((GSocketListener*)ss, port, NULL, NULL) == FALSE) { g_warning("httpd: failed to set port"); return FALSE; } g_signal_connect(ss, "run", (GCallback)service_incoming, NULL); g_socket_service_start(ss); return TRUE; } void httpd_stop() { g_socket_service_stop(ss); g_object_unref(ss); ss = NULL; }