Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}