static void create_connection (GSocketConnection ** client_conn, GSocketConnection ** server_conn) { ServiceData *data; GThread *service_thread; GSocketClient *client = g_socket_client_new (); data = g_new0 (ServiceData, 1); g_mutex_init (&data->mutex); g_cond_init (&data->cond); service_thread = g_thread_new ("service thread", service_thread_func, data); fail_unless (service_thread != NULL); /* wait for the service to start */ g_mutex_lock (&data->mutex); while (!data->started) { g_cond_wait (&data->cond, &data->mutex); } g_mutex_unlock (&data->mutex); /* create the tcp link */ *client_conn = g_socket_client_connect_to_host (client, (gchar *) "localhost", data->port, NULL, NULL); fail_unless (*client_conn != NULL); fail_unless (g_socket_connection_is_connected (*client_conn)); g_thread_join (service_thread); *server_conn = data->conn; data->conn = NULL; fail_unless (g_socket_connection_is_connected (*server_conn)); g_mutex_clear (&data->mutex); g_cond_clear (&data->cond); g_free (data); g_object_unref (client); }
static gboolean _xr_server_serve_request(xr_server* server, xr_server_conn* conn) { const char* method; int version; xr_trace(XR_DEBUG_SERVER_TRACE, "(server=%p, conn=%p)", server, conn); g_return_val_if_fail(server != NULL, FALSE); g_return_val_if_fail(conn != NULL, FALSE); if (!g_socket_connection_is_connected(conn->conn)) return FALSE; /* receive HTTP request */ if (!xr_http_read_header(conn->http, NULL)) return FALSE; /* check if some dumb bunny sent us wrong message type */ if (xr_http_get_message_type(conn->http) != XR_HTTP_REQUEST) return FALSE; method = xr_http_get_method(conn->http); if (method == NULL) return FALSE; version = xr_http_get_version(conn->http); if (!strcmp(method, "GET")) return _xr_server_serve_download(server, conn) && (version == 1); else if (!strcmp(method, "POST")) { int transport = _ctype_to_transport(xr_http_get_header(conn->http, "Content-Type")); if (transport >= 0) { xr_call* call; GString* request; char* buffer; int length; gboolean rs; request = xr_http_read_all(conn->http, NULL); if (request == NULL) return FALSE; /* parse request data into xr_call */ call = xr_call_new(NULL); xr_call_set_transport(call, transport); rs = xr_call_unserialize_request(call, request->str, request->len); g_string_free(request, TRUE); /* run call */ if (!rs) xr_call_set_error(call, -1, "Unserialize request failure."); else _xr_server_servlet_method_call(server, conn, call); /* generate response data from xr_call */ xr_call_serialize_response(call, &buffer, &length); if (xr_debug_enabled & XR_DEBUG_CALL) xr_call_dump(call, 0); /* send HTTP response */ xr_http_setup_response(conn->http, 200); xr_http_set_message_length(conn->http, length); rs = xr_http_write_all(conn->http, buffer, length, NULL); xr_call_free_buffer(call, buffer); xr_call_free(call); return rs && (version == 1); } else return _xr_server_serve_upload(server, conn) && (version == 1); } else return FALSE; return TRUE; }