]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
soup: Port to libsoup 3
authorMike Gorse <mgorse@suse.com>
Tue, 3 Jun 2025 21:13:41 +0000 (16:13 -0500)
committerTobias Brunner <tobias@strongswan.org>
Wed, 4 Jun 2025 17:08:07 +0000 (19:08 +0200)
configure.ac
src/libstrongswan/plugins/soup/soup_fetcher.c

index bf054e1e3bdba05a357cc825f1a6ae24fe388b11..db85794167df57e51d639577aaa71358daa0ef9e 100644 (file)
@@ -1044,7 +1044,7 @@ if test x$unbound = xtrue; then
 fi
 
 if test x$soup = xtrue; then
-       PKG_CHECK_MODULES(soup, [libsoup-2.4])
+       PKG_CHECK_MODULES(soup, [libsoup-3.0])
        AC_SUBST(soup_CFLAGS)
        AC_SUBST(soup_LIBS)
 fi
index 40b92e14ff88ccc6c734f80578adea7644a5edce..6c0cba2cb9dfa35b25815ab4a0758d33c3edada5 100644 (file)
@@ -66,36 +66,13 @@ struct private_soup_fetcher_t {
        u_int *result;
 };
 
-/**
- * Data to pass to soup callback
- */
-typedef struct {
-       fetcher_callback_t cb;
-       void *user;
-       SoupSession *session;
-} cb_data_t;
-
-/**
- * Soup callback invoking our callback
- */
-static void soup_cb(SoupMessage *message, SoupBuffer *chunk, cb_data_t *data)
-{
-       if (!data->cb(data->user, chunk_create((u_char*)chunk->data, chunk->length)))
-       {
-               soup_session_cancel_message(data->session, message,
-                                                                       SOUP_STATUS_CANCELLED);
-       }
-}
-
 METHOD(fetcher_t, fetch, status_t,
        private_soup_fetcher_t *this, char *uri, void *userdata)
 {
        SoupMessage *message;
        status_t status = FAILED;
-       cb_data_t data = {
-               .cb = this->cb,
-               .user = userdata,
-       };
+       GBytes *request_body, *res;
+       SoupSession *session;
 
        message = soup_message_new(this->method, uri);
        if (!message)
@@ -108,31 +85,43 @@ METHOD(fetcher_t, fetch, status_t,
        }
        if (this->type)
        {
-               soup_message_set_request(message, this->type, SOUP_MEMORY_STATIC,
-                                                                this->data.ptr, this->data.len);
+               request_body = g_bytes_new_static(this->data.ptr, this->data.len);
+               soup_message_set_request_body_from_bytes(message, this->type,
+                                                                                                request_body);
+               g_bytes_unref(request_body);
        }
-       soup_message_body_set_accumulate(message->response_body, FALSE);
-       g_signal_connect(message, "got-chunk", G_CALLBACK(soup_cb), &data);
-       data.session = soup_session_new();
-       g_object_set(G_OBJECT(data.session),
-                                SOUP_SESSION_TIMEOUT, (guint)this->timeout, NULL);
+       session = soup_session_new_with_options("timeout", (guint)this->timeout,
+                                                                                       NULL);
 
        DBG2(DBG_LIB, "sending http request to '%s'...", uri);
-       soup_session_send_message(data.session, message);
+       res = soup_session_send_and_read(session, message, NULL, NULL);
        if (this->result)
        {
-               *this->result = message->status_code;
+               *this->result = soup_message_get_status(message);
        }
-       if (SOUP_STATUS_IS_SUCCESSFUL(message->status_code))
+       if (SOUP_STATUS_IS_SUCCESSFUL(soup_message_get_status(message)))
        {
                status = SUCCESS;
        }
        else if (!this->result)
        {       /* only log an error if the code is not returned */
-               DBG1(DBG_LIB, "HTTP request failed: %s", message->reason_phrase);
+               DBG1(DBG_LIB, "HTTP request failed: %s",
+                        soup_message_get_reason_phrase(message));
+       }
+       if (res)
+       {
+               gpointer data;
+               gsize data_len;
+
+               data = g_bytes_unref_to_data(res, &data_len);
+               if (!this->cb(userdata, chunk_create(data, data_len)))
+               {
+                       status = FAILED;
+               }
+               g_free(data);
        }
        g_object_unref(G_OBJECT(message));
-       g_object_unref(G_OBJECT(data.session));
+       g_object_unref(G_OBJECT(session));
        return status;
 }