[libshumate] Add libsoup3 support as a build option



commit 61fab4845ddea022dfafee74cf97af74c83a0d0d
Author: James Westman <james jwestman net>
Date:   Fri Jan 7 01:02:10 2022 -0600

    Add libsoup3 support as a build option

 README                            |  2 +-
 meson.build                       |  7 ++++--
 meson_options.txt                 |  4 +++
 shumate/meson.build               |  6 +++++
 shumate/shumate-tile-downloader.c | 52 ++++++++++++++++++++++++++++++---------
 5 files changed, 57 insertions(+), 14 deletions(-)
---
diff --git a/README b/README
index f5264e2..1461d00 100644
--- a/README
+++ b/README
@@ -11,7 +11,7 @@ libshumate requires:
    * gobject-introspection >= 0.6.3
    * cairo >= 1.4
    * sqlite3 >= 1.12.0
-   * libsoup > 2.42
+   * libsoup >= 2.42 OR libsoup >= 3.0 if -Dlibsoup3=true is passed to meson
    * gtk4
 
 Building is done with meson.
diff --git a/meson.build b/meson.build
index 8cd9a08..41f548f 100644
--- a/meson.build
+++ b/meson.build
@@ -56,7 +56,6 @@ libm_dep = cc.find_library('m', required: true)
 glib_req = '>= 2.16.0'
 cairo_req = '>= 1.4'
 sqlite_req = '>= 1.12.0'
-libsoup_req = '>= 2.42'
 introspection_req = '>= 0.6.3'
 vala_req = '>= 0.11.0'
 gtk_doc_req = '>= 1.9'
@@ -67,8 +66,12 @@ gobject_dep = dependency('gobject-2.0', version: glib_req)
 gio_dep = dependency('gio-2.0', version: glib_req)
 cairo_dep = dependency('cairo', version: cairo_req)
 sqlite_dep = dependency('sqlite3', version: sqlite_req)
-libsoup_dep = dependency('libsoup-2.4', version: libsoup_req)
 gtk_dep = dependency('gtk4')
+if get_option('libsoup3')
+  libsoup_dep = dependency('libsoup-3.0', version: '>= 3.0')
+else
+  libsoup_dep = dependency('libsoup-2.4', version: '>= 2.42')
+endif
 
 introspection_dep = dependency('gobject-introspection-1.0', version: introspection_req, required: false)
 vapigen_dep = dependency('vapigen', version: vala_req, required: false)
diff --git a/meson_options.txt b/meson_options.txt
index 238aef7..f02e083 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -16,3 +16,7 @@ option('demos',
 option('vector_renderer',
        type: 'boolean', value: false,
        description: 'Build the experimental vector tile renderer')
+
+option('libsoup3',
+       type: 'boolean', value: false,
+       description: 'Use libsoup 3.0')
diff --git a/shumate/meson.build b/shumate/meson.build
index 35de053..871ecef 100644
--- a/shumate/meson.build
+++ b/shumate/meson.build
@@ -171,6 +171,12 @@ if get_option('vector_renderer')
   ]
 endif
 
+if get_option('libsoup3')
+  libshumate_c_args += [
+    '-DSHUMATE_LIBSOUP_3',
+  ]
+endif
+
 libshumate_lib = library(
   package_string,
   libshumate_sources,
diff --git a/shumate/shumate-tile-downloader.c b/shumate/shumate-tile-downloader.c
index ce81536..5b3adda 100644
--- a/shumate/shumate-tile-downloader.c
+++ b/shumate/shumate-tile-downloader.c
@@ -331,6 +331,7 @@ fetch_from_network (GTask *task)
   GCancellable *cancellable = g_task_get_cancellable (task);
   g_autofree char *uri = NULL;
   g_autofree char *modtime_string = NULL;
+  SoupMessageHeaders *headers;
 
   uri = get_tile_uri (data->self, data->x, data->y, data->z);
 
@@ -345,6 +346,11 @@ fetch_from_network (GTask *task)
     }
 
   modtime_string = get_modified_time_string (data->modtime);
+#ifdef SHUMATE_LIBSOUP_3
+  headers = soup_message_get_request_headers (data->msg);
+#else
+  headers = data->msg->request_headers;
+#endif
 
   /* If an etag is available, only use it.
    * OSM servers seems to send now as the modified time for all tiles
@@ -353,18 +359,23 @@ fetch_from_network (GTask *task)
   if (data->etag)
     {
       g_debug ("If-None-Match: %s", data->etag);
-      soup_message_headers_append (data->msg->request_headers,
-          "If-None-Match", data->etag);
+      soup_message_headers_append (headers, "If-None-Match", data->etag);
     }
   else if (modtime_string)
     {
       g_debug ("If-Modified-Since %s", modtime_string);
-      soup_message_headers_append (data->msg->request_headers,
-          "If-Modified-Since", modtime_string);
+      soup_message_headers_append (headers, "If-Modified-Since", modtime_string);
     }
 
   if (data->self->soup_session == NULL)
     {
+#ifdef SHUMATE_LIBSOUP_3
+      data->self->soup_session =
+        soup_session_new_with_options ("user-agent", "libshumate/" SHUMATE_VERSION,
+                                       "max-conns-per-host", MAX_CONNS_DEFAULT,
+                                       "max-conns", MAX_CONNS_DEFAULT,
+                                       NULL);
+#else
       data->self->soup_session
         = soup_session_new_with_options ("proxy-uri", NULL,
                                          "ssl-strict", FALSE,
@@ -380,9 +391,18 @@ fetch_from_network (GTask *task)
                     "max-conns-per-host", MAX_CONNS_DEFAULT,
                     "max-conns", MAX_CONNS_DEFAULT,
                     NULL);
+
+#endif
     }
 
-  soup_session_send_async (data->self->soup_session, data->msg, cancellable, on_message_sent, g_object_ref 
(task));
+  soup_session_send_async (data->self->soup_session,
+                           data->msg,
+#ifdef SHUMATE_LIBSOUP_3
+                           G_PRIORITY_DEFAULT,
+#endif
+                           cancellable,
+                           on_message_sent,
+                           g_object_ref (task));
 }
 
 /* Receive the response from the network. If the tile hasn't been modified,
@@ -396,6 +416,8 @@ on_message_sent (GObject *source_object, GAsyncResult *res, gpointer user_data)
   g_autoptr(GInputStream) input_stream = NULL;
   g_autoptr(GError) error = NULL;
   g_autoptr(GOutputStream) output_stream = NULL;
+  SoupStatus status;
+  SoupMessageHeaders *headers;
 
   input_stream = soup_session_send_finish (data->self->soup_session, res, &error);
   if (error != NULL)
@@ -413,9 +435,17 @@ on_message_sent (GObject *source_object, GAsyncResult *res, gpointer user_data)
       return;
     }
 
-  g_debug ("Got reply %d", data->msg->status_code);
+#ifdef SHUMATE_LIBSOUP_3
+  status = soup_message_get_status (data->msg);
+  headers = soup_message_get_response_headers (data->msg);
+#else
+  status = data->msg->status_code;
+  headers = data->msg->response_headers;
+#endif
+
+  g_debug ("Got reply %d", status);
 
-  if (data->msg->status_code == SOUP_STATUS_NOT_MODIFIED)
+  if (status == SOUP_STATUS_NOT_MODIFIED)
     {
       /* The tile has already been filled from the cache, and the server says
        * it doesn't have a newer one. Just update the cache, mark the tile as
@@ -426,12 +456,12 @@ on_message_sent (GObject *source_object, GAsyncResult *res, gpointer user_data)
       return;
     }
 
-  if (!SOUP_STATUS_IS_SUCCESSFUL (data->msg->status_code))
+  if (!SOUP_STATUS_IS_SUCCESSFUL (status))
     {
       if (data->bytes)
         {
           g_debug ("Fetching tile failed, but there is a cached version (HTTP %s)",
-                   soup_status_get_phrase (data->msg->status_code));
+                   soup_status_get_phrase (status));
           g_task_return_pointer (task, g_steal_pointer (&data->bytes), (GDestroyNotify)g_bytes_unref);
         }
       else
@@ -439,7 +469,7 @@ on_message_sent (GObject *source_object, GAsyncResult *res, gpointer user_data)
           g_task_return_new_error (task, SHUMATE_TILE_DOWNLOADER_ERROR,
                                    SHUMATE_TILE_DOWNLOADER_ERROR_BAD_RESPONSE,
                                    "Unable to download tile: HTTP %s",
-                                   soup_status_get_phrase (data->msg->status_code));
+                                   soup_status_get_phrase (status));
         }
 
       return;
@@ -447,7 +477,7 @@ on_message_sent (GObject *source_object, GAsyncResult *res, gpointer user_data)
 
   /* Verify if the server sent an etag and save it */
   g_clear_pointer (&data->etag, g_free);
-  data->etag = g_strdup (soup_message_headers_get_one (data->msg->response_headers, "ETag"));
+  data->etag = g_strdup (soup_message_headers_get_one (headers, "ETag"));
   g_debug ("Received ETag %s", data->etag);
 
   output_stream = g_memory_output_stream_new_resizable ();


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]