Provide a new 'accept-language' property for SoupSession
authorMario Sanchez Prada <msanchez@igalia.com>
Fri, 2 Oct 2009 10:33:02 +0000 (12:33 +0200)
committerDan Winship <danw@gnome.org>
Thu, 17 Dec 2009 09:31:53 +0000 (10:31 +0100)
This would allow to externally set a list of languages for the HTTP
"Accept-Language" header, compliant to rfc2616.

https://bugzilla.gnome.org/show_bug.cgi?id=597004

libsoup/soup-session.c
libsoup/soup-session.h

index b8d79a2..48f336e 100644 (file)
@@ -75,6 +75,7 @@ typedef struct {
        SoupMessageQueue *queue;
 
        char *user_agent;
+       char *accept_language;
 
        GSList *features;
        GHashTable *features_cache;
@@ -141,6 +142,7 @@ enum {
        PROP_ASYNC_CONTEXT,
        PROP_TIMEOUT,
        PROP_USER_AGENT,
+       PROP_ACCEPT_LANGUAGE,
        PROP_IDLE_TIMEOUT,
        PROP_ADD_FEATURE,
        PROP_ADD_FEATURE_BY_TYPE,
@@ -216,6 +218,7 @@ finalize (GObject *object)
        g_hash_table_destroy (priv->conns);
 
        g_free (priv->user_agent);
+       g_free (priv->accept_language);
 
        if (priv->ssl_creds)
                soup_ssl_free_client_credentials (priv->ssl_creds);
@@ -569,6 +572,26 @@ soup_session_class_init (SoupSessionClass *session_class)
                                     G_PARAM_READWRITE));
 
        /**
+        * SoupSession:accept-language:
+        *
+        * If non-%NULL, the value to use for the "Accept-Language" header
+        * on #SoupMessage<!-- -->s sent from this session.
+        *
+        **/
+       /**
+        * SOUP_SESSION_ACCEPT_LANGUAGE:
+        *
+        * Alias for the #SoupSession:accept-language property, qv.
+        **/
+       g_object_class_install_property (
+               object_class, PROP_ACCEPT_LANGUAGE,
+               g_param_spec_string (SOUP_SESSION_ACCEPT_LANGUAGE,
+                                    "Accept-Language string",
+                                    "Accept-Language string",
+                                    NULL,
+                                    G_PARAM_READWRITE));
+
+       /**
         * SoupSession:add-feature:
         *
         * Add a feature object to the session. (Shortcut for calling
@@ -730,6 +753,10 @@ set_property (GObject *object, guint prop_id,
                } else
                        priv->user_agent = g_strdup (user_agent);
                break;
+       case PROP_ACCEPT_LANGUAGE:
+               g_free (priv->accept_language);
+               priv->accept_language = g_strdup (g_value_get_string (value));
+               break;
        case PROP_IDLE_TIMEOUT:
                priv->idle_timeout = g_value_get_uint (value);
                break;
@@ -793,6 +820,9 @@ get_property (GObject *object, guint prop_id,
        case PROP_USER_AGENT:
                g_value_set_string (value, priv->user_agent);
                break;
+       case PROP_ACCEPT_LANGUAGE:
+               g_value_set_string (value, priv->accept_language);
+               break;
        case PROP_IDLE_TIMEOUT:
                g_value_set_uint (value, priv->idle_timeout);
                break;
@@ -991,6 +1021,12 @@ soup_session_send_queue_item (SoupSession *session,
                                              "User-Agent", priv->user_agent);
        }
 
+       if (priv->accept_language) {
+               soup_message_headers_replace (item->msg->request_headers,
+                                             "Accept-Language",
+                                             priv->accept_language);
+       }
+
        g_signal_emit (session, signals[REQUEST_STARTED], 0,
                       item->msg, soup_connection_get_socket (conn));
        soup_connection_send_request (conn, item->msg);
index 6080008..c7873e7 100644 (file)
@@ -66,6 +66,7 @@ GType soup_session_get_type (void);
 #define SOUP_SESSION_ASYNC_CONTEXT      "async-context"
 #define SOUP_SESSION_TIMEOUT            "timeout"
 #define SOUP_SESSION_USER_AGENT         "user-agent"
+#define SOUP_SESSION_ACCEPT_LANGUAGE    "accept-language"
 #define SOUP_SESSION_IDLE_TIMEOUT       "idle-timeout"
 #define SOUP_SESSION_ADD_FEATURE            "add-feature"
 #define SOUP_SESSION_ADD_FEATURE_BY_TYPE    "add-feature-by-type"