diff options
Diffstat (limited to 'libsoup/soup-connection.c')
-rw-r--r-- | libsoup/soup-connection.c | 168 |
1 files changed, 23 insertions, 145 deletions
diff --git a/libsoup/soup-connection.c b/libsoup/soup-connection.c index 69610385..9369176a 100644 --- a/libsoup/soup-connection.c +++ b/libsoup/soup-connection.c @@ -16,20 +16,14 @@ typedef struct { SoupSocket *socket; + SoupSocketProperties *socket_props; - SoupAddress *local_addr; SoupURI *remote_uri, *proxy_uri; - GProxyResolver *proxy_resolver; - GTlsDatabase *tlsdb; - gboolean ssl, ssl_strict, ssl_fallback; - - GMainContext *async_context; - gboolean use_thread_context; + gboolean ssl, ssl_fallback; SoupMessage *current_msg; SoupConnectionState state; time_t unused_timeout; - guint io_timeout, idle_timeout; GSource *idle_timeout_src; gboolean reusable; } SoupConnectionPrivate; @@ -48,16 +42,9 @@ static guint signals[LAST_SIGNAL] = { 0 }; enum { PROP_0, - PROP_LOCAL_ADDRESS, PROP_REMOTE_URI, - PROP_PROXY_RESOLVER, - PROP_SSL_CREDS, - PROP_SSL_STRICT, PROP_SSL_FALLBACK, - PROP_ASYNC_CONTEXT, - PROP_USE_THREAD_CONTEXT, - PROP_TIMEOUT, - PROP_IDLE_TIMEOUT, + PROP_SOCKET_PROPERTIES, PROP_STATE, LAST_PROP @@ -82,10 +69,7 @@ soup_connection_finalize (GObject *object) g_clear_pointer (&priv->remote_uri, soup_uri_free); g_clear_pointer (&priv->proxy_uri, soup_uri_free); - g_clear_object (&priv->tlsdb); - g_clear_object (&priv->proxy_resolver); - g_clear_object (&priv->local_addr); - g_clear_pointer (&priv->async_context, g_main_context_unref); + g_clear_pointer (&priv->socket_props, soup_socket_properties_unref); G_OBJECT_CLASS (soup_connection_parent_class)->finalize (object); } @@ -113,9 +97,6 @@ soup_connection_set_property (GObject *object, guint prop_id, SoupConnectionPrivate *priv = SOUP_CONNECTION_GET_PRIVATE (object); switch (prop_id) { - case PROP_LOCAL_ADDRESS: - priv->local_addr = g_value_dup_object (value); - break; case PROP_REMOTE_URI: priv->remote_uri = g_value_dup_boxed (value); if (priv->remote_uri) @@ -123,33 +104,12 @@ soup_connection_set_property (GObject *object, guint prop_id, else priv->ssl = FALSE; break; - case PROP_PROXY_RESOLVER: - priv->proxy_resolver = g_value_dup_object (value); - break; - case PROP_SSL_CREDS: - if (priv->tlsdb) - g_object_unref (priv->tlsdb); - priv->tlsdb = g_value_dup_object (value); - break; - case PROP_SSL_STRICT: - priv->ssl_strict = g_value_get_boolean (value); break; case PROP_SSL_FALLBACK: priv->ssl_fallback = g_value_get_boolean (value); break; - case PROP_ASYNC_CONTEXT: - priv->async_context = g_value_get_pointer (value); - if (priv->async_context) - g_main_context_ref (priv->async_context); - break; - case PROP_USE_THREAD_CONTEXT: - priv->use_thread_context = g_value_get_boolean (value); - break; - case PROP_TIMEOUT: - priv->io_timeout = g_value_get_uint (value); - break; - case PROP_IDLE_TIMEOUT: - priv->idle_timeout = g_value_get_uint (value); + case PROP_SOCKET_PROPERTIES: + priv->socket_props = g_value_dup_boxed (value); break; case PROP_STATE: soup_connection_set_state (SOUP_CONNECTION (object), g_value_get_uint (value)); @@ -167,32 +127,14 @@ soup_connection_get_property (GObject *object, guint prop_id, SoupConnectionPrivate *priv = SOUP_CONNECTION_GET_PRIVATE (object); switch (prop_id) { - case PROP_LOCAL_ADDRESS: - g_value_set_object (value, priv->local_addr); - break; case PROP_REMOTE_URI: g_value_set_boxed (value, priv->remote_uri); break; - case PROP_SSL_CREDS: - g_value_set_object (value, priv->tlsdb); - break; - case PROP_SSL_STRICT: - g_value_set_boolean (value, priv->ssl_strict); - break; case PROP_SSL_FALLBACK: g_value_set_boolean (value, priv->ssl_fallback); break; - case PROP_ASYNC_CONTEXT: - g_value_set_pointer (value, priv->async_context ? g_main_context_ref (priv->async_context) : NULL); - break; - case PROP_USE_THREAD_CONTEXT: - g_value_set_boolean (value, priv->use_thread_context); - break; - case PROP_TIMEOUT: - g_value_set_uint (value, priv->io_timeout); - break; - case PROP_IDLE_TIMEOUT: - g_value_set_uint (value, priv->idle_timeout); + case PROP_SOCKET_PROPERTIES: + g_value_set_boxed (value, priv->socket_props); break; case PROP_STATE: g_value_set_enum (value, priv->state); @@ -238,13 +180,6 @@ soup_connection_class_init (SoupConnectionClass *connection_class) /* properties */ g_object_class_install_property ( - object_class, PROP_LOCAL_ADDRESS, - g_param_spec_object (SOUP_CONNECTION_LOCAL_ADDRESS, - "Local address", - "Address of local end of socket", - SOUP_TYPE_ADDRESS, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); - g_object_class_install_property ( object_class, PROP_REMOTE_URI, g_param_spec_boxed (SOUP_CONNECTION_REMOTE_URI, "Remote URI", @@ -252,27 +187,6 @@ soup_connection_class_init (SoupConnectionClass *connection_class) SOUP_TYPE_URI, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); g_object_class_install_property ( - object_class, PROP_PROXY_RESOLVER, - g_param_spec_object (SOUP_CONNECTION_PROXY_RESOLVER, - "Proxy resolver", - "GProxyResolver to use", - G_TYPE_PROXY_RESOLVER, - G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)); - g_object_class_install_property ( - object_class, PROP_SSL_CREDS, - g_param_spec_object (SOUP_CONNECTION_SSL_CREDENTIALS, - "SSL credentials", - "SSL credentials for this connection", - G_TYPE_TLS_DATABASE, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); - g_object_class_install_property ( - object_class, PROP_SSL_STRICT, - g_param_spec_boolean (SOUP_CONNECTION_SSL_STRICT, - "Strictly validate SSL certificates", - "Whether certificate errors should be considered a connection error", - TRUE, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); - g_object_class_install_property ( object_class, PROP_SSL_FALLBACK, g_param_spec_boolean (SOUP_CONNECTION_SSL_FALLBACK, "SSLv3 fallback", @@ -280,32 +194,12 @@ soup_connection_class_init (SoupConnectionClass *connection_class) FALSE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); g_object_class_install_property ( - object_class, PROP_ASYNC_CONTEXT, - g_param_spec_pointer (SOUP_CONNECTION_ASYNC_CONTEXT, - "Async GMainContext", - "GMainContext to dispatch this connection's async I/O in", - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); - g_object_class_install_property ( - object_class, PROP_USE_THREAD_CONTEXT, - g_param_spec_boolean (SOUP_CONNECTION_USE_THREAD_CONTEXT, - "Use thread context", - "Use g_main_context_get_thread_default", - FALSE, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); - g_object_class_install_property ( - object_class, PROP_TIMEOUT, - g_param_spec_uint (SOUP_CONNECTION_TIMEOUT, - "Timeout value", - "Value in seconds to timeout a blocking I/O", - 0, G_MAXUINT, 0, - G_PARAM_READWRITE)); - g_object_class_install_property ( - object_class, PROP_IDLE_TIMEOUT, - g_param_spec_uint (SOUP_CONNECTION_IDLE_TIMEOUT, - "Idle Timeout", - "Connection lifetime when idle", - 0, G_MAXUINT, 0, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + object_class, PROP_SOCKET_PROPERTIES, + g_param_spec_boxed (SOUP_CONNECTION_SOCKET_PROPERTIES, + "Socket properties", + "Socket properties", + SOUP_TYPE_SOCKET_PROPERTIES, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); g_object_class_install_property ( object_class, PROP_STATE, g_param_spec_enum (SOUP_CONNECTION_STATE, @@ -341,10 +235,10 @@ start_idle_timer (SoupConnection *conn) { SoupConnectionPrivate *priv = SOUP_CONNECTION_GET_PRIVATE (conn); - if (priv->idle_timeout > 0 && !priv->idle_timeout_src) { + if (priv->socket_props->idle_timeout > 0 && !priv->idle_timeout_src) { priv->idle_timeout_src = - soup_add_timeout (priv->async_context, - priv->idle_timeout * 1000, + soup_add_timeout (priv->socket_props->async_context, + priv->socket_props->idle_timeout * 1000, idle_timeout, conn); } } @@ -438,8 +332,7 @@ socket_connect_finished (GTask *task, SoupSocket *sock, GError *error) SoupConnection *conn = g_task_get_source_object (task); SoupConnectionPrivate *priv = SOUP_CONNECTION_GET_PRIVATE (conn); - if (priv->async_context && !priv->use_thread_context) - g_main_context_pop_thread_default (priv->async_context); + soup_socket_properties_pop_async_context (priv->socket_props); g_signal_handlers_disconnect_by_func (sock, G_CALLBACK (re_emit_socket_event), conn); @@ -532,23 +425,15 @@ soup_connection_connect_async (SoupConnection *conn, priv->socket = soup_socket_new (SOUP_SOCKET_REMOTE_ADDRESS, remote_addr, - SOUP_SOCKET_SSL_CREDENTIALS, priv->tlsdb, - SOUP_SOCKET_SSL_STRICT, priv->ssl_strict, SOUP_SOCKET_SSL_FALLBACK, priv->ssl_fallback, - SOUP_SOCKET_ASYNC_CONTEXT, priv->async_context, - SOUP_SOCKET_USE_THREAD_CONTEXT, priv->use_thread_context, - SOUP_SOCKET_PROXY_RESOLVER, priv->proxy_resolver, - SOUP_SOCKET_TIMEOUT, priv->io_timeout, - SOUP_SOCKET_CLEAN_DISPOSE, TRUE, - SOUP_SOCKET_LOCAL_ADDRESS, priv->local_addr, + SOUP_SOCKET_SOCKET_PROPERTIES, priv->socket_props, NULL); g_object_unref (remote_addr); g_signal_connect (priv->socket, "event", G_CALLBACK (re_emit_socket_event), conn); - if (priv->async_context && !priv->use_thread_context) - g_main_context_push_thread_default (priv->async_context); + soup_socket_properties_push_async_context (priv->socket_props); task = g_task_new (conn, cancellable, callback, user_data); soup_socket_connect_async_internal (priv->socket, cancellable, @@ -589,14 +474,9 @@ soup_connection_connect_sync (SoupConnection *conn, priv->socket = soup_socket_new (SOUP_SOCKET_REMOTE_ADDRESS, remote_addr, - SOUP_SOCKET_PROXY_RESOLVER, priv->proxy_resolver, - SOUP_SOCKET_SSL_CREDENTIALS, priv->tlsdb, - SOUP_SOCKET_SSL_STRICT, priv->ssl_strict, SOUP_SOCKET_SSL_FALLBACK, priv->ssl_fallback, + SOUP_SOCKET_SOCKET_PROPERTIES, priv->socket_props, SOUP_SOCKET_FLAG_NONBLOCKING, FALSE, - SOUP_SOCKET_TIMEOUT, priv->io_timeout, - SOUP_SOCKET_CLEAN_DISPOSE, TRUE, - SOUP_SOCKET_LOCAL_ADDRESS, priv->local_addr, NULL); g_object_unref (remote_addr); @@ -679,8 +559,7 @@ start_ssl_completed (GObject *object, GAsyncResult *result, gpointer user_data) SoupConnectionPrivate *priv = SOUP_CONNECTION_GET_PRIVATE (conn); GError *error = NULL; - if (priv->async_context && !priv->use_thread_context) - g_main_context_pop_thread_default (priv->async_context); + soup_socket_properties_pop_async_context (priv->socket_props); if (soup_socket_handshake_finish (priv->socket, result, &error)) { soup_connection_event (conn, G_SOCKET_CLIENT_TLS_HANDSHAKED, NULL); @@ -705,8 +584,7 @@ soup_connection_start_ssl_async (SoupConnection *conn, soup_connection_event (conn, G_SOCKET_CLIENT_TLS_HANDSHAKING, NULL); - if (priv->async_context && !priv->use_thread_context) - g_main_context_push_thread_default (priv->async_context); + soup_socket_properties_push_async_context (priv->socket_props); task = g_task_new (conn, cancellable, callback, user_data); soup_socket_handshake_async (priv->socket, priv->remote_uri->host, |