summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garcia Campos <cgarcia@igalia.com>2021-03-23 13:00:00 +0100
committerMaciej S. Szmigiero <mail@maciej.szmigiero.name>2022-11-13 20:02:25 +0100
commit66dbd6decf607ade17bc845c84e8cf5c5ceb8a53 (patch)
tree4e8445655564a21de642f2b112af7af391352c94
parent919990f28aa05af089cfdc921a9254b59e00cf31 (diff)
downloadgeoclue-66dbd6decf607ade17bc845c84e8cf5c5ceb8a53.tar.gz
Add support for building with libsoup3
Remove soup2 build option, based on https://gitlab.freedesktop.org/geoclue/geoclue/-/merge_requests/83 Original commit message: Add soup2 build option, enabled by default. When disabled, libsoup3 will be used instead.
-rw-r--r--HACKING.md2
-rw-r--r--src/gclue-mozilla.c20
-rw-r--r--src/gclue-web-source.c118
-rw-r--r--src/meson.build2
4 files changed, 74 insertions, 68 deletions
diff --git a/HACKING.md b/HACKING.md
index ef63ca0..c8d2905 100644
--- a/HACKING.md
+++ b/HACKING.md
@@ -7,7 +7,7 @@
* gio (>= 2.44.0)
* gobject-introspection
* json-glib
- * libsoup2.4 (>= 2.42)
+ * libsoup3.0
* pkg-config
Fedora:
diff --git a/src/gclue-mozilla.c b/src/gclue-mozilla.c
index 8d17cb3..ba60ca9 100644
--- a/src/gclue-mozilla.c
+++ b/src/gclue-mozilla.c
@@ -193,6 +193,7 @@ gclue_mozilla_create_query (GClueMozilla *mozilla,
guint n_non_ignored_bsss;
GList *iter;
gint64 mcc, mnc;
+ g_autoptr(GBytes) body = NULL;
builder = json_builder_new ();
json_builder_begin_object (builder);
@@ -285,11 +286,8 @@ gclue_mozilla_create_query (GClueMozilla *mozilla,
uri = gclue_mozilla_get_locate_url (mozilla);
ret = soup_message_new ("POST", uri);
- soup_message_set_request (ret,
- "application/json",
- SOUP_MEMORY_TAKE,
- data,
- data_len);
+ body = g_bytes_new_take (data, data_len);
+ soup_message_set_request_body_from_bytes (ret, "application/json", body);
g_debug ("Sending following request to '%s':\n%s", uri, data);
if (query_data_description) {
@@ -391,6 +389,7 @@ gclue_mozilla_create_submit_query (GClueMozilla *mozilla,
GError **error)
{
SoupMessage *ret = NULL;
+ SoupMessageHeaders *request_headers;
JsonBuilder *builder;
JsonGenerator *generator;
JsonNode *root_node;
@@ -403,6 +402,7 @@ gclue_mozilla_create_submit_query (GClueMozilla *mozilla,
guint64 time_ms;
gint64 mcc, mnc;
GClueConfig *config;
+ g_autoptr(GBytes) body = NULL;
if (mozilla->priv->bss_submitted &&
(!mozilla->priv->tower_valid ||
@@ -537,15 +537,13 @@ gclue_mozilla_create_submit_query (GClueMozilla *mozilla,
g_object_unref (generator);
ret = soup_message_new ("POST", url);
+ request_headers = soup_message_get_request_headers (ret);
if (nick != NULL && nick[0] != '\0')
- soup_message_headers_append (ret->request_headers,
+ soup_message_headers_append (request_headers,
"X-Nickname",
nick);
- soup_message_set_request (ret,
- "application/json",
- SOUP_MEMORY_TAKE,
- data,
- data_len);
+ body = g_bytes_new_take (data, data_len);
+ soup_message_set_request_body_from_bytes (ret, "application/json", body);
g_debug ("Sending following request to '%s':\n%s", url, data);
mozilla->priv->bss_submitted = TRUE;
diff --git a/src/gclue-web-source.c b/src/gclue-web-source.c
index 56e3a0c..1da01dd 100644
--- a/src/gclue-web-source.c
+++ b/src/gclue-web-source.c
@@ -74,9 +74,9 @@ G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GClueWebSource,
GCLUE_TYPE_LOCATION_SOURCE,
G_ADD_PRIVATE (GClueWebSource))
-static void refresh_callback (SoupSession *session,
- SoupMessage *query,
- gpointer user_data);
+static void refresh_callback (SoupSession *session,
+ GAsyncResult *result,
+ gpointer user_data);
static void
gclue_web_source_real_refresh_async (GClueWebSource *source,
@@ -117,45 +117,48 @@ gclue_web_source_real_refresh_async (GClueWebSource *source,
return;
}
- /* TODO handle cancellation */
- soup_session_queue_message (source->priv->soup_session,
- source->priv->query,
- refresh_callback,
- g_steal_pointer (&task));
+ soup_session_send_and_read_async (source->priv->soup_session,
+ source->priv->query,
+ G_PRIORITY_DEFAULT,
+ cancellable,
+ (GAsyncReadyCallback)refresh_callback,
+ g_steal_pointer (&task));
}
static void
-refresh_callback (SoupSession *session,
- SoupMessage *query,
- gpointer user_data)
+refresh_callback (SoupSession *session,
+ GAsyncResult *result,
+ gpointer user_data)
{
g_autoptr(GTask) task = g_steal_pointer (&user_data);
GClueWebSource *web;
+ g_autoptr(SoupMessage) query = NULL;
+ g_autoptr(GBytes) body = NULL;
g_autoptr(GError) local_error = NULL;
g_autofree char *contents = NULL;
g_autofree char *str = NULL;
g_autoptr(GClueLocation) location = NULL;
- SoupURI *uri;
+ GUri *uri;
- if (query->status_code == SOUP_STATUS_CANCELLED) {
- g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_CANCELLED,
- "Operation cancelled");
+ web = GCLUE_WEB_SOURCE (g_task_get_source_object (task));
+ query = g_steal_pointer (&web->priv->query);
+
+ body = soup_session_send_and_read_finish (session, result, &local_error);
+ if (!body) {
+ g_task_return_error (task, g_steal_pointer (&local_error));
return;
}
- web = GCLUE_WEB_SOURCE (g_task_get_source_object (task));
- web->priv->query = NULL;
-
- if (query->status_code != SOUP_STATUS_OK) {
+ if (soup_message_get_status (query) != SOUP_STATUS_OK) {
g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED,
"Query location SOUP error: %s",
- query->reason_phrase);
+ soup_message_get_reason_phrase (query));
return;
}
- contents = g_strndup (query->response_body->data, query->response_body->length);
+ contents = g_strndup (g_bytes_get_data (body, NULL), g_bytes_get_size (body));
uri = soup_message_get_uri (query);
- str = soup_uri_to_string (uri, FALSE);
+ str = g_uri_to_string (uri);
g_debug ("Got following response from '%s':\n%s", str, contents);
location = gclue_mozilla_parse_response (contents,
web->priv->query_data_description,
@@ -356,15 +359,12 @@ gclue_web_source_finalize (GObject *gsource)
priv->connectivity_changed_id = 0;
}
- if (priv->query != NULL) {
- g_debug ("Cancelling web source query");
- soup_session_cancel_message (priv->soup_session,
- priv->query,
- SOUP_STATUS_CANCELLED);
- priv->query = NULL;
+ if (priv->soup_session) {
+ soup_session_abort (priv->soup_session);
+ g_clear_object (&priv->soup_session);
}
- g_clear_object (&priv->soup_session);
+ g_clear_object (&priv->query);
g_clear_object (&priv->cancellable);
G_OBJECT_CLASS (gclue_web_source_parent_class)->finalize (gsource);
@@ -378,10 +378,8 @@ gclue_web_source_constructed (GObject *object)
G_OBJECT_CLASS (gclue_web_source_parent_class)->constructed (object);
- priv->soup_session = soup_session_new_with_options
- (SOUP_SESSION_REMOVE_FEATURE_BY_TYPE,
- SOUP_TYPE_PROXY_RESOLVER_DEFAULT,
- NULL);
+ priv->soup_session = soup_session_new ();
+ soup_session_remove_feature_by_type (priv->soup_session, G_TYPE_PROXY_RESOLVER);
monitor = g_network_monitor_get_default ();
priv->network_changed_id =
@@ -484,25 +482,34 @@ gclue_web_source_refresh (GClueWebSource *source)
}
static void
-submit_query_callback (SoupSession *session,
- SoupMessage *query,
- gpointer user_data)
+submit_query_callback (SoupSession *session,
+ GAsyncResult *result,
+ gpointer user_data)
{
- SoupURI *uri;
- g_autofree char *str = NULL;
+ g_autoptr(GBytes) body = NULL;
+ g_autoptr(GError) local_error = NULL;
+ SoupMessage *query;
+ g_autofree char *uri_str = NULL;
+ gint status_code;
- uri = soup_message_get_uri (query);
- str = soup_uri_to_string (uri, FALSE);
- if (query->status_code != SOUP_STATUS_OK &&
- query->status_code != SOUP_STATUS_NO_CONTENT) {
+ query = soup_session_get_async_result_message (session, result);
+ uri_str = g_uri_to_string (soup_message_get_uri (query));
+
+ body = soup_session_send_and_read_finish (session, result, &local_error);
+ if (!body) {
+ g_warning ("Failed to submit location data to '%s': %s",
+ uri_str, local_error->message);
+ return;
+ }
+
+ status_code = soup_message_get_status (query);
+ if (status_code != SOUP_STATUS_OK && status_code != SOUP_STATUS_NO_CONTENT) {
g_warning ("Failed to submit location data to '%s': %s",
- str,
- query->reason_phrase);
- return;
- }
+ uri_str, soup_message_get_reason_phrase (query));
+ return;
+ }
- g_debug ("Successfully submitted location data to '%s'",
- str);
+ g_debug ("Successfully submitted location data to '%s'", uri_str);
}
#define SUBMISSION_ACCURACY_THRESHOLD 100
@@ -516,8 +523,8 @@ on_submit_source_location_notify (GObject *source_object,
GClueLocationSource *source = GCLUE_LOCATION_SOURCE (source_object);
GClueWebSource *web = GCLUE_WEB_SOURCE (user_data);
GClueLocation *location;
- SoupMessage *query;
- GError *error = NULL;
+ g_autoptr(SoupMessage) query = NULL;
+ g_autoptr(GError) error = NULL;
location = gclue_location_source_get_location (source);
if (location == NULL ||
@@ -540,16 +547,17 @@ on_submit_source_location_notify (GObject *source_object,
if (error != NULL) {
g_warning ("Failed to create submission query: %s",
error->message);
- g_error_free (error);
}
return;
}
- soup_session_queue_message (web->priv->soup_session,
- query,
- submit_query_callback,
- web);
+ soup_session_send_and_read_async (web->priv->soup_session,
+ query,
+ G_PRIORITY_DEFAULT,
+ NULL,
+ (GAsyncReadyCallback)submit_query_callback,
+ web);
}
/**
diff --git a/src/meson.build b/src/meson.build
index 6053732..ca6c91f 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -1,5 +1,5 @@
geoclue_deps = base_deps + [ dependency('json-glib-1.0', version: '>= 0.14.0'),
- dependency('libsoup-2.4', version: '>= 2.42.0') ]
+ dependency('libsoup-3.0', version: '>= 3.0.0') ]
sources = [ libgeoclue_public_api_gen_sources[1],
geoclue_iface_sources,