fix default connections-per-host again; it was defined in two places. Add
authorDan Winship <danw@src.gnome.org>
Sun, 3 Feb 2008 03:13:14 +0000 (03:13 +0000)
committerDan Winship <danw@src.gnome.org>
Sun, 3 Feb 2008 03:13:14 +0000 (03:13 +0000)
* libsoup/soup-session.c: fix default connections-per-host again;
it was defined in two places. Add SOUP_SESSION_USER_AGENT property
(setup_message): set the User-Agent request header on the request

* libsoup/soup-server.c: add SOUP_SERVER_SERVER_HEADER property
(start_request): set the Server response header on the request.

* tests/get.c:
* tests/simple-httpd.c: set the User-Agent/Server headers

svn path=/trunk/; revision=1071

ChangeLog
libsoup/soup-server.c
libsoup/soup-server.h
libsoup/soup-session.c
libsoup/soup-session.h
tests/get.c
tests/simple-httpd.c

index fbda55a..638360e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,17 @@
 2008-02-02  Dan Winship  <danw@gnome.org>
 
+       * libsoup/soup-session.c: fix default connections-per-host again;
+       it was defined in two places. Add SOUP_SESSION_USER_AGENT property
+       (setup_message): set the User-Agent request header on the request
+
+       * libsoup/soup-server.c: add SOUP_SERVER_SERVER_HEADER property
+       (start_request): set the Server response header on the request.
+
+       * tests/get.c:
+       * tests/simple-httpd.c: set the User-Agent/Server headers
+
+2008-02-02  Dan Winship  <danw@gnome.org>
+
        * libsoup/soup-headers.c (soup_headers_parse_request): if the
        request headers contain an unrecognized Expect: header, return
        SOUP_STATUS_EXPECTATION_FAILED. Also, process Connection headers
index d3b0be4..75d0227 100644 (file)
@@ -95,6 +95,8 @@ typedef struct {
        char              *ssl_cert_file, *ssl_key_file;
        SoupSSLCredentials *ssl_creds;
 
+       char              *server_header;
+
        GMainLoop         *loop;
 
        SoupSocket        *listen_sock;
@@ -110,6 +112,8 @@ typedef struct {
 } SoupServerPrivate;
 #define SOUP_SERVER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SOUP_TYPE_SERVER, SoupServerPrivate))
 
+#define SOUP_SERVER_SERVER_HEADER_BASE "libsoup/" PACKAGE_VERSION
+
 enum {
        PROP_0,
 
@@ -119,6 +123,7 @@ enum {
        PROP_SSL_KEY_FILE,
        PROP_ASYNC_CONTEXT,
        PROP_RAW_PATHS,
+       PROP_SERVER_HEADER,
 
        LAST_PROP
 };
@@ -161,6 +166,8 @@ finalize (GObject *object)
        if (priv->ssl_creds)
                soup_ssl_free_server_credentials (priv->ssl_creds);
 
+       g_free (priv->server_header);
+
        if (priv->listen_sock)
                g_object_unref (priv->listen_sock);
 
@@ -348,6 +355,14 @@ soup_server_class_init (SoupServerClass *server_class)
                                      "If %TRUE, percent-encoding in the Request-URI path will not be automatically decoded.",
                                      FALSE,
                                      G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+
+       g_object_class_install_property (
+               object_class, PROP_SERVER_HEADER,
+               g_param_spec_string (SOUP_SERVER_SERVER_HEADER,
+                                    "Server header",
+                                    "Server header",
+                                    NULL,
+                                    G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
 }
 
 static GObject *
@@ -406,6 +421,7 @@ set_property (GObject *object, guint prop_id,
              const GValue *value, GParamSpec *pspec)
 {
        SoupServerPrivate *priv = SOUP_SERVER_GET_PRIVATE (object);
+       const char *header;
 
        switch (prop_id) {
        case PROP_PORT:
@@ -434,6 +450,21 @@ set_property (GObject *object, guint prop_id,
        case PROP_RAW_PATHS:
                priv->raw_paths = g_value_get_boolean (value);
                break;
+       case PROP_SERVER_HEADER:
+               g_free (priv->server_header);
+               header = g_value_get_string (value);
+               if (!header)
+                       priv->server_header = NULL;
+               else if (!*header) {
+                       priv->server_header =
+                               g_strdup (SOUP_SERVER_SERVER_HEADER_BASE);
+               } else if (g_str_has_suffix (header, " ")) {
+                       priv->server_header =
+                               g_strdup_printf ("%s%s", header,
+                                                SOUP_SERVER_SERVER_HEADER_BASE);
+               } else
+                       priv->server_header = g_strdup (header);
+               break;
        default:
                break;
        }
@@ -464,6 +495,9 @@ get_property (GObject *object, guint prop_id,
        case PROP_RAW_PATHS:
                g_value_set_boolean (value, priv->raw_paths);
                break;
+       case PROP_SERVER_HEADER:
+               g_value_set_string (value, priv->server_header);
+               break;
        default:
                break;
        }
@@ -735,6 +769,7 @@ call_handler (SoupMessage *req, SoupClientContext *client)
 static void
 start_request (SoupServer *server, SoupClientContext *client)
 {
+       SoupServerPrivate *priv = SOUP_SERVER_GET_PRIVATE (server);
        SoupMessage *msg;
 
        soup_client_context_cleanup (client);
@@ -743,6 +778,10 @@ start_request (SoupServer *server, SoupClientContext *client)
        msg = g_object_new (SOUP_TYPE_MESSAGE, NULL);
         soup_message_headers_set_encoding (msg->response_headers,
                                            SOUP_ENCODING_CONTENT_LENGTH);
+       if (priv->server_header) {
+               soup_message_headers_append (msg->response_headers, "Server",
+                                            priv->server_header);
+       }
 
        g_signal_connect (msg, "got_headers", G_CALLBACK (got_headers), client);
        g_signal_connect (msg, "got_body", G_CALLBACK (call_handler), client);
index e9e426c..9a69270 100644 (file)
@@ -62,6 +62,7 @@ typedef void (*SoupServerCallback) (SoupServer        *server,
 #define SOUP_SERVER_SSL_KEY_FILE  "ssl-key-file"
 #define SOUP_SERVER_ASYNC_CONTEXT "async-context"
 #define SOUP_SERVER_RAW_PATHS     "raw-paths"
+#define SOUP_SERVER_SERVER_HEADER "server-header"
 
 SoupServer        *soup_server_new            (const char            *optname1,
                                               ...) G_GNUC_NULL_TERMINATED;
index a8ed1c4..2a36dfa 100644 (file)
@@ -55,6 +55,8 @@ typedef struct {
 
        SoupMessageQueue *queue;
 
+       char *user_agent;
+
        SoupAuthManager *auth_manager;
        SoupAuthManagerNTLM *ntlm_manager;
 
@@ -92,7 +94,9 @@ extern gboolean  soup_uri_host_equal (gconstpointer  v1,
 extern SoupURI  *soup_uri_copy_root  (SoupURI *uri);
 
 #define SOUP_SESSION_MAX_CONNS_DEFAULT 10
-#define SOUP_SESSION_MAX_CONNS_PER_HOST_DEFAULT 4
+#define SOUP_SESSION_MAX_CONNS_PER_HOST_DEFAULT 2
+
+#define SOUP_SESSION_USER_AGENT_BASE "libsoup/" PACKAGE_VERSION
 
 G_DEFINE_TYPE (SoupSession, soup_session, G_TYPE_OBJECT)
 
@@ -114,6 +118,7 @@ enum {
        PROP_SSL_CA_FILE,
        PROP_ASYNC_CONTEXT,
        PROP_TIMEOUT,
+       PROP_USER_AGENT,
 
        LAST_PROP
 };
@@ -296,7 +301,7 @@ soup_session_class_init (SoupSessionClass *session_class)
                                  "The maximum number of connections that the session can open at once",
                                  1,
                                  G_MAXINT,
-                                 10,
+                                 SOUP_SESSION_MAX_CONNS_DEFAULT,
                                  G_PARAM_READWRITE));
        g_object_class_install_property (
                object_class, PROP_MAX_CONNS_PER_HOST,
@@ -305,7 +310,7 @@ soup_session_class_init (SoupSessionClass *session_class)
                                  "The maximum number of connections that the session can open at once to a given host",
                                  1,
                                  G_MAXINT,
-                                 2,
+                                 SOUP_SESSION_MAX_CONNS_PER_HOST_DEFAULT,
                                  G_PARAM_READWRITE));
        g_object_class_install_property (
                object_class, PROP_USE_NTLM,
@@ -334,6 +339,13 @@ soup_session_class_init (SoupSessionClass *session_class)
                                   "Value in seconds to timeout a blocking I/O",
                                   0, G_MAXUINT, 0,
                                   G_PARAM_READWRITE));
+       g_object_class_install_property (
+               object_class, PROP_USER_AGENT,
+               g_param_spec_string (SOUP_SESSION_USER_AGENT,
+                                    "User-Agent string",
+                                    "User-Agent string",
+                                    NULL,
+                                    G_PARAM_READWRITE));
 }
 
 static gboolean
@@ -369,7 +381,7 @@ set_property (GObject *object, guint prop_id,
        SoupURI *uri;
        gboolean need_abort = FALSE;
        gboolean ca_file_changed = FALSE;
-       const char *new_ca_file;
+       const char *new_ca_file, *user_agent;
 
        switch (prop_id) {
        case PROP_PROXY_URI:
@@ -433,6 +445,21 @@ set_property (GObject *object, guint prop_id,
        case PROP_TIMEOUT:
                priv->timeout = 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);
+               break;
        default:
                break;
        }
@@ -467,6 +494,9 @@ get_property (GObject *object, guint prop_id,
        case PROP_TIMEOUT:
                g_value_set_uint (value, priv->timeout);
                break;
+       case PROP_USER_AGENT:
+               g_value_set_string (value, priv->user_agent);
+               break;
        default:
                break;
        }
@@ -626,6 +656,12 @@ connection_started_request (SoupConnection *conn, SoupMessage *msg,
                            gpointer data)
 {
        SoupSession *session = data;
+       SoupSessionPrivate *priv = SOUP_SESSION_GET_PRIVATE (session);
+
+       if (priv->user_agent) {
+               soup_message_headers_replace (msg->request_headers,
+                                             "User-Agent", priv->user_agent);
+       }
 
        g_signal_emit (session, signals[REQUEST_STARTED], 0,
                       msg, soup_connection_get_socket (conn));
index e4c05ae..a519953 100644 (file)
@@ -62,6 +62,7 @@ GType soup_session_get_type (void);
 #define SOUP_SESSION_SSL_CA_FILE        "ssl-ca-file"
 #define SOUP_SESSION_ASYNC_CONTEXT      "async-context"
 #define SOUP_SESSION_TIMEOUT           "timeout"
+#define SOUP_SESSION_USER_AGENT         "user-agent"
 
 GMainContext   *soup_session_get_async_context(SoupSession           *session);
 
index fdb3ca1..2c3cfba 100644 (file)
@@ -286,11 +286,13 @@ main (int argc, char **argv)
                session = soup_session_sync_new_with_options (
                        SOUP_SESSION_SSL_CA_FILE, cafile,
                        SOUP_SESSION_PROXY_URI, proxy,
+                       SOUP_SESSION_USER_AGENT, "get ",
                        NULL);
        } else {
                session = soup_session_async_new_with_options (
                        SOUP_SESSION_SSL_CA_FILE, cafile,
                        SOUP_SESSION_PROXY_URI, proxy,
+                       SOUP_SESSION_USER_AGENT, "get ",
                        NULL);
        }
 
index f0c568b..bacd6d3 100644 (file)
@@ -197,6 +197,7 @@ main (int argc, char **argv)
        }
 
        server = soup_server_new (SOUP_SERVER_PORT, port,
+                                 SOUP_SERVER_SERVER_HEADER, "simple-httpd ",
                                  NULL);
        if (!server) {
                fprintf (stderr, "Unable to bind to server port %d\n", port);