if we receive an HTTP/1.0 response to an HTTP/1.1 request, downgrade the
authorDan Winship <danw@src.gnome.org>
Wed, 10 Dec 2003 18:35:25 +0000 (18:35 +0000)
committerDan Winship <danw@src.gnome.org>
Wed, 10 Dec 2003 18:35:25 +0000 (18:35 +0000)
* libsoup/soup-message-client-io.c (parse_response_headers): if we
receive an HTTP/1.0 response to an HTTP/1.1 request, downgrade the
message's http_version so the keep-alive handling is correct.
Fixes a problem noticed almost simultaneously by Rodrigo and Joe.

* libsoup/soup-message.c (soup_message_restarted, etc): Add a
"restarted" signal as suggested by Joe.

* libsoup/soup-message-io.c (soup_message_io_finished): emit
either "restarted" or "finished" as appropriate

* libsoup/soup-session.c (soup_session_queue_message): Connect to
"restarted" and run the queue if a message gets restarted

* libsoup/soup-status.h: Remove a stray comma that gtk-doc doesn't
like.

ChangeLog
libsoup/soup-message-client-io.c
libsoup/soup-message-io.c
libsoup/soup-message.c
libsoup/soup-message.h
libsoup/soup-session.c
libsoup/soup-status.h

index 02f1a05..4ea0a28 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2003-12-10  Dan Winship  <danw@ximian.com>
+
+       * libsoup/soup-message-client-io.c (parse_response_headers): if we
+       receive an HTTP/1.0 response to an HTTP/1.1 request, downgrade the
+       message's http_version so the keep-alive handling is correct.
+       Fixes a problem noticed almost simultaneously by Rodrigo and Joe.
+
+       * libsoup/soup-message.c (soup_message_restarted, etc): Add a
+       "restarted" signal as suggested by Joe.
+
+       * libsoup/soup-message-io.c (soup_message_io_finished): emit
+       either "restarted" or "finished" as appropriate
+
+       * libsoup/soup-session.c (soup_session_queue_message): Connect to
+       "restarted" and run the queue if a message gets restarted
+
+       * libsoup/soup-status.h: Remove a stray comma that gtk-doc doesn't
+       like.
+
 2003-12-10  Tambet Ingo  <tambet@ximian.com>
 
        * configure.in: Use autoconfig to check for socklen_t ...
index ca5fdd7..8dd171a 100644 (file)
@@ -36,6 +36,9 @@ parse_response_headers (SoupMessage *req,
                                          (char **) &req->reason_phrase))
                return SOUP_STATUS_MALFORMED;
 
+       if (version < req->priv->http_version)
+               req->priv->http_version = version;
+
        meth_id   = soup_method_get_id (req->method);
        resp_hdrs = req->response_headers;
 
index 770c3c2..74c8c03 100644 (file)
@@ -107,7 +107,10 @@ soup_message_io_finished (SoupMessage *msg)
 {
        g_object_ref (msg);
        soup_message_io_cancel (msg);
-       soup_message_finished (msg);
+       if (SOUP_MESSAGE_IS_STARTING (msg))
+               soup_message_restarted (msg);
+       else
+               soup_message_finished (msg);
        g_object_unref (msg);
 }
 
index b06b0b6..5bdf885 100644 (file)
@@ -28,6 +28,7 @@ enum {
        GOT_CHUNK,
        GOT_BODY,
 
+       RESTARTED,
        FINISHED,
 
        LAST_SIGNAL
@@ -38,7 +39,7 @@ static guint signals[LAST_SIGNAL] = { 0 };
 static void got_headers (SoupMessage *req);
 static void got_chunk (SoupMessage *req);
 static void got_body (SoupMessage *req);
-static void finished (SoupMessage *req);
+static void stop_io (SoupMessage *req);
 static void free_chunks (SoupMessage *msg);
 
 static void
@@ -102,7 +103,8 @@ class_init (GObjectClass *object_class)
        message_class->got_headers  = got_headers;
        message_class->got_chunk    = got_chunk;
        message_class->got_body     = got_body;
-       message_class->finished     = finished;
+       message_class->restarted    = stop_io;
+       message_class->finished     = stop_io;
 
        /* virtual method override */
        object_class->finalize = finalize;
@@ -174,6 +176,14 @@ class_init (GObjectClass *object_class)
                              soup_marshal_NONE__NONE,
                              G_TYPE_NONE, 0);
 
+       signals[RESTARTED] =
+               g_signal_new ("restarted",
+                             G_OBJECT_CLASS_TYPE (object_class),
+                             G_SIGNAL_RUN_FIRST,
+                             G_STRUCT_OFFSET (SoupMessageClass, restarted),
+                             NULL, NULL,
+                             soup_marshal_NONE__NONE,
+                             G_TYPE_NONE, 0);
        signals[FINISHED] =
                g_signal_new ("finished",
                              G_OBJECT_CLASS_TYPE (object_class),
@@ -370,12 +380,18 @@ soup_message_got_body (SoupMessage *msg)
 }
 
 static void
-finished (SoupMessage *req)
+stop_io (SoupMessage *req)
 {
        soup_message_io_cancel (req);
 }
 
 void
+soup_message_restarted (SoupMessage *msg)
+{
+       g_signal_emit (msg, signals[RESTARTED], 0);
+}
+
+void
 soup_message_finished (SoupMessage *msg)
 {
        g_signal_emit (msg, signals[FINISHED], 0);
index e576b12..d030a47 100644 (file)
@@ -77,6 +77,7 @@ typedef struct {
        void     (*got_headers)         (SoupMessage *msg);
        void     (*got_chunk)           (SoupMessage *msg);
        void     (*got_body)            (SoupMessage *msg);
+       void     (*restarted)           (SoupMessage *msg);
        void     (*finished)            (SoupMessage *msg);
 } SoupMessageClass;
 
@@ -250,7 +251,7 @@ void           soup_message_send_request        (SoupMessage       *req,
                                                 gboolean           via_proxy);
 void           soup_message_read_request        (SoupMessage       *req,
                                                 SoupSocket        *sock);
-void           soup_message_io_cancel           (SoupMessage       *msg);;
+void           soup_message_io_cancel           (SoupMessage       *msg);
 void           soup_message_io_pause            (SoupMessage       *msg);
 void           soup_message_io_unpause          (SoupMessage       *msg);
 
@@ -263,6 +264,7 @@ void soup_message_got_informational   (SoupMessage *msg);
 void soup_message_got_headers         (SoupMessage *msg);
 void soup_message_got_chunk           (SoupMessage *msg);
 void soup_message_got_body            (SoupMessage *msg);
+void soup_message_restarted           (SoupMessage *msg);
 void soup_message_finished            (SoupMessage *msg);
 
 #endif /*SOUP_MESSAGE_H*/
index abb756e..98a92e3 100644 (file)
@@ -639,10 +639,15 @@ redirect_handler (SoupMessage *msg, gpointer user_data)
 }
 
 static void
+request_restarted (SoupMessage *req, gpointer session)
+{
+       run_queue (session, FALSE);
+}
+
+static void
 request_finished (SoupMessage *req, gpointer user_data)
 {
-       if (!SOUP_MESSAGE_IS_STARTING (req))
-               req->status = SOUP_MESSAGE_STATUS_FINISHED;
+       req->status = SOUP_MESSAGE_STATUS_FINISHED;
 }
 
 static void
@@ -935,6 +940,9 @@ soup_session_queue_message (SoupSession *session, SoupMessage *req,
        g_return_if_fail (SOUP_IS_SESSION (session));
        g_return_if_fail (SOUP_IS_MESSAGE (req));
 
+       g_signal_connect (req, "restarted",
+                         G_CALLBACK (request_restarted), session);
+
        g_signal_connect (req, "finished",
                          G_CALLBACK (request_finished), session);
        if (callback) {
index f25c9ac..fd8f984 100644 (file)
@@ -14,7 +14,7 @@ typedef enum {
        SOUP_STATUS_CLASS_SUCCESS,
        SOUP_STATUS_CLASS_REDIRECT,
        SOUP_STATUS_CLASS_CLIENT_ERROR,
-       SOUP_STATUS_CLASS_SERVER_ERROR,
+       SOUP_STATUS_CLASS_SERVER_ERROR
 } SoupStatusClass;
 
 #define SOUP_STATUS_IS_TRANSPORT_ERROR(x) ((x) >  0   && (x) < 100)