From: Dan Winship Date: Sun, 3 Feb 2008 03:13:14 +0000 (+0000) Subject: fix default connections-per-host again; it was defined in two places. Add X-Git-Tag: LIBSOUP_2_3_2~12 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ee50d699e4daf740ed9da280efdec563f19996f5;p=platform%2Fupstream%2Flibsoup.git fix default connections-per-host again; it was defined in two places. Add * 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 --- diff --git a/ChangeLog b/ChangeLog index fbda55a..638360e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,17 @@ 2008-02-02 Dan Winship + * 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 + * 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 diff --git a/libsoup/soup-server.c b/libsoup/soup-server.c index d3b0be4..75d0227 100644 --- a/libsoup/soup-server.c +++ b/libsoup/soup-server.c @@ -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); diff --git a/libsoup/soup-server.h b/libsoup/soup-server.h index e9e426c..9a69270 100644 --- a/libsoup/soup-server.h +++ b/libsoup/soup-server.h @@ -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; diff --git a/libsoup/soup-session.c b/libsoup/soup-session.c index a8ed1c4..2a36dfa 100644 --- a/libsoup/soup-session.c +++ b/libsoup/soup-session.c @@ -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)); diff --git a/libsoup/soup-session.h b/libsoup/soup-session.h index e4c05ae..a519953 100644 --- a/libsoup/soup-session.h +++ b/libsoup/soup-session.h @@ -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); diff --git a/tests/get.c b/tests/get.c index fdb3ca1..2c3cfba 100644 --- a/tests/get.c +++ b/tests/get.c @@ -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); } diff --git a/tests/simple-httpd.c b/tests/simple-httpd.c index f0c568b..bacd6d3 100644 --- a/tests/simple-httpd.c +++ b/tests/simple-httpd.c @@ -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);