diff options
author | Carlos Garcia Campos <cgarcia@igalia.com> | 2021-02-23 12:52:56 +0100 |
---|---|---|
committer | Carlos Garcia Campos <cgarcia@igalia.com> | 2021-02-23 12:58:09 +0100 |
commit | 587e43cf50d672d91aa923eb6ac60a28f3ea3a2e (patch) | |
tree | 197d8644260fc669fd6412a90550d2c4da37caa6 | |
parent | bd6de90343839125bd07c43c97e1000deb0b40c3 (diff) | |
download | libsoup-587e43cf50d672d91aa923eb6ac60a28f3ea3a2e.tar.gz |
session: add public getters and setters for the SoupSession properties
Also make max-conns and max-conns-per-host construct only and ensure all
setters emit the GObject::notify signal when the value changes.
-rw-r--r-- | docs/reference/libsoup-3.0-sections.txt | 20 | ||||
-rw-r--r-- | examples/get.c | 9 | ||||
-rw-r--r-- | libsoup/soup-session.c | 611 | ||||
-rw-r--r-- | libsoup/soup-session.h | 71 | ||||
-rw-r--r-- | tests/connection-test.c | 8 | ||||
-rw-r--r-- | tests/session-test.c | 15 | ||||
-rw-r--r-- | tests/ssl-test.c | 9 | ||||
-rw-r--r-- | tests/test-utils.c | 4 |
8 files changed, 605 insertions, 142 deletions
diff --git a/docs/reference/libsoup-3.0-sections.txt b/docs/reference/libsoup-3.0-sections.txt index b8c55a65..b749d246 100644 --- a/docs/reference/libsoup-3.0-sections.txt +++ b/docs/reference/libsoup-3.0-sections.txt @@ -364,6 +364,26 @@ SoupSessionError soup_session_new soup_session_new_with_options <SUBSECTION> +soup_session_get_local_address +soup_session_get_max_conns +soup_session_get_max_conns_per_host +soup_session_set_proxy_resolver +soup_session_get_proxy_resolver +soup_session_set_tls_database +soup_session_get_tls_database +soup_session_set_tls_interaction +soup_session_get_tls_interaction +soup_session_set_timeout +soup_session_get_timeout +soup_session_set_idle_timeout +soup_session_get_idle_timeout +soup_session_set_user_agent +soup_session_get_user_agent +soup_session_set_accept_language +soup_session_get_accept_language +soup_session_set_accept_language_auto +soup_session_get_accept_language_auto +<SUBSECTION> soup_session_send soup_session_send_async soup_session_send_finish diff --git a/examples/get.c b/examples/get.c index ddb929ee..0357e67d 100644 --- a/examples/get.c +++ b/examples/get.c @@ -265,7 +265,7 @@ main (int argc, char **argv) exit (1); } - g_object_set (session, "tls-database", tls_db, NULL); + soup_session_set_tls_database (session, tls_db); g_object_unref (tls_db); } @@ -285,7 +285,8 @@ main (int argc, char **argv) exit (1); } interaction = _get_tls_cert_interaction_new (client_cert); - g_object_set (session, "tls-interaction", interaction, NULL); + soup_session_set_tls_interaction (session, G_TLS_INTERACTION (interaction)); + g_object_unref (interaction); } if (debug) { @@ -306,9 +307,7 @@ main (int argc, char **argv) } resolver = g_simple_proxy_resolver_new (proxy, NULL); - g_object_set (G_OBJECT (session), - "proxy-resolver", resolver, - NULL); + soup_session_set_proxy_resolver (session, resolver); g_uri_unref (proxy_uri); g_object_unref (resolver); } diff --git a/libsoup/soup-session.c b/libsoup/soup-session.c index d4fb5988..663d8345 100644 --- a/libsoup/soup-session.c +++ b/libsoup/soup-session.c @@ -327,55 +327,17 @@ ensure_socket_props (SoupSession *session) } static void -set_tlsdb (SoupSession *session, - GTlsDatabase *tlsdb) +socket_props_changed (SoupSession *session) { SoupSessionPrivate *priv = soup_session_get_instance_private (session); - priv->tlsdb_use_default = FALSE; - if (tlsdb == priv->tlsdb) - return; - - g_clear_object (&priv->tlsdb); - priv->tlsdb = tlsdb ? g_object_ref (tlsdb) : NULL; - g_object_notify (G_OBJECT (session), "tls-database"); -} - -static GTlsDatabase * -get_tlsdb (SoupSession *session) -{ - SoupSessionPrivate *priv = soup_session_get_instance_private (session); - - if (priv->tlsdb_use_default && !priv->tlsdb) - priv->tlsdb = g_tls_backend_get_default_database (g_tls_backend_get_default ()); - - return priv->tlsdb; -} - -static void -set_proxy_resolver (SoupSession *session, - GProxyResolver *g_resolver) -{ - SoupSessionPrivate *priv = soup_session_get_instance_private (session); - - priv->proxy_use_default = FALSE; - if (priv->proxy_resolver == g_resolver) - return; - - g_clear_object (&priv->proxy_resolver); - priv->proxy_resolver = g_resolver ? g_object_ref (g_resolver) : NULL; - g_object_notify (G_OBJECT (session), "proxy-resolver"); -} - -static GProxyResolver * -get_proxy_resolver (SoupSession *session) -{ - SoupSessionPrivate *priv = soup_session_get_instance_private (session); - - if (!priv->proxy_use_default) - return priv->proxy_resolver; - - return g_proxy_resolver_get_default (); + g_mutex_lock (&priv->conn_lock); + if (priv->socket_props) { + soup_socket_properties_unref (priv->socket_props); + priv->socket_props = NULL; + ensure_socket_props (session); + } + g_mutex_unlock (&priv->conn_lock); } static void @@ -384,17 +346,14 @@ soup_session_set_property (GObject *object, guint prop_id, { SoupSession *session = SOUP_SESSION (object); SoupSessionPrivate *priv = soup_session_get_instance_private (session); - const char *user_agent; - gboolean socket_props_changed = FALSE; switch (prop_id) { case PROP_LOCAL_ADDRESS: priv->local_addr = g_value_dup_object (value); - socket_props_changed = TRUE; + socket_props_changed (session); break; case PROP_PROXY_RESOLVER: - set_proxy_resolver (session, g_value_get_object (value)); - socket_props_changed = TRUE; + soup_session_set_proxy_resolver (session, g_value_get_object (value)); break; case PROP_MAX_CONNS: priv->max_conns = g_value_get_int (value); @@ -403,65 +362,30 @@ soup_session_set_property (GObject *object, guint prop_id, priv->max_conns_per_host = g_value_get_int (value); break; case PROP_TLS_DATABASE: - set_tlsdb (session, g_value_get_object (value)); - socket_props_changed = TRUE; + soup_session_set_tls_database (session, g_value_get_object (value)); break; case PROP_TLS_INTERACTION: - g_clear_object(&priv->tls_interaction); - priv->tls_interaction = g_value_dup_object (value); - socket_props_changed = TRUE; + soup_session_set_tls_interaction (session, g_value_get_object (value)); break; case PROP_TIMEOUT: - priv->io_timeout = g_value_get_uint (value); - socket_props_changed = TRUE; + soup_session_set_timeout (session, g_value_get_uint (value)); break; case PROP_USER_AGENT: - g_free (priv->user_agent); - user_agent = g_value_get_string (value); - if (!user_agent) - priv->user_agent = NULL; - else if (!*user_agent) { - priv->user_agent = - g_strdup (SOUP_SESSION_USER_AGENT_BASE); - } else if (g_str_has_suffix (user_agent, " ")) { - priv->user_agent = - g_strdup_printf ("%s%s", user_agent, - SOUP_SESSION_USER_AGENT_BASE); - } else - priv->user_agent = g_strdup (user_agent); + soup_session_set_user_agent (session, g_value_get_string (value)); break; case PROP_ACCEPT_LANGUAGE: - g_free (priv->accept_language); - priv->accept_language = g_strdup (g_value_get_string (value)); - priv->accept_language_auto = FALSE; + soup_session_set_accept_language (session, g_value_get_string (value)); break; case PROP_ACCEPT_LANGUAGE_AUTO: - priv->accept_language_auto = g_value_get_boolean (value); - if (priv->accept_language) { - g_free (priv->accept_language); - priv->accept_language = NULL; - } - - /* Get languages from system if needed */ - if (priv->accept_language_auto) - priv->accept_language = soup_get_accept_languages_from_system (); + soup_session_set_accept_language_auto (session, g_value_get_boolean (value)); break; case PROP_IDLE_TIMEOUT: - priv->idle_timeout = g_value_get_uint (value); - socket_props_changed = TRUE; + soup_session_set_idle_timeout (session, g_value_get_uint (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } - - g_mutex_lock (&priv->conn_lock); - if (priv->socket_props && socket_props_changed) { - soup_socket_properties_unref (priv->socket_props); - priv->socket_props = NULL; - ensure_socket_props (session); - } - g_mutex_unlock (&priv->conn_lock); } static void @@ -469,41 +393,40 @@ soup_session_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { SoupSession *session = SOUP_SESSION (object); - SoupSessionPrivate *priv = soup_session_get_instance_private (session); switch (prop_id) { case PROP_LOCAL_ADDRESS: - g_value_set_object (value, priv->local_addr); + g_value_set_object (value, soup_session_get_local_address (session)); break; case PROP_PROXY_RESOLVER: - g_value_set_object (value, get_proxy_resolver (session)); + g_value_set_object (value, soup_session_get_proxy_resolver (session)); break; case PROP_MAX_CONNS: - g_value_set_int (value, priv->max_conns); + g_value_set_int (value, soup_session_get_max_conns (session)); break; case PROP_MAX_CONNS_PER_HOST: - g_value_set_int (value, priv->max_conns_per_host); + g_value_set_int (value, soup_session_get_max_conns_per_host (session)); break; case PROP_TLS_DATABASE: - g_value_set_object (value, get_tlsdb (session)); + g_value_set_object (value, soup_session_get_tls_database (session)); break; case PROP_TLS_INTERACTION: - g_value_set_object (value, priv->tls_interaction); + g_value_set_object (value, soup_session_get_tls_interaction (session)); break; case PROP_TIMEOUT: - g_value_set_uint (value, priv->io_timeout); + g_value_set_uint (value, soup_session_get_timeout (session)); break; case PROP_USER_AGENT: - g_value_set_string (value, priv->user_agent); + g_value_set_string (value, soup_session_get_user_agent (session)); break; case PROP_ACCEPT_LANGUAGE: - g_value_set_string (value, priv->accept_language); + g_value_set_string (value, soup_session_get_accept_language (session)); break; case PROP_ACCEPT_LANGUAGE_AUTO: - g_value_set_boolean (value, priv->accept_language_auto); + g_value_set_boolean (value, soup_session_get_accept_language_auto (session)); break; case PROP_IDLE_TIMEOUT: - g_value_set_uint (value, priv->idle_timeout); + g_value_set_uint (value, soup_session_get_idle_timeout (session)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -550,6 +473,468 @@ soup_session_new_with_options (const char *optname1, return session; } +/** + * soup_session_get_local_address: + * @session: a #SoupSession + * + * Get the #GInetSocketAddress to use for the client side of connections in @session. + * + * Returns: (transfer none) (nullable): a #GInetSocketAddress or %NULL + */ +GInetSocketAddress * +soup_session_get_local_address (SoupSession *session) +{ + SoupSessionPrivate *priv; + + g_return_val_if_fail (SOUP_IS_SESSION (session), NULL); + + priv = soup_session_get_instance_private (session); + return priv->local_addr; +} + +/** + * soup_session_get_max_conns: + * @session: a #SoupSession + * + * Get the maximum number of connections that @session can open at once. + * + * Returns: the maximum number of connections + */ +guint +soup_session_get_max_conns (SoupSession *session) +{ + SoupSessionPrivate *priv; + + g_return_val_if_fail (SOUP_IS_SESSION (session), 0); + + priv = soup_session_get_instance_private (session); + return priv->max_conns; +} + +/** + * soup_session_get_max_conns_per_host: + * @session: a #SoupSession + * + * Get the maximum number of connections that @session can open at once to a given host. + * + * Returns: the maximum number of connections per host + */ +guint +soup_session_get_max_conns_per_host (SoupSession *session) +{ + SoupSessionPrivate *priv; + + g_return_val_if_fail (SOUP_IS_SESSION (session), 0); + + priv = soup_session_get_instance_private (session); + return priv->max_conns_per_host; +} + +/** + * soup_session_set_proxy_resolver: + * @session: a #SoupSession + * @proxy_resolver: (nullable): a #GProxyResolver or %NULL + * + * Set a #GProxyResolver to be used by @session on new connections. If @proxy_resolver + * is %NULL then no proxies will be used. See #SoupSession:proxy-resolver for more information. + */ +void +soup_session_set_proxy_resolver (SoupSession *session, + GProxyResolver *proxy_resolver) +{ + SoupSessionPrivate *priv; + + g_return_if_fail (SOUP_IS_SESSION (session)); + g_return_if_fail (proxy_resolver == NULL || G_IS_PROXY_RESOLVER (proxy_resolver)); + + priv = soup_session_get_instance_private (session); + priv->proxy_use_default = FALSE; + if (priv->proxy_resolver == proxy_resolver) + return; + + g_clear_object (&priv->proxy_resolver); + priv->proxy_resolver = proxy_resolver ? g_object_ref (proxy_resolver) : NULL; + socket_props_changed (session); + g_object_notify (G_OBJECT (session), "proxy-resolver"); +} + +/** + * soup_session_get_proxy_resolver: + * @session: a #SoupSession + * + * Get the #GProxyResolver currently used by @session. + * + * Returns: (transfer none) (nullable): a #GProxyResolver or %NULL if proxies + * are disabled in @session + */ +GProxyResolver * +soup_session_get_proxy_resolver (SoupSession *session) +{ + SoupSessionPrivate *priv; + + g_return_val_if_fail (SOUP_IS_SESSION (session), NULL); + + priv = soup_session_get_instance_private (session); + return !priv->proxy_use_default ? priv->proxy_resolver : g_proxy_resolver_get_default (); +} + +/** + * soup_session_set_tls_database: + * @session: a #SoupSession + * @tls_database: (nullable): a #GTlsDatabase or %NULL + * + * Set a #GTlsDatabase to be used by @session on new connections. If @tls_database + * is %NULL then certificate validation will always fail. See #SoupSession:tls-database + * for more information. + */ +void +soup_session_set_tls_database (SoupSession *session, + GTlsDatabase *tls_database) +{ + SoupSessionPrivate *priv; + + g_return_if_fail (SOUP_IS_SESSION (session)); + g_return_if_fail (tls_database == NULL || G_IS_TLS_DATABASE (tls_database)); + + priv = soup_session_get_instance_private (session); + priv->tlsdb_use_default = FALSE; + if (priv->tlsdb == tls_database) + return; + + g_clear_object (&priv->tlsdb); + priv->tlsdb = tls_database ? g_object_ref (tls_database) : NULL; + socket_props_changed (session); + g_object_notify (G_OBJECT (session), "tls-database"); +} + +/** + * soup_session_get_tls_database: + * @session: a #SoupSession + * + * Get the #GTlsDatabase currently used by @session. + * + * Returns: (transfer none) (nullable): a #GTlsDatabase or %NULL + */ +GTlsDatabase * +soup_session_get_tls_database (SoupSession *session) +{ + SoupSessionPrivate *priv; + + g_return_val_if_fail (SOUP_IS_SESSION (session), NULL); + + priv = soup_session_get_instance_private (session); + if (priv->tlsdb_use_default && !priv->tlsdb) + priv->tlsdb = g_tls_backend_get_default_database (g_tls_backend_get_default ()); + + return priv->tlsdb; +} + +/** + * soup_session_set_tls_interaction: + * @session: a #SoupSession + * @tls_interaction: (nullable): a #GTlsInteraction or %NULL + * + * Set a #GTlsInteraction to be used by @session on new connections. If @tls_interaction + * is %NULL then client certificate validation will always fail. See #SoupSession:tls-interaction + * for more information. + */ +void +soup_session_set_tls_interaction (SoupSession *session, + GTlsInteraction *tls_interaction) +{ + SoupSessionPrivate *priv; + + g_return_if_fail (SOUP_IS_SESSION (session)); + g_return_if_fail (tls_interaction == NULL || G_IS_TLS_INTERACTION (tls_interaction)); + + priv = soup_session_get_instance_private (session); + if (priv->tls_interaction == tls_interaction) + return; + + g_clear_object (&priv->tls_interaction); + priv->tls_interaction = tls_interaction ? g_object_ref (tls_interaction) : NULL; + socket_props_changed (session); + g_object_notify (G_OBJECT (session), "tls-interaction"); +} + +/** + * soup_session_get_tls_interaction: + * @session: a #SoupSession + * + * Get the #GTlsInteraction currently used by @session. + * + * Returns: (transfer none) (nullable): a #GTlsInteraction or %NULL + */ +GTlsInteraction * +soup_session_get_tls_interaction (SoupSession *session) +{ + SoupSessionPrivate *priv; + + g_return_val_if_fail (SOUP_IS_SESSION (session), NULL); + + priv = soup_session_get_instance_private (session); + return priv->tls_interaction; +} + +/** + * soup_session_set_timeout: + * @session: a #SoupSession + * @timeout: a timeout in seconds + * + * Set a timeout in seconds for socket I/O operations to be used by @session + * on new connections. See #SoupSession:timeout for more information. + */ +void +soup_session_set_timeout (SoupSession *session, + guint timeout) +{ + SoupSessionPrivate *priv; + + g_return_if_fail (SOUP_IS_SESSION (session)); + + priv = soup_session_get_instance_private (session); + if (priv->io_timeout == timeout) + return; + + priv->io_timeout = timeout; + socket_props_changed (session); + g_object_notify (G_OBJECT (session), "timeout"); +} + +/** + * soup_session_get_timeout: + * @session: a #SoupSession + * + * Get the timeout in seconds for socket I/O operations currently used by @session. + * + * Returns: the timeout in seconds + */ +guint +soup_session_get_timeout (SoupSession *session) +{ + SoupSessionPrivate *priv; + + g_return_val_if_fail (SOUP_IS_SESSION (session), 0); + + priv = soup_session_get_instance_private (session); + return priv->io_timeout; +} + +/** + * soup_session_set_idle_timeout: + * @session: a #SoupSession + * @timeout: a timeout in seconds + * + * Set a timeout in seconds for idle connection lifetime to be used by @session + * on new connections. See #SoupSession:idle-timeout for more information. + */ +void +soup_session_set_idle_timeout (SoupSession *session, + guint timeout) +{ + SoupSessionPrivate *priv; + + g_return_if_fail (SOUP_IS_SESSION (session)); + + priv = soup_session_get_instance_private (session); + if (priv->idle_timeout == timeout) + return; + + priv->idle_timeout = timeout; + socket_props_changed (session); + g_object_notify (G_OBJECT (session), "idle-timeout"); +} + +/** + * soup_session_get_idle_timeout: + * @session: a #SoupSession + * + * Get the timeout in seconds for idle connection lifetime currently used by @session. + * + * Returns: the timeout in seconds + */ +guint +soup_session_get_idle_timeout (SoupSession *session) +{ + SoupSessionPrivate *priv; + + g_return_val_if_fail (SOUP_IS_SESSION (session), 0); + + priv = soup_session_get_instance_private (session); + return priv->idle_timeout; +} + +/** + * soup_session_set_user_agent: + * @session: a #SoupSession + * @user_agent: the user agent string + * + * Set the value to use for the "User-Agent" header on #SoupMessage<!-- -->s sent from @session. + * If @user_agent has trailing whitespace, @session will append its own product token + * (eg, "<literal>libsoup/3.0.0</literal>") to the end of the header for you. + * If @user_agent is %NULL then no "User-Agent" will be included in requests. See #SoupSession:user-agent + * for more information. + */ +void +soup_session_set_user_agent (SoupSession *session, + const char *user_agent) +{ + SoupSessionPrivate *priv; + + g_return_if_fail (SOUP_IS_SESSION (session)); + + priv = soup_session_get_instance_private (session); + if (priv->user_agent == NULL && user_agent == NULL) + return; + + if (user_agent == NULL) { + g_free (priv->user_agent); + priv->user_agent = NULL; + } else if (!*user_agent) { + if (g_strcmp0 (priv->user_agent, SOUP_SESSION_USER_AGENT_BASE) == 0) + return; + g_free (priv->user_agent); + priv->user_agent = g_strdup (SOUP_SESSION_USER_AGENT_BASE); + } else if (g_str_has_suffix (user_agent, " ")) { + char *user_agent_to_set; + + user_agent_to_set = g_strdup_printf ("%s%s", user_agent, SOUP_SESSION_USER_AGENT_BASE); + if (g_strcmp0 (priv->user_agent, user_agent_to_set) == 0) { + g_free (user_agent_to_set); + return; + } + priv->user_agent = user_agent_to_set; + } else { + if (g_strcmp0 (priv->user_agent, user_agent) == 0) + return; + g_free (priv->user_agent); + priv->user_agent = g_strdup (user_agent); + } + + g_object_notify (G_OBJECT (session), "user-agent"); +} + +/** + * soup_session_get_user_agent: + * @session: a #SoupSession + * + * Get the value used by @session for the "User-Agent" header on new requests. + * + * Returns: (transfer none) (nullable): the user agent string or %NULL + */ +const char * +soup_session_get_user_agent (SoupSession *session) +{ + SoupSessionPrivate *priv; + + g_return_val_if_fail (SOUP_IS_SESSION (session), NULL); + + priv = soup_session_get_instance_private (session); + return priv->user_agent; +} + +/** + * soup_session_set_accept_language: + * @session: a #SoupSession + * @accept_language: the languages string + * + * Set the value to use for the "Accept-Language" header on #SoupMessage<!-- -->s sent from @session. + * If @accept_language is %NULL then no "Accept-Language" will be included in requests. See #SoupSession:accept-language + * for more information. + */ +void +soup_session_set_accept_language (SoupSession *session, + const char *accept_language) +{ + SoupSessionPrivate *priv; + + g_return_if_fail (SOUP_IS_SESSION (session)); + + priv = soup_session_get_instance_private (session); + if (g_strcmp0 (priv->accept_language, accept_language) == 0) + return; + + g_clear_pointer (&priv->accept_language, g_free); + priv->accept_language = accept_language ? g_strdup (accept_language) : NULL; + priv->accept_language_auto = FALSE; + + g_object_freeze_notify (G_OBJECT (session)); + g_object_notify (G_OBJECT (session), "accept-language"); + g_object_notify (G_OBJECT (session), "accept-language-auto"); + g_object_thaw_notify (G_OBJECT (session)); +} + +/** + * soup_session_get_accept_language: + * @session: a #SoupSession + * + * Get the value used by @session for the "Accept-Language" header on new requests. + * + * Returns: (transfer none) (nullable): the accept language string or %NULL + */ +const char * +soup_session_get_accept_language (SoupSession *session) +{ + SoupSessionPrivate *priv; + + g_return_val_if_fail (SOUP_IS_SESSION (session), NULL); + + priv = soup_session_get_instance_private (session); + return priv->accept_language; +} + +/** + * soup_session_set_accept_language_auto: + * @session: a #SoupSession + * @accept_language_auto: the value to set + * + * Set whether @session will automatically set the "Accept-Language" header on requests using + * a value generated from system languages based on g_get_language_names(). See #SoupSession:accept-language-auto + * for more information. + */ +void +soup_session_set_accept_language_auto (SoupSession *session, + gboolean accept_language_auto) +{ + SoupSessionPrivate *priv; + + g_return_if_fail (SOUP_IS_SESSION (session)); + + priv = soup_session_get_instance_private (session); + if (priv->accept_language_auto == accept_language_auto) + return; + + priv->accept_language_auto = accept_language_auto; + + g_clear_pointer (&priv->accept_language, g_free); + if (priv->accept_language_auto) + priv->accept_language = soup_get_accept_languages_from_system (); + + g_object_freeze_notify (G_OBJECT (session)); + g_object_notify (G_OBJECT (session), "accept-language"); + g_object_notify (G_OBJECT (session), "accept-language-auto"); + g_object_thaw_notify (G_OBJECT (session)); +} + +/** + * soup_session_get_accept_language_auto: + * @session: a #SoupSession + * + * Get whether @session automatically sets the "Accept-Language" header on new requests. + * + * Returns: %TRUE if @session sets "Accept-Language" header automatically, or %FALSE otherwise. + */ +gboolean +soup_session_get_accept_language_auto (SoupSession *session) +{ + SoupSessionPrivate *priv; + + g_return_val_if_fail (SOUP_IS_SESSION (session), FALSE); + + priv = soup_session_get_instance_private (session); + return priv->accept_language_auto; +} + /* Hosts */ /* Note that we can't use soup_uri_host_hash() and soup_uri_host_equal() @@ -2174,6 +2559,11 @@ soup_session_class_init (SoupSessionClass *session_class) G_TYPE_PROXY_RESOLVER, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * SoupSession:max-conns: + * + * The maximum number of connections that the session can open at once. + */ g_object_class_install_property ( object_class, PROP_MAX_CONNS, g_param_spec_int ("max-conns", @@ -2183,7 +2573,14 @@ soup_session_class_init (SoupSessionClass *session_class) G_MAXINT, SOUP_SESSION_MAX_CONNS_DEFAULT, G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + + /** + * SoupSession:max-conns-per-host: + * + * The maximum number of connections that the session can open at once to a given host. + */ g_object_class_install_property ( object_class, PROP_MAX_CONNS_PER_HOST, g_param_spec_int ("max-conns-per-host", @@ -2193,6 +2590,7 @@ soup_session_class_init (SoupSessionClass *session_class) G_MAXINT, SOUP_SESSION_MAX_CONNS_PER_HOST_DEFAULT, G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); /** * SoupSession:idle-timeout: @@ -2303,8 +2701,7 @@ soup_session_class_init (SoupSessionClass *session_class) * If non-%NULL, the value to use for the "Accept-Language" header * on #SoupMessage<!-- -->s sent from this session. * - * Setting this will disable - * #SoupSession:accept-language-auto. + * Setting this will disable #SoupSession:accept-language-auto. * **/ g_object_class_install_property ( diff --git a/libsoup/soup-session.h b/libsoup/soup-session.h index 4d4717b5..069443b1 100644 --- a/libsoup/soup-session.h +++ b/libsoup/soup-session.h @@ -31,11 +31,76 @@ typedef enum { } SoupSessionError; SOUP_AVAILABLE_IN_ALL -SoupSession *soup_session_new (void); +SoupSession *soup_session_new (void); SOUP_AVAILABLE_IN_ALL -SoupSession *soup_session_new_with_options (const char *optname1, - ...) G_GNUC_NULL_TERMINATED; +SoupSession *soup_session_new_with_options (const char *optname1, + ...) G_GNUC_NULL_TERMINATED; + +SOUP_AVAILABLE_IN_ALL +GInetSocketAddress *soup_session_get_local_address (SoupSession *session); + +SOUP_AVAILABLE_IN_ALL +guint soup_session_get_max_conns (SoupSession *session); + +SOUP_AVAILABLE_IN_ALL +guint soup_session_get_max_conns_per_host (SoupSession *session); + +SOUP_AVAILABLE_IN_ALL +void soup_session_set_proxy_resolver (SoupSession *session, + GProxyResolver *proxy_resolver); + +SOUP_AVAILABLE_IN_ALL +GProxyResolver *soup_session_get_proxy_resolver (SoupSession *session); + +SOUP_AVAILABLE_IN_ALL +void soup_session_set_tls_database (SoupSession *session, + GTlsDatabase *tls_database); + +SOUP_AVAILABLE_IN_ALL +GTlsDatabase *soup_session_get_tls_database (SoupSession *session); + +SOUP_AVAILABLE_IN_ALL +void soup_session_set_tls_interaction (SoupSession *session, + GTlsInteraction *tls_interaction); + +SOUP_AVAILABLE_IN_ALL +GTlsInteraction *soup_session_get_tls_interaction (SoupSession *session); + +SOUP_AVAILABLE_IN_ALL +void soup_session_set_timeout (SoupSession *session, + guint timeout); + +SOUP_AVAILABLE_IN_ALL +guint soup_session_get_timeout (SoupSession *session); + +SOUP_AVAILABLE_IN_ALL +void soup_session_set_idle_timeout (SoupSession *session, + guint timeout); + +SOUP_AVAILABLE_IN_ALL +guint soup_session_get_idle_timeout (SoupSession *session); + +SOUP_AVAILABLE_IN_ALL +void soup_session_set_user_agent (SoupSession *session, + const char *user_agent); + +SOUP_AVAILABLE_IN_ALL +const char *soup_session_get_user_agent (SoupSession *session); + +SOUP_AVAILABLE_IN_ALL +void soup_session_set_accept_language (SoupSession *session, + const char *accept_language); + +SOUP_AVAILABLE_IN_ALL +const char *soup_session_get_accept_language (SoupSession *session); + +SOUP_AVAILABLE_IN_ALL +void soup_session_set_accept_language_auto (SoupSession *session, + gboolean accept_language_auto); + +SOUP_AVAILABLE_IN_ALL +gboolean soup_session_get_accept_language_auto (SoupSession *session); SOUP_AVAILABLE_IN_ALL void soup_session_abort (SoupSession *session); diff --git a/tests/connection-test.c b/tests/connection-test.c index 34981705..12359252 100644 --- a/tests/connection-test.c +++ b/tests/connection-test.c @@ -753,9 +753,7 @@ do_connection_state_test_for_session (SoupSession *session) debug_printf (1, " https -- SKIPPING\n"); resolver = g_simple_proxy_resolver_new (HTTP_PROXY, NULL); - g_object_set (G_OBJECT (session), - "proxy-resolver", resolver, - NULL); + soup_session_set_proxy_resolver (session, resolver); g_object_unref (resolver); debug_printf (1, " http with proxy\n"); @@ -892,9 +890,7 @@ do_connection_event_test_for_session (SoupSession *session) debug_printf (1, " https -- SKIPPING\n"); resolver = g_simple_proxy_resolver_new (HTTP_PROXY, NULL); - g_object_set (G_OBJECT (session), - "proxy-resolver", resolver, - NULL); + soup_session_set_proxy_resolver (session, resolver); g_object_unref (resolver); debug_printf (1, " http with proxy\n"); diff --git a/tests/session-test.c b/tests/session-test.c index dc503e73..32c318df 100644 --- a/tests/session-test.c +++ b/tests/session-test.c @@ -199,8 +199,7 @@ do_priority_tests (void) g_test_bug ("696277"); - session = soup_test_session_new (NULL); - g_object_set (session, "max-conns", 1, NULL); + session = soup_test_session_new ("max-conns", 1, NULL); expected_priorities[0] = SOUP_MESSAGE_PRIORITY_HIGH; expected_priorities[1] = SOUP_MESSAGE_PRIORITY_NORMAL; @@ -236,13 +235,8 @@ test_session_properties (const char *name, GProxyResolver *expected_proxy_resolver, GTlsDatabase *expected_tls_database) { - GProxyResolver *proxy_resolver = NULL; - GTlsDatabase *tlsdb = NULL; - - g_object_get (G_OBJECT (session), - "proxy-resolver", &proxy_resolver, - "tls-database", &tlsdb, - NULL); + GProxyResolver *proxy_resolver = soup_session_get_proxy_resolver (session); + GTlsDatabase *tlsdb = soup_session_get_tls_database (session); soup_test_assert (proxy_resolver == expected_proxy_resolver, "%s has %s proxy resolver", @@ -250,9 +244,6 @@ test_session_properties (const char *name, soup_test_assert (tlsdb == expected_tls_database, "%s has %s TLS database", name, tlsdb ? (expected_tls_database ? "wrong" : "a") : "no"); - - g_clear_object (&proxy_resolver); - g_clear_object (&tlsdb); } static void diff --git a/tests/ssl-test.c b/tests/ssl-test.c index 359d72d0..061954f9 100644 --- a/tests/ssl-test.c +++ b/tests/ssl-test.c @@ -48,9 +48,7 @@ do_strictness_test (gconstpointer data) GTlsDatabase *tlsdb; tlsdb = g_tls_backend_get_default_database (g_tls_backend_get_default ()); - g_object_set (G_OBJECT (session), - "tls-database", tlsdb, - NULL); + soup_session_set_tls_database (session, tlsdb); g_object_unref (tlsdb); } @@ -163,7 +161,7 @@ do_tls_interaction_test (gconstpointer data) SOUP_TEST_SKIP_IF_NO_TLS; session = soup_test_session_new (NULL); - g_object_get (session, "tls-database", &tls_db, NULL); + tls_db = soup_session_get_tls_database (session); g_signal_connect (server, "request-started", G_CALLBACK (server_request_started), @@ -184,7 +182,7 @@ do_tls_interaction_test (gconstpointer data) "certificate", g_object_ref (certificate), g_object_unref); - g_object_set (session, "tls-interaction", interaction, NULL); + soup_session_set_tls_interaction (session, interaction); g_object_unref (interaction); /* With a GTlsInteraction */ @@ -199,7 +197,6 @@ do_tls_interaction_test (gconstpointer data) g_signal_handlers_disconnect_by_data (server, tls_db); soup_test_session_abort_unref (session); - g_object_unref (tls_db); g_object_unref (certificate); } diff --git a/tests/test-utils.c b/tests/test-utils.c index 9308972f..accf79d1 100644 --- a/tests/test-utils.c +++ b/tests/test-utils.c @@ -281,9 +281,7 @@ soup_test_session_new (const char *propname, ...) g_assert_no_error (error); } - g_object_set (G_OBJECT (session), - "tls-database", tlsdb, - NULL); + soup_session_set_tls_database (session, tlsdb); g_clear_object (&tlsdb); } |