gboolean _xr_server_service_run(GThreadedSocketService *service, GSocketConnection *connection, GObject *source_object, gpointer user_data) { GError* local_err = NULL; xr_server* server = user_data; xr_server_conn* conn; //xr_trace(XR_DEBUG_SERVER_TRACE, "(conn=%p, server=%p)", conn, server); xr_set_nodelay(g_socket_connection_get_socket(connection)); // new connection accepted conn = g_new0(xr_server_conn, 1); conn->servlets = g_ptr_array_sized_new(3); conn->running = TRUE; // setup TLS if (server->secure) { conn->tls_conn = g_tls_server_connection_new(G_IO_STREAM(connection), server->cert, &local_err); if (local_err) { g_error_free(local_err); goto out; } //g_object_set(conn->conn, "authentication-mode", test->auth_mode, NULL); //g_signal_connect(conn->conn, "accept-certificate", G_CALLBACK(on_accept_certificate), server); conn->http = xr_http_new(conn->tls_conn); } else { conn->http = xr_http_new(G_IO_STREAM(connection)); } conn->conn = connection; while (conn->running) { if (!_xr_server_serve_request(server, conn)) break; } out: xr_http_free(conn->http); if (conn->tls_conn) g_object_unref(conn->tls_conn); g_ptr_array_foreach(conn->servlets, (GFunc)xr_servlet_free_fini, NULL); g_ptr_array_free(conn->servlets, TRUE); memset(conn, 0, sizeof(*conn)); g_free(conn); return FALSE; }
void xr_client_close(xr_client_conn* conn) { xr_trace(XR_DEBUG_CLIENT_TRACE, "(conn=%p)", conn); g_return_if_fail(conn != NULL); if (!conn->is_open) return; xr_http_free(conn->http); conn->http = NULL; if (conn->conn) g_object_unref(conn->conn); conn->conn = NULL; conn->is_open = FALSE; }