SoupSession: Do not actually send a request if it was cancelled before.
authorRaphael Kubo da Costa <kubo@profusion.mobi>
Tue, 17 Jan 2012 14:30:48 +0000 (12:30 -0200)
committerDan Winship <danw@gnome.org>
Wed, 18 Jan 2012 14:37:08 +0000 (09:37 -0500)
soup_session_cancel_message() may have been called in a REQUEST_STARTED
callback, so it is safer to make sure that
soup_connection_send_request() is called only if that is not the case.

https://bugzilla.gnome.org/show_bug.cgi?id=668098

libsoup/soup-session-async.c
libsoup/soup-session-sync.c
libsoup/soup-session.c
tests/misc-test.c

index e872102..9baa78e 100644 (file)
@@ -285,6 +285,7 @@ tunnel_message_completed (SoupMessage *msg, gpointer user_data)
        if (item->state == SOUP_MESSAGE_RESTARTING) {
                soup_message_restarted (msg);
                if (item->conn) {
+                       item->state = SOUP_MESSAGE_RUNNING;
                        soup_session_send_queue_item (session, item, tunnel_message_completed);
                        return;
                }
index c54975c..1a919c7 100644 (file)
@@ -156,8 +156,8 @@ tunnel_connect (SoupSession *session, SoupMessageQueueItem *related)
                status = item->msg->status_code;
                if (item->state == SOUP_MESSAGE_RESTARTING &&
                    soup_message_io_in_progress (item->msg)) {
-                       item->state = SOUP_MESSAGE_STARTING;
                        soup_message_restarted (item->msg);
+                       item->state = SOUP_MESSAGE_RUNNING;
                } else {
                        if (item->state == SOUP_MESSAGE_RESTARTING)
                                status = SOUP_STATUS_TRY_AGAIN;
index eb5dd6e..79ed51d 100644 (file)
@@ -1723,7 +1723,8 @@ soup_session_send_queue_item (SoupSession *session,
 
        g_signal_emit (session, signals[REQUEST_STARTED], 0,
                       item->msg, soup_connection_get_socket (item->conn));
-       soup_connection_send_request (item->conn, item, completion_cb, item);
+       if (item->state == SOUP_MESSAGE_RUNNING)
+               soup_connection_send_request (item->conn, item, completion_cb, item);
 }
 
 gboolean
@@ -1844,6 +1845,7 @@ soup_session_make_connect_message (SoupSession    *session,
        item = soup_message_queue_lookup (priv->queue, msg);
        soup_message_queue_item_set_connection (item, conn);
        g_object_unref (msg);
+       item->state = SOUP_MESSAGE_RUNNING;
 
        g_signal_emit (session, signals[TUNNELING], 0, conn);
        return item;
index a8ddc21..358031d 100644 (file)
@@ -591,6 +591,12 @@ ea_connection_created (SoupSession *session, GObject *conn, gpointer user_data)
 }
 
 static void
+ea_request_started (SoupSession *session, SoupMessage *msg, SoupSocket *socket, gpointer user_data)
+{
+       soup_session_cancel_message (session, msg, SOUP_STATUS_CANCELLED);
+}
+
+static void
 do_early_abort_test (void)
 {
        SoupSession *session;
@@ -633,6 +639,26 @@ do_early_abort_test (void)
                g_main_context_iteration (context, FALSE);
 
        soup_test_session_abort_unref (session);
+
+       session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC, NULL);
+       msg = soup_message_new_from_uri ("GET", base_uri);
+
+       g_signal_connect (session, "request-started",
+                         G_CALLBACK (ea_request_started), NULL);
+       soup_session_send_message (session, msg);
+       debug_printf (2, "  Message 3 completed\n");
+
+       if (msg->status_code != SOUP_STATUS_CANCELLED) {
+               debug_printf (1, "    Unexpected response: %d %s\n",
+                             msg->status_code, msg->reason_phrase);
+               errors++;
+       }
+       g_object_unref (msg);
+
+       while (g_main_context_pending (context))
+               g_main_context_iteration (context, FALSE);
+
+       soup_test_session_abort_unref (session);
 }
 
 static void