summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garcia Campos <cgarcia@igalia.com>2021-03-04 11:14:09 +0100
committerCarlos Garcia Campos <cgarcia@igalia.com>2021-03-04 11:14:09 +0100
commit78456405a24af9811571bfe39643e662f0a7b1bf (patch)
tree6f9e479de3cae30c639f6bd635503295bd2f8127
parent7033879bcff9a7b1c31c086ed020fc8fa03fcd81 (diff)
downloadlibsoup-carlosgc/async-result-message.tar.gz
session: add soup_session_get_async_result_messagecarlosgc/async-result-message
This is useful to get the SoupMessage of an async operation from the ready callback.
-rw-r--r--docs/reference/libsoup-3.0-sections.txt1
-rw-r--r--libsoup/soup-session.c25
-rw-r--r--libsoup/soup-session.h4
-rw-r--r--tests/multipart-test.c12
-rw-r--r--tests/test-utils.c2
-rw-r--r--tests/websocket-test.c6
6 files changed, 43 insertions, 7 deletions
diff --git a/docs/reference/libsoup-3.0-sections.txt b/docs/reference/libsoup-3.0-sections.txt
index d6802198..8344ef67 100644
--- a/docs/reference/libsoup-3.0-sections.txt
+++ b/docs/reference/libsoup-3.0-sections.txt
@@ -383,6 +383,7 @@ soup_session_set_accept_language
soup_session_get_accept_language
soup_session_set_accept_language_auto
soup_session_get_accept_language_auto
+soup_session_get_async_result_message
<SUBSECTION>
soup_session_send
soup_session_send_async
diff --git a/libsoup/soup-session.c b/libsoup/soup-session.c
index dac80502..5244325c 100644
--- a/libsoup/soup-session.c
+++ b/libsoup/soup-session.c
@@ -3436,6 +3436,31 @@ soup_session_send_and_read (SoupSession *session,
return bytes;
}
+/**
+ * soup_session_get_async_result_message:
+ * @session: a #SoupSession
+ * @result: the #GAsyncResult passed to your callback
+ *
+ * Gets the #SoupMessage of the @result asynchronous operation
+ * This is useful to get the #SoupMessage of an asynchronous
+ * operation started by @session from its #GAsyncReadyCallback.
+ *
+ * Returns: (transfer none) (nullable): a #SoupMessage or
+ * %NULL if @result is not a valid @session async operation result.
+ */
+SoupMessage *
+soup_session_get_async_result_message (SoupSession *session,
+ GAsyncResult *result)
+{
+ SoupMessageQueueItem *item;
+
+ g_return_val_if_fail (SOUP_IS_SESSION (session), NULL);
+ g_return_val_if_fail (g_task_is_valid (result, session), NULL);
+
+ item = g_task_get_task_data (G_TASK (result));
+ return item ? item->msg : NULL;
+}
+
typedef struct {
goffset content_length;
char *content_type;
diff --git a/libsoup/soup-session.h b/libsoup/soup-session.h
index e8574483..446fd91e 100644
--- a/libsoup/soup-session.h
+++ b/libsoup/soup-session.h
@@ -141,6 +141,10 @@ GBytes *soup_session_send_and_read (SoupSession *session
GError **error);
SOUP_AVAILABLE_IN_ALL
+SoupMessage *soup_session_get_async_result_message (SoupSession *session,
+ GAsyncResult *result);
+
+SOUP_AVAILABLE_IN_ALL
void soup_session_add_feature (SoupSession *session,
SoupSessionFeature *feature);
SOUP_AVAILABLE_IN_ALL
diff --git a/tests/multipart-test.c b/tests/multipart-test.c
index c6c3b0e5..28a02e2f 100644
--- a/tests/multipart-test.c
+++ b/tests/multipart-test.c
@@ -335,7 +335,7 @@ multipart_next_part_cb (GObject *source, GAsyncResult *res, gpointer data)
static void
multipart_handling_cb (GObject *source, GAsyncResult *res, gpointer data)
{
- SoupMessage *message = (SoupMessage*)data;
+ SoupMessage *message;
SoupSession *session = SOUP_SESSION (source);
GError *error = NULL;
GInputStream *in;
@@ -347,6 +347,7 @@ multipart_handling_cb (GObject *source, GAsyncResult *res, gpointer data)
return;
}
+ message = soup_session_get_async_result_message (session, res);
multipart = soup_multipart_input_stream_new (message, in);
g_object_unref (in);
@@ -360,7 +361,7 @@ multipart_handling_cb (GObject *source, GAsyncResult *res, gpointer data)
static void
sync_multipart_handling_cb (GObject *source, GAsyncResult *res, gpointer data)
{
- SoupMessage *message = (SoupMessage*)data;
+ SoupMessage *message;
SoupSession *session = SOUP_SESSION (source);
GError *error = NULL;
GInputStream *in;
@@ -374,6 +375,7 @@ sync_multipart_handling_cb (GObject *source, GAsyncResult *res, gpointer data)
return;
}
+ message = soup_session_get_async_result_message (session, res);
multipart = soup_multipart_input_stream_new (message, in);
g_object_unref (in);
@@ -440,12 +442,12 @@ test_multipart (gconstpointer data)
loop = g_main_loop_new (NULL, TRUE);
if (multipart_mode == ASYNC_MULTIPART)
- soup_session_send_async (session, msg, 0, NULL, multipart_handling_cb, msg);
+ soup_session_send_async (session, msg, 0, NULL, multipart_handling_cb, NULL);
else if (multipart_mode == ASYNC_MULTIPART_SMALL_READS) {
g_object_set_data (G_OBJECT (msg), "multipart-small-reads", GINT_TO_POINTER(1));
- soup_session_send_async (session, msg, 0, NULL, multipart_handling_cb, msg);
+ soup_session_send_async (session, msg, 0, NULL, multipart_handling_cb, NULL);
} else if (multipart_mode == SYNC_MULTIPART)
- soup_session_send_async (session, msg, 0, NULL, sync_multipart_handling_cb, msg);
+ soup_session_send_async (session, msg, 0, NULL, sync_multipart_handling_cb, NULL);
else
soup_session_send_async (session, msg, 0, NULL, no_multipart_handling_cb, NULL);
diff --git a/tests/test-utils.c b/tests/test-utils.c
index 8548a676..697106a5 100644
--- a/tests/test-utils.c
+++ b/tests/test-utils.c
@@ -692,6 +692,8 @@ soup_test_request_send (SoupSession *session,
async_as_sync_callback, &data);
g_main_loop_run (data.loop);
+ g_assert_true (soup_session_get_async_result_message (session, data.result) == msg);
+
stream = soup_session_send_finish (session, data.result, error);
if (flags & SOUP_TEST_REQUEST_CANCEL_AFTER_SEND_FINISH) {
diff --git a/tests/websocket-test.c b/tests/websocket-test.c
index 5c8a83a4..c5021ea8 100644
--- a/tests/websocket-test.c
+++ b/tests/websocket-test.c
@@ -310,10 +310,12 @@ got_client_connection (GObject *object,
GAsyncResult *result,
gpointer user_data)
{
+ SoupSession *session = SOUP_SESSION (object);
Test *test = user_data;
- test->client = soup_session_websocket_connect_finish (SOUP_SESSION (object),
- result, &test->client_error);
+ g_assert_true (soup_session_get_async_result_message (session, result) == test->msg);
+
+ test->client = soup_session_websocket_connect_finish (session, result, &test->client_error);
}
static void