summaryrefslogtreecommitdiff
path: root/libsoup/soup-session.c
diff options
context:
space:
mode:
Diffstat (limited to 'libsoup/soup-session.c')
-rw-r--r--libsoup/soup-session.c126
1 files changed, 58 insertions, 68 deletions
diff --git a/libsoup/soup-session.c b/libsoup/soup-session.c
index 77c1f81c..a2605838 100644
--- a/libsoup/soup-session.c
+++ b/libsoup/soup-session.c
@@ -19,7 +19,7 @@
#include "soup-connection.h"
#include "soup-message-private.h"
#include "soup-misc.h"
-#include "soup-message-queue.h"
+#include "soup-message-queue-item.h"
#include "soup-session-private.h"
#include "soup-session-feature-private.h"
#include "soup-socket-properties.h"
@@ -105,7 +105,7 @@ typedef struct {
SoupSocketProperties *socket_props;
- SoupMessageQueue *queue;
+ GQueue *queue;
GSource *queue_source;
char *user_agent;
@@ -234,7 +234,7 @@ soup_session_init (SoupSession *session)
SoupAuthManager *auth_manager;
SoupMessageQueueSource *source;
- priv->queue = soup_message_queue_new (session);
+ priv->queue = g_queue_new ();
priv->queue_source = g_source_new (&queue_source_funcs, sizeof (SoupMessageQueueSource));
source = (SoupMessageQueueSource *)priv->queue_source;
source->session = session;
@@ -298,7 +298,8 @@ soup_session_finalize (GObject *object)
SoupSession *session = SOUP_SESSION (object);
SoupSessionPrivate *priv = soup_session_get_instance_private (session);
- soup_message_queue_destroy (priv->queue);
+ g_warn_if_fail (g_queue_is_empty (priv->queue));
+ g_queue_free (priv->queue);
g_source_unref (priv->queue_source);
g_hash_table_destroy (priv->http_hosts);
@@ -1063,6 +1064,24 @@ free_host (SoupSessionHost *host)
g_slice_free (SoupSessionHost, host);
}
+static int
+lookup_message (SoupMessageQueueItem *item,
+ SoupMessage *msg)
+{
+ return item->msg == msg ? 0 : 1;
+}
+
+static SoupMessageQueueItem *
+soup_session_lookup_queue_item (SoupSession *session,
+ SoupMessage *msg)
+{
+ SoupSessionPrivate *priv = soup_session_get_instance_private (session);
+ GList *link;
+
+ link = g_queue_find_custom (priv->queue, msg, (GCompareFunc)lookup_message);
+ return link ? (SoupMessageQueueItem *)link->data : NULL;
+}
+
#define SOUP_SESSION_WOULD_REDIRECT_AS_GET(session, msg) \
(soup_message_get_status (msg) == SOUP_STATUS_SEE_OTHER || \
(soup_message_get_status (msg) == SOUP_STATUS_FOUND && \
@@ -1171,11 +1190,8 @@ soup_session_redirect_message (SoupSession *session,
SoupMessage *msg,
GError **error)
{
- SoupSessionPrivate *priv;
GUri *new_uri;
char *host;
- SoupMessageQueueItem *item;
- gboolean retval;
g_return_val_if_fail (SOUP_IS_SESSION (session), FALSE);
g_return_val_if_fail (SOUP_IS_MESSAGE (msg), FALSE);
@@ -1211,12 +1227,9 @@ soup_session_redirect_message (SoupSession *session,
soup_message_set_uri (msg, new_uri);
g_uri_unref (new_uri);
- priv = soup_session_get_instance_private (session);
- item = soup_message_queue_lookup (priv->queue, msg);
- retval = soup_session_requeue_item (session, item, error);
- soup_message_queue_item_unref (item);
-
- return retval;
+ return soup_session_requeue_item (session,
+ soup_session_lookup_queue_item (session, msg),
+ error);
}
static void
@@ -1259,6 +1272,13 @@ message_restarted (SoupMessage *msg, gpointer user_data)
soup_message_cleanup_response (msg);
}
+static int
+compare_queue_item (SoupMessageQueueItem *a,
+ SoupMessageQueueItem *b)
+{
+ return b->priority - a->priority;
+}
+
static SoupMessageQueueItem *
soup_session_append_queue_item (SoupSession *session,
SoupMessage *msg,
@@ -1274,8 +1294,10 @@ soup_session_append_queue_item (SoupSession *session,
soup_message_cleanup_response (msg);
- item = soup_message_queue_append (priv->queue, msg, cancellable, callback, user_data);
- item->async = async;
+ item = soup_message_queue_item_new (session, msg, async, cancellable, callback, user_data);
+ g_queue_insert_sorted (priv->queue,
+ soup_message_queue_item_ref (item),
+ (GCompareDataFunc)compare_queue_item, NULL);
host = get_host_for_message (session, item->msg);
host->num_messages++;
@@ -1296,7 +1318,6 @@ soup_session_append_queue_item (SoupSession *session,
}
g_signal_emit (session, signals[REQUEST_QUEUED], 0, msg);
- soup_message_queue_item_ref (item);
return item;
}
@@ -1490,7 +1511,7 @@ soup_session_unqueue_item (SoupSession *session,
return;
}
- soup_message_queue_remove (priv->queue, item);
+ g_queue_remove (priv->queue, item);
host = get_host_for_message (session, item->msg);
host->num_messages--;
@@ -1637,8 +1658,7 @@ tunnel_connect (SoupMessageQueueItem *item)
item->cancellable,
NULL, NULL);
tunnel_item->io_priority = item->io_priority;
- tunnel_item->related = item;
- soup_message_queue_item_ref (item);
+ tunnel_item->related = soup_message_queue_item_ref (item);
soup_session_set_item_connection (session, tunnel_item, item->conn);
tunnel_item->state = SOUP_MESSAGE_RUNNING;
@@ -1810,11 +1830,11 @@ get_connection (SoupMessageQueueItem *item, gboolean *should_cleanup)
item->state = SOUP_MESSAGE_CONNECTING;
if (item->async) {
- soup_message_queue_item_ref (item);
soup_connection_connect_async (item->conn,
item->io_priority,
item->cancellable,
- connect_async_complete, item);
+ connect_async_complete,
+ soup_message_queue_item_ref (item));
return FALSE;
} else {
GError *error = NULL;
@@ -1915,14 +1935,14 @@ async_run_queue (SoupSession *session)
SoupMessageQueueItem *item;
SoupMessage *msg;
gboolean try_cleanup = TRUE, should_cleanup = FALSE;
+ GList *l;
g_object_ref (session);
soup_session_cleanup_connections (session, FALSE);
try_again:
- for (item = soup_message_queue_first (priv->queue);
- item;
- item = soup_message_queue_next (priv->queue, item)) {
+ for (l = priv->queue->head; l && l->data; l = g_list_next (l)) {
+ item = (SoupMessageQueueItem *)l->data;
msg = item->msg;
/* CONNECT messages are handled specially */
@@ -1961,12 +1981,9 @@ void
soup_session_requeue_message (SoupSession *session,
SoupMessage *msg)
{
- SoupSessionPrivate *priv = soup_session_get_instance_private (session);
- SoupMessageQueueItem *item;
+ SoupMessageQueueItem *item = soup_session_lookup_queue_item (session, msg);
- item = soup_message_queue_lookup (priv->queue, msg);
soup_session_requeue_item (session, item, &item->error);
- soup_message_queue_item_unref (item);
}
/**
@@ -1981,21 +1998,18 @@ void
soup_session_pause_message (SoupSession *session,
SoupMessage *msg)
{
- SoupSessionPrivate *priv;
SoupMessageQueueItem *item;
g_return_if_fail (SOUP_IS_SESSION (session));
g_return_if_fail (SOUP_IS_MESSAGE (msg));
- priv = soup_session_get_instance_private (session);
- item = soup_message_queue_lookup (priv->queue, msg);
+ item = soup_session_lookup_queue_item (session, msg);
g_return_if_fail (item != NULL);
g_return_if_fail (item->async);
item->paused = TRUE;
if (item->state == SOUP_MESSAGE_RUNNING)
soup_message_io_pause (msg);
- soup_message_queue_item_unref (item);
}
static void
@@ -2022,21 +2036,18 @@ void
soup_session_unpause_message (SoupSession *session,
SoupMessage *msg)
{
- SoupSessionPrivate *priv;
SoupMessageQueueItem *item;
g_return_if_fail (SOUP_IS_SESSION (session));
g_return_if_fail (SOUP_IS_MESSAGE (msg));
- priv = soup_session_get_instance_private (session);
- item = soup_message_queue_lookup (priv->queue, msg);
+ item = soup_session_lookup_queue_item (session, msg);
g_return_if_fail (item != NULL);
g_return_if_fail (item->async);
item->paused = FALSE;
if (item->state == SOUP_MESSAGE_RUNNING)
soup_message_io_unpause (msg);
- soup_message_queue_item_unref (item);
soup_session_kick_queue (session);
}
@@ -2045,16 +2056,11 @@ void
soup_session_cancel_message (SoupSession *session,
SoupMessage *msg)
{
- SoupSessionPrivate *priv = soup_session_get_instance_private (session);
- SoupMessageQueueItem *item;
+ SoupMessageQueueItem *item = soup_session_lookup_queue_item (session, msg);
- item = soup_message_queue_lookup (priv->queue, msg);
/* If the message is already ending, don't do anything */
- if (!item)
- return;
-
- g_cancellable_cancel (item->cancellable);
- soup_message_queue_item_unref (item);
+ if (item)
+ soup_message_queue_item_cancel (item);
}
/**
@@ -2072,17 +2078,12 @@ soup_session_abort (SoupSession *session)
GSList *conns, *c;
GHashTableIter iter;
gpointer conn, host;
- SoupMessageQueueItem *item;
g_return_if_fail (SOUP_IS_SESSION (session));
priv = soup_session_get_instance_private (session);
/* Cancel everything */
- for (item = soup_message_queue_first (priv->queue);
- item;
- item = soup_message_queue_next (priv->queue, item)) {
- g_cancellable_cancel (item->cancellable);
- }
+ g_queue_foreach (priv->queue, (GFunc)soup_message_queue_item_cancel, NULL);
/* Close all idle connections */
conns = NULL;
@@ -2831,8 +2832,6 @@ send_async_maybe_complete (SoupMessageQueueItem *item,
g_object_set_data (G_OBJECT (ostream), "istream", stream);
- /* Give the splice op its own ref on item */
- soup_message_queue_item_ref (item);
/* We don't use CLOSE_SOURCE because we need to control when the
* side effects of closing the SoupClientInputStream happen.
*/
@@ -2840,7 +2839,8 @@ send_async_maybe_complete (SoupMessageQueueItem *item,
G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET,
item->io_priority,
item->cancellable,
- send_async_spliced, item);
+ send_async_spliced,
+ soup_message_queue_item_ref (item));
return;
}
@@ -3055,8 +3055,7 @@ async_respond_from_cache (SoupSession *session,
data = g_slice_new0 (AsyncCacheConditionalData);
data->cache = g_object_ref (cache);
data->conditional_msg = conditional_msg;
- data->item = item;
- soup_message_queue_item_ref (item);
+ data->item = soup_message_queue_item_ref (item);
soup_message_disable_feature (conditional_msg, SOUP_TYPE_CACHE);
soup_session_send_async (session, conditional_msg,
item->io_priority,
@@ -3816,19 +3815,16 @@ static GIOStream *
soup_session_steal_connection (SoupSession *session,
SoupMessage *msg)
{
- SoupSessionPrivate *priv = soup_session_get_instance_private (session);
SoupMessageQueueItem *item;
GIOStream *stream = NULL;
- item = soup_message_queue_lookup (priv->queue, msg);
+ item = soup_session_lookup_queue_item (session, msg);
if (!item)
return NULL;
if (item->conn && soup_connection_get_state (item->conn) == SOUP_CONNECTION_IN_USE)
stream = steal_connection (session, item);
- soup_message_queue_item_unref (item);
-
return stream;
}
@@ -4009,20 +4005,14 @@ SoupMessage *
soup_session_get_original_message_for_authentication (SoupSession *session,
SoupMessage *msg)
{
- SoupSessionPrivate *priv = soup_session_get_instance_private (session);
SoupMessageQueueItem *item;
- SoupMessage *original_msg;
- item = soup_message_queue_lookup (priv->queue, msg);
+ item = soup_session_lookup_queue_item (session, msg);
if (!item)
return msg;
- if (soup_message_get_method (msg) != SOUP_METHOD_CONNECT) {
- soup_message_queue_item_unref (item);
+ if (soup_message_get_method (msg) != SOUP_METHOD_CONNECT)
return msg;
- }
- original_msg = item->related ? item->related->msg : msg;
- soup_message_queue_item_unref (item);
- return original_msg;
+ return item->related ? item->related->msg : msg;
}