From: Mike Gorse Date: Tue, 3 Jun 2025 21:13:41 +0000 (-0500) Subject: soup: Port to libsoup 3 X-Git-Tag: 6.0.2dr1~1^2~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6ddabf52d5f335147601c7c2797da21820efafb8;p=thirdparty%2Fstrongswan.git soup: Port to libsoup 3 --- diff --git a/configure.ac b/configure.ac index bf054e1e3b..db85794167 100644 --- a/configure.ac +++ b/configure.ac @@ -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 diff --git a/src/libstrongswan/plugins/soup/soup_fetcher.c b/src/libstrongswan/plugins/soup/soup_fetcher.c index 40b92e14ff..6c0cba2cb9 100644 --- a/src/libstrongswan/plugins/soup/soup_fetcher.c +++ b/src/libstrongswan/plugins/soup/soup_fetcher.c @@ -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; }