soup: Port to libsoup 3

This commit is contained in:
Mike Gorse
2025-06-04 19:08:07 +02:00
committed by Tobias Brunner
parent e864b8a8b1
commit 6ddabf52d5
2 changed files with 27 additions and 38 deletions
+1 -1
View File
@@ -1044,7 +1044,7 @@ if test x$unbound = xtrue; then
fi fi
if test x$soup = xtrue; then 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_CFLAGS)
AC_SUBST(soup_LIBS) AC_SUBST(soup_LIBS)
fi fi
+26 -37
View File
@@ -66,36 +66,13 @@ struct private_soup_fetcher_t {
u_int *result; 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, METHOD(fetcher_t, fetch, status_t,
private_soup_fetcher_t *this, char *uri, void *userdata) private_soup_fetcher_t *this, char *uri, void *userdata)
{ {
SoupMessage *message; SoupMessage *message;
status_t status = FAILED; status_t status = FAILED;
cb_data_t data = { GBytes *request_body, *res;
.cb = this->cb, SoupSession *session;
.user = userdata,
};
message = soup_message_new(this->method, uri); message = soup_message_new(this->method, uri);
if (!message) if (!message)
@@ -108,31 +85,43 @@ METHOD(fetcher_t, fetch, status_t,
} }
if (this->type) if (this->type)
{ {
soup_message_set_request(message, this->type, SOUP_MEMORY_STATIC, request_body = g_bytes_new_static(this->data.ptr, this->data.len);
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); session = soup_session_new_with_options("timeout", (guint)this->timeout,
g_signal_connect(message, "got-chunk", G_CALLBACK(soup_cb), &data); NULL);
data.session = soup_session_new();
g_object_set(G_OBJECT(data.session),
SOUP_SESSION_TIMEOUT, (guint)this->timeout, NULL);
DBG2(DBG_LIB, "sending http request to '%s'...", uri); 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) 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; status = SUCCESS;
} }
else if (!this->result) else if (!this->result)
{ /* only log an error if the code is not returned */ { /* 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(message));
g_object_unref(G_OBJECT(data.session)); g_object_unref(G_OBJECT(session));
return status; return status;
} }