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
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
+26 -37
View 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;
}