[libsoup/carlosgc/async-result-message] session: add soup_session_get_async_result_message




commit 78456405a24af9811571bfe39643e662f0a7b1bf
Author: Carlos Garcia Campos <cgarcia igalia com>
Date:   Thu Mar 4 11:14:09 2021 +0100

    session: add soup_session_get_async_result_message
    
    This is useful to get the SoupMessage of an async operation from the
    ready callback.

 docs/reference/libsoup-3.0-sections.txt |  1 +
 libsoup/soup-session.c                  | 25 +++++++++++++++++++++++++
 libsoup/soup-session.h                  |  4 ++++
 tests/multipart-test.c                  | 12 +++++++-----
 tests/test-utils.c                      |  2 ++
 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
@@ -140,6 +140,10 @@ GBytes         *soup_session_send_and_read        (SoupSession          *session
                                                   GCancellable         *cancellable,
                                                   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);
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


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]