+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 ...
(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;
{
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);
}
GOT_CHUNK,
GOT_BODY,
+ RESTARTED,
FINISHED,
LAST_SIGNAL
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
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;
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),
}
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);
void (*got_headers) (SoupMessage *msg);
void (*got_chunk) (SoupMessage *msg);
void (*got_body) (SoupMessage *msg);
+ void (*restarted) (SoupMessage *msg);
void (*finished) (SoupMessage *msg);
} SoupMessageClass;
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);
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*/
}
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
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) {
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)