[libsoup] soup-message-server-io: fix processing of IPv6 HTTP/1.0 messages
- From: Dan Winship <danw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libsoup] soup-message-server-io: fix processing of IPv6 HTTP/1.0 messages
- Date: Tue, 14 Feb 2012 02:42:40 +0000 (UTC)
commit 1c3878284295d3d650a4b7af2d54d61b36b9668f
Author: Dan Winship <danw gnome org>
Date: Mon Feb 13 21:38:39 2012 -0500
soup-message-server-io: fix processing of IPv6 HTTP/1.0 messages
When receiving an HTTP/1.0 message with no Host header on an IPv6
interface, SoupServer would internally generate an invalid URL and
then return 400 Bad Request. Fix, and add a test for it.
https://bugzilla.gnome.org/show_bug.cgi?id=666399
libsoup/soup-message-server-io.c | 14 +++++-----
tests/misc-test.c | 51 ++++++++++++++++++++++++++++++++++++++
2 files changed, 58 insertions(+), 7 deletions(-)
---
diff --git a/libsoup/soup-message-server-io.c b/libsoup/soup-message-server-io.c
index 624fad6..8b07ebf 100644
--- a/libsoup/soup-message-server-io.c
+++ b/libsoup/soup-message-server-io.c
@@ -82,14 +82,14 @@ parse_request_headers (SoupMessage *msg, char *headers, guint headers_len,
} else if (priv->http_version == SOUP_HTTP_1_0) {
/* No Host header, no AbsoluteUri */
SoupAddress *addr = soup_socket_get_local_address (sock);
- const char *host = soup_address_get_physical (addr);
- url = g_strdup_printf ("%s://%s:%d%s",
- soup_socket_is_ssl (sock) ? "https" : "http",
- host, soup_address_get_port (addr),
- req_path);
- uri = soup_uri_new (url);
- g_free (url);
+ uri = soup_uri_new (NULL);
+ soup_uri_set_scheme (uri, soup_socket_is_ssl (sock) ?
+ SOUP_URI_SCHEME_HTTPS :
+ SOUP_URI_SCHEME_HTTP);
+ soup_uri_set_host (uri, soup_address_get_physical (addr));
+ soup_uri_set_port (uri, soup_address_get_port (addr));
+ soup_uri_set_path (uri, req_path);
} else
uri = NULL;
diff --git a/tests/misc-test.c b/tests/misc-test.c
index 358031d..321d41f 100644
--- a/tests/misc-test.c
+++ b/tests/misc-test.c
@@ -1222,6 +1222,56 @@ do_dot_dot_test (void)
soup_test_session_abort_unref (session);
}
+static void
+do_ipv6_test (void)
+{
+ SoupServer *ipv6_server;
+ SoupURI *ipv6_uri;
+ SoupAddress *ipv6_addr;
+ SoupSession *session;
+ SoupMessage *msg;
+
+ debug_printf (1, "\nIPv6 server test\n");
+
+ ipv6_addr = soup_address_new ("::1", SOUP_ADDRESS_ANY_PORT);
+ soup_address_resolve_sync (ipv6_addr, NULL);
+ ipv6_server = soup_server_new (SOUP_SERVER_INTERFACE, ipv6_addr,
+ NULL);
+ g_object_unref (ipv6_addr);
+ soup_server_add_handler (ipv6_server, NULL, server_callback, NULL, NULL);
+ soup_server_run_async (ipv6_server);
+
+ ipv6_uri = soup_uri_new ("http://[::1]/");
+ soup_uri_set_port (ipv6_uri, soup_server_get_port (ipv6_server));
+
+ session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC, NULL);
+
+ debug_printf (1, " HTTP/1.1\n");
+ msg = soup_message_new_from_uri ("GET", ipv6_uri);
+ soup_session_send_message (session, msg);
+ if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
+ debug_printf (1, " request failed: %d %s\n",
+ msg->status_code, msg->reason_phrase);
+ errors++;
+ }
+ g_object_unref (msg);
+
+ debug_printf (1, " HTTP/1.0\n");
+ msg = soup_message_new_from_uri ("GET", ipv6_uri);
+ soup_message_set_http_version (msg, SOUP_HTTP_1_0);
+ soup_session_send_message (session, msg);
+ if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
+ debug_printf (1, " request failed: %d %s\n",
+ msg->status_code, msg->reason_phrase);
+ errors++;
+ }
+ g_object_unref (msg);
+
+ soup_uri_free (ipv6_uri);
+ soup_test_session_abort_unref (session);
+ soup_test_server_quit_unref (ipv6_server);
+}
+
int
main (int argc, char **argv)
{
@@ -1260,6 +1310,7 @@ main (int argc, char **argv)
do_aliases_test ();
do_non_persistent_connection_test ();
do_dot_dot_test ();
+ do_ipv6_test ();
soup_uri_free (base_uri);
soup_uri_free (ssl_base_uri);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]