diff options
author | Carlos Garcia Campos <cgarcia@igalia.com> | 2021-03-04 11:14:09 +0100 |
---|---|---|
committer | Carlos Garcia Campos <cgarcia@igalia.com> | 2021-03-04 11:14:09 +0100 |
commit | 78456405a24af9811571bfe39643e662f0a7b1bf (patch) | |
tree | 6f9e479de3cae30c639f6bd635503295bd2f8127 | |
parent | 7033879bcff9a7b1c31c086ed020fc8fa03fcd81 (diff) | |
download | libsoup-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.txt | 1 | ||||
-rw-r--r-- | libsoup/soup-session.c | 25 | ||||
-rw-r--r-- | libsoup/soup-session.h | 4 | ||||
-rw-r--r-- | tests/multipart-test.c | 12 | ||||
-rw-r--r-- | tests/test-utils.c | 2 | ||||
-rw-r--r-- | tests/websocket-test.c | 6 |
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 |