libsoup r1108 - in trunk: . libsoup tests



Author: danw
Date: Fri Mar 14 23:09:43 2008
New Revision: 1108
URL: http://svn.gnome.org/viewvc/libsoup?rev=1108&view=rev

Log:
	* libsoup/soup-message-private.h (SoupMessagePrivate): add
	an orig_http_version field.

	* libsoup/soup-message.c (soup_message_init): initialize
	orig_http_version.
	(soup_message_set_http_version): If called before the status code
	is received, set orig_http_version too.
	(soup_message_cleanup_response): Restore orig_http_version, so
	that we don't send an HTTP/1.0 request in response to an HTTP/1.0
	redirect. #521848, Tommi Komulainen.

	* libsoup/soup-message-server-io.c (get_response_headers):
	actually output "HTTP/1.0", not "HTTP/1.1", if the message's http
	version is 1.0.

	* tests/redirect-test.c (server_callback): Add a regression test;
	set http_version to 1.0 when returning a redirect, but require it
	to be 1.1 when processing the following request


Modified:
   trunk/ChangeLog
   trunk/libsoup/soup-message-private.h
   trunk/libsoup/soup-message-server-io.c
   trunk/libsoup/soup-message.c
   trunk/tests/redirect-test.c

Modified: trunk/libsoup/soup-message-private.h
==============================================================================
--- trunk/libsoup/soup-message-private.h	(original)
+++ trunk/libsoup/soup-message-private.h	Fri Mar 14 23:09:43 2008
@@ -28,7 +28,7 @@
 
 	guint              msg_flags;
 
-	SoupHTTPVersion    http_version;
+	SoupHTTPVersion    http_version, orig_http_version;
 
 	SoupURI           *uri;
 

Modified: trunk/libsoup/soup-message-server-io.c
==============================================================================
--- trunk/libsoup/soup-message-server-io.c	(original)
+++ trunk/libsoup/soup-message-server-io.c	Fri Mar 14 23:09:43 2008
@@ -100,7 +100,8 @@
 	SoupMessageHeadersIter iter;
 	const char *name, *value;
 
-	g_string_append_printf (headers, "HTTP/1.1 %d %s\r\n",
+	g_string_append_printf (headers, "HTTP/1.%c %d %s\r\n",
+				soup_message_get_http_version (msg) == SOUP_HTTP_1_0 ? '0' : '1',
 				msg->status_code, msg->reason_phrase);
 
 	claimed_encoding = soup_message_headers_get_encoding (msg->response_headers);

Modified: trunk/libsoup/soup-message.c
==============================================================================
--- trunk/libsoup/soup-message.c	(original)
+++ trunk/libsoup/soup-message.c	Fri Mar 14 23:09:43 2008
@@ -118,7 +118,7 @@
 	SoupMessagePrivate *priv = SOUP_MESSAGE_GET_PRIVATE (msg);
 
 	priv->io_status = SOUP_MESSAGE_IO_STATUS_IDLE;
-	priv->http_version = SOUP_HTTP_1_1;
+	priv->http_version = priv->orig_http_version = SOUP_HTTP_1_1;
 
 	msg->request_body = soup_message_body_new ();
 	msg->request_headers = soup_message_headers_new (SOUP_MESSAGE_HEADERS_REQUEST);
@@ -1032,6 +1032,8 @@
 void
 soup_message_cleanup_response (SoupMessage *req)
 {
+	SoupMessagePrivate *priv = SOUP_MESSAGE_GET_PRIVATE (req);
+
 	soup_message_body_truncate (req->response_body);
 	soup_message_headers_clear (req->response_headers);
 
@@ -1040,8 +1042,11 @@
 		g_free ((char *) req->reason_phrase);
 		req->reason_phrase = NULL;
 	}
+	priv->http_version = priv->orig_http_version;
+
 	g_object_notify (G_OBJECT (req), SOUP_MESSAGE_STATUS_CODE);
 	g_object_notify (G_OBJECT (req), SOUP_MESSAGE_REASON_PHRASE);
+	g_object_notify (G_OBJECT (req), SOUP_MESSAGE_HTTP_VERSION);
 }
 
 /**
@@ -1110,9 +1115,14 @@
 void
 soup_message_set_http_version (SoupMessage *msg, SoupHTTPVersion version)
 {
+	SoupMessagePrivate *priv;
+
 	g_return_if_fail (SOUP_IS_MESSAGE (msg));
+	priv = SOUP_MESSAGE_GET_PRIVATE (msg);
 
-	SOUP_MESSAGE_GET_PRIVATE (msg)->http_version = version;
+	priv->http_version = version;
+	if (msg->status_code == SOUP_STATUS_NONE)
+		priv->orig_http_version = version;
 	g_object_notify (G_OBJECT (msg), SOUP_MESSAGE_HTTP_VERSION);
 }
 

Modified: trunk/tests/redirect-test.c
==============================================================================
--- trunk/tests/redirect-test.c	(original)
+++ trunk/tests/redirect-test.c	Fri Mar 14 23:09:43 2008
@@ -199,6 +199,14 @@
 			return;
 		}
 
+		/* Make sure that a HTTP/1.0 redirect doesn't cause an
+		 * HTTP/1.0 re-request. (#521848)
+		 */
+		if (soup_message_get_http_version (msg) == SOUP_HTTP_1_0) {
+			soup_message_set_status (msg, SOUP_STATUS_BAD_REQUEST);
+			return;
+		}
+
 		soup_message_set_status (msg, SOUP_STATUS_OK);
 		soup_message_set_response (msg, "text/plain",
 					   SOUP_MEMORY_STATIC,
@@ -213,6 +221,9 @@
 		return;
 	}
 
+	/* See above comment re bug 521848. */
+	soup_message_set_http_version (msg, SOUP_HTTP_1_0);
+
 	soup_message_set_status (msg, status_code);
 	if (*remainder) {
 		soup_message_headers_replace (msg->response_headers,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]