From 47e18f7f047259cd7fefae04e6673ed3026731a3 Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Wed, 10 Dec 2003 18:35:25 +0000 Subject: [PATCH] if we receive an HTTP/1.0 response to an HTTP/1.1 request, downgrade the * 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 | 19 +++++++++++++++++++ libsoup/soup-message-client-io.c | 3 +++ libsoup/soup-message-io.c | 5 ++++- libsoup/soup-message.c | 22 +++++++++++++++++++--- libsoup/soup-message.h | 4 +++- libsoup/soup-session.c | 12 ++++++++++-- libsoup/soup-status.h | 2 +- 7 files changed, 59 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 02f1a05..4ea0a28 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,22 @@ +2003-12-10 Dan Winship + + * 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 * configure.in: Use autoconfig to check for socklen_t ... diff --git a/libsoup/soup-message-client-io.c b/libsoup/soup-message-client-io.c index ca5fdd7..8dd171a 100644 --- a/libsoup/soup-message-client-io.c +++ b/libsoup/soup-message-client-io.c @@ -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; diff --git a/libsoup/soup-message-io.c b/libsoup/soup-message-io.c index 770c3c2..74c8c03 100644 --- a/libsoup/soup-message-io.c +++ b/libsoup/soup-message-io.c @@ -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); } diff --git a/libsoup/soup-message.c b/libsoup/soup-message.c index b06b0b6..5bdf885 100644 --- a/libsoup/soup-message.c +++ b/libsoup/soup-message.c @@ -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); diff --git a/libsoup/soup-message.h b/libsoup/soup-message.h index e576b12..d030a47 100644 --- a/libsoup/soup-message.h +++ b/libsoup/soup-message.h @@ -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*/ diff --git a/libsoup/soup-session.c b/libsoup/soup-session.c index abb756e..98a92e3 100644 --- a/libsoup/soup-session.c +++ b/libsoup/soup-session.c @@ -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) { diff --git a/libsoup/soup-status.h b/libsoup/soup-status.h index f25c9ac..fd8f984 100644 --- a/libsoup/soup-status.h +++ b/libsoup/soup-status.h @@ -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) -- 2.7.4