[phodav/carlosgc/soup3] Port to libsoup3




commit b1ec53f996e8339f703e79156ab4b16a5d7d7c9d
Author: Carlos Garcia Campos <cgarcia igalia com>
Date:   Tue Jun 28 14:45:52 2022 +0200

    Port to libsoup3

 bin/chezdav.c                       | 17 ++++----
 libphodav/meson.build               |  2 +-
 libphodav/phodav-if.c               | 15 +++----
 libphodav/phodav-method-delete.c    |  2 +-
 libphodav/phodav-method-get.c       | 36 +++++++++-------
 libphodav/phodav-method-lock.c      | 21 ++++++----
 libphodav/phodav-method-mkcol.c     |  7 ++--
 libphodav/phodav-method-movecopy.c  | 21 +++++-----
 libphodav/phodav-method-propfind.c  | 37 ++++++++++++-----
 libphodav/phodav-method-proppatch.c |  6 +--
 libphodav/phodav-method-put.c       | 37 ++++++++++-------
 libphodav/phodav-method-unlock.c    |  4 +-
 libphodav/phodav-multistatus.c      | 16 +++----
 libphodav/phodav-multistatus.h      |  4 +-
 libphodav/phodav-priv.h             | 20 ++++-----
 libphodav/phodav-server.c           | 83 +++++++++++++++++++------------------
 libphodav/phodav-utils.c            |  8 ++--
 libphodav/phodav-utils.h            |  4 +-
 meson.build                         |  2 +-
 tests/virtual-dir-server.c          |  2 +
 tests/virtual-dir.c                 | 40 +++++++++++++++---
 21 files changed, 223 insertions(+), 161 deletions(-)
---
diff --git a/bin/chezdav.c b/bin/chezdav.c
index 543c045..073e5bb 100644
--- a/bin/chezdav.c
+++ b/bin/chezdav.c
@@ -77,11 +77,11 @@ get_realm (void)
 
 gchar *htdigest = NULL;
 
-static gchar *
-digest_auth_callback (SoupAuthDomain *auth_domain, SoupMessage *msg,
+static gboolean
+digest_auth_callback (SoupAuthDomain *auth_domain, SoupServerMessage *msg,
                       const char *username, gpointer data)
 {
-  gchar *digest = NULL;;
+  gchar *digest = NULL;
   gchar *line = NULL;
   gchar *eol = NULL;
 
@@ -103,7 +103,7 @@ digest_auth_callback (SoupAuthDomain *auth_domain, SoupMessage *msg,
         break;
     }
 
-  return digest;
+  return !!digest;
 }
 
 int
@@ -188,11 +188,10 @@ main (int argc, char *argv[])
       if (!g_file_get_contents (htdigest, &htdigest, NULL, &error))
         my_error (_ ("Failed to open htdigest: %s\n"), error->message);
 
-      auth = soup_auth_domain_digest_new (SOUP_AUTH_DOMAIN_REALM, realm,
-                                          SOUP_AUTH_DOMAIN_ADD_PATH, "/",
-                                          SOUP_AUTH_DOMAIN_DIGEST_AUTH_CALLBACK, digest_auth_callback,
-                                          SOUP_AUTH_DOMAIN_DIGEST_AUTH_DATA, NULL,
-                                          NULL);
+      auth = soup_auth_domain_digest_new ("realm", realm, NULL);
+      soup_auth_domain_add_path (auth, "/");
+      soup_auth_domain_set_generic_auth_callback (auth, digest_auth_callback, NULL, NULL);
+
       server = phodav_server_get_soup_server (dav);
       soup_server_add_auth_domain (server, auth);
       g_object_unref (auth);
diff --git a/libphodav/meson.build b/libphodav/meson.build
index b6275ed..1e09eb0 100644
--- a/libphodav/meson.build
+++ b/libphodav/meson.build
@@ -52,5 +52,5 @@ pkgconfig.generate(
   filebase : 'libphodav-2.0',
   description : 'A WebDAV library based on libsoup',
   subdirs : 'libphodav-2.0',
-  requires : 'libsoup-2.4'
+  requires : 'libsoup-3.0'
 )
diff --git a/libphodav/phodav-if.c b/libphodav/phodav-if.c
index 5d3e79e..f495a2b 100644
--- a/libphodav/phodav-if.c
+++ b/libphodav/phodav-if.c
@@ -232,17 +232,17 @@ eval_if_lists (PathHandler *handler, IfState *state)
 static gboolean
 eval_if_tag (PathHandler *handler, IfState *state)
 {
-  SoupURI *uri;
+  GUri *uri;
   const gchar *path;
   const gchar *ref = accept_ref (state);
 
   g_return_val_if_fail (ref != NULL, FALSE);
 
-  uri = soup_uri_new (ref);
-  path = soup_uri_get_path (uri);
+  uri = g_uri_parse (ref, G_URI_FLAGS_ENCODED_PATH, NULL);
+  path = g_uri_get_path (uri);
   g_free (state->path);
   state->path = g_strdup (path);
-  soup_uri_free (uri);
+  g_uri_unref (uri);
 
   return eval_if_lists (handler, state);
 }
@@ -265,14 +265,15 @@ eval_if (PathHandler *handler, IfState *state)
 }
 
 gint
-phodav_check_if (PathHandler *handler, SoupMessage *msg, const gchar *path, GList **locks)
+phodav_check_if (PathHandler *handler, SoupServerMessage *msg, const gchar *path, GList **locks)
 {
   PhodavServer *server = handler_get_server (handler);
   gboolean success = TRUE;
   gint status;
-  gchar *str = g_strdup (soup_message_headers_get_one (msg->request_headers, "If"));
+  SoupMessageHeaders *request_headers = soup_server_message_get_request_headers (msg);
+  gchar *str = g_strdup (soup_message_headers_get_one (request_headers, "If"));
   IfState state = { .cur = str, .path = g_strdup (path) };
-  gboolean copy = msg->method == SOUP_METHOD_COPY;
+  gboolean copy = soup_server_message_get_method (msg) == SOUP_METHOD_COPY;
 
   if (!str)
     goto end;
diff --git a/libphodav/phodav-method-delete.c b/libphodav/phodav-method-delete.c
index 3a0a114..15aaed3 100644
--- a/libphodav/phodav-method-delete.c
+++ b/libphodav/phodav-method-delete.c
@@ -85,7 +85,7 @@ phodav_delete_file (const gchar *path, GFile *file,
 }
 
 gint
-phodav_method_delete (PathHandler *handler, SoupMessage *msg,
+phodav_method_delete (PathHandler *handler, SoupServerMessage *msg,
                       const char *path, GError **err)
 {
   GCancellable *cancellable = handler_get_cancellable (handler);
diff --git a/libphodav/phodav-method-get.c b/libphodav/phodav-method-get.c
index f9a967d..1f3a8e2 100644
--- a/libphodav/phodav-method-get.c
+++ b/libphodav/phodav-method-get.c
@@ -82,13 +82,15 @@ get_directory_listing (GFile *file, GCancellable *cancellable, GError **err)
 }
 
 static gint
-method_get (SoupMessage *msg, GFile *file,
+method_get (SoupServerMessage *msg, GFile *file,
             GCancellable *cancellable, GError **err)
 {
   GError *error = NULL;
   gint status = SOUP_STATUS_NOT_FOUND;
   GFileInfo *info;
   const gchar *etag;
+  SoupMessageHeaders *response_headers;
+  const char *method;
 
   info = g_file_query_info (file, "standard::*,etag::*",
                             G_FILE_QUERY_INFO_NONE, cancellable, &error);
@@ -100,9 +102,9 @@ method_get (SoupMessage *msg, GFile *file,
       GString *listing;
 
       listing = get_directory_listing (file, cancellable, err);
-      soup_message_set_response (msg, "text/html; charset=utf-8",
-                                 SOUP_MEMORY_TAKE,
-                                 listing->str, listing->len);
+      soup_server_message_set_response (msg, "text/html; charset=utf-8",
+                                        SOUP_MEMORY_TAKE,
+                                        listing->str, listing->len);
       g_string_free (listing, FALSE);
       status = SOUP_STATUS_OK;
       goto end;
@@ -111,20 +113,23 @@ method_get (SoupMessage *msg, GFile *file,
   etag = g_file_info_get_etag (info);
   g_warn_if_fail (etag != NULL);
 
+  response_headers = soup_server_message_get_response_headers (msg);
+
   if (etag)
     {
       gchar *tmp = g_strdup_printf ("\"%s\"", etag);
-      soup_message_headers_append (msg->response_headers, "ETag", tmp);
+      soup_message_headers_append (response_headers, "ETag", tmp);
       g_free (tmp);
     }
 
-  soup_message_headers_set_content_type (msg->response_headers,
+  soup_message_headers_set_content_type (response_headers,
                                          g_file_info_get_content_type (info), NULL);
 
-  if (msg->method == SOUP_METHOD_GET)
+  method = soup_server_message_get_method (msg);
+  if (method == SOUP_METHOD_GET)
     {
       GMappedFile *mapping;
-      SoupBuffer *buffer;
+      GBytes *buffer;
       gchar *path = g_file_get_path (file);
 
       mapping = g_mapped_file_new (path, FALSE, NULL);
@@ -135,14 +140,15 @@ method_get (SoupMessage *msg, GFile *file,
           goto end;
         }
 
-      buffer = soup_buffer_new_with_owner (g_mapped_file_get_contents (mapping),
+      buffer = g_bytes_new_with_free_func (g_mapped_file_get_contents (mapping),
                                            g_mapped_file_get_length (mapping),
-                                           mapping, (GDestroyNotify) g_mapped_file_unref);
-      soup_message_body_append_buffer (msg->response_body, buffer);
-      soup_buffer_free (buffer);
+                                           (GDestroyNotify) g_mapped_file_unref,
+                                           mapping);
+      soup_message_body_append_bytes (soup_server_message_get_response_body (msg), buffer);
+      g_bytes_unref (buffer);
       status = SOUP_STATUS_OK;
     }
-  else if (msg->method == SOUP_METHOD_HEAD)
+  else if (method == SOUP_METHOD_HEAD)
     {
       gchar *length;
 
@@ -151,7 +157,7 @@ method_get (SoupMessage *msg, GFile *file,
        * But we'll optimize and avoid the extra I/O.
        */
       length = g_strdup_printf ("%" G_GUINT64_FORMAT, g_file_info_get_size (info));
-      soup_message_headers_append (msg->response_headers, "Content-Length", length);
+      soup_message_headers_append (response_headers, "Content-Length", length);
 
       g_free (length);
       status = SOUP_STATUS_OK;
@@ -176,7 +182,7 @@ end:
 }
 
 gint
-phodav_method_get (PathHandler *handler, SoupMessage *msg, const char *path, GError **err)
+phodav_method_get (PathHandler *handler, SoupServerMessage *msg, const char *path, GError **err)
 {
   GFile *file;
   GCancellable *cancellable = handler_get_cancellable (handler);
diff --git a/libphodav/phodav-method-lock.c b/libphodav/phodav-method-lock.c
index 76c290c..2d7a171 100644
--- a/libphodav/phodav-method-lock.c
+++ b/libphodav/phodav-method-lock.c
@@ -123,7 +123,7 @@ parse_locktype (xmlNodePtr rt)
 }
 
 gint
-phodav_method_lock (PathHandler *handler, SoupMessage *msg,
+phodav_method_lock (PathHandler *handler, SoupServerMessage *msg,
                     const char *path, GError **err)
 {
   GCancellable *cancellable = handler_get_cancellable (handler);
@@ -141,16 +141,19 @@ phodav_method_lock (PathHandler *handler, SoupMessage *msg,
   DAVLock *lock = NULL;
   gint status = SOUP_STATUS_BAD_REQUEST;
   gboolean created;
+  SoupMessageHeaders *request_headers = soup_server_message_get_request_headers (msg);
+  SoupMessageBody *request_body;
 
-  depth = depth_from_string (soup_message_headers_get_one (msg->request_headers, "Depth"));
-  timeout = timeout_from_string (soup_message_headers_get_one (msg->request_headers, "Timeout"));
+  depth = depth_from_string (soup_message_headers_get_one (request_headers, "Depth"));
+  timeout = timeout_from_string (soup_message_headers_get_one (request_headers, "Timeout"));
 
   if (depth != DEPTH_ZERO && depth != DEPTH_INFINITY)
     goto end;
 
-  if (!msg->request_body->length)
+  request_body = soup_server_message_get_request_body (msg);
+  if (!request_body->length)
     {
-      const gchar *hif = soup_message_headers_get_one (msg->request_headers, "If");
+      const gchar *hif = soup_message_headers_get_one (request_headers, "If");
       gint len = strlen (hif);
 
       if (len <= 4 || hif[0] != '(' || hif[1] != '<' || hif[len - 2] != '>' || hif[len - 1] != ')')
@@ -169,7 +172,7 @@ phodav_method_lock (PathHandler *handler, SoupMessage *msg,
       goto body;
     }
 
-  if (!davdoc_parse (&doc, msg, msg->request_body, "lockinfo"))
+  if (!davdoc_parse (&doc, msg, request_body, "lockinfo"))
     goto end;
 
   node = doc.root;
@@ -205,7 +208,7 @@ phodav_method_lock (PathHandler *handler, SoupMessage *msg,
   uuid = g_uuid_string_random ();
   token = g_strdup_printf ("urn:uuid:%s", uuid);
   ltoken = g_strdup_printf ("<%s>", token);
-  soup_message_headers_append (msg->response_headers, "Lock-Token", ltoken);
+  soup_message_headers_append (soup_server_message_get_request_headers (msg), "Lock-Token", ltoken);
 
   lpath = server_get_path (handler_get_server (handler), path);
   lock = dav_lock_new (lpath, token, scope, type, depth, owner, timeout);
@@ -232,8 +235,8 @@ body:
   xmlAddChild (node, dav_lock_get_activelock_node (lock, ns));
 
   xml_node_to_string (root, &mem, &size);
-  soup_message_set_response (msg, "application/xml",
-                             SOUP_MEMORY_TAKE, (gchar *) mem, size);
+  soup_server_message_set_response (msg, "application/xml",
+                                    SOUP_MEMORY_TAKE, (gchar *) mem, size);
 
 end:
   g_free (ltoken);
diff --git a/libphodav/phodav-method-mkcol.c b/libphodav/phodav-method-mkcol.c
index f2490cf..726f872 100644
--- a/libphodav/phodav-method-mkcol.c
+++ b/libphodav/phodav-method-mkcol.c
@@ -18,7 +18,7 @@
 #include "phodav-priv.h"
 
 static gint
-do_mkcol_file (SoupMessage *msg, GFile *file,
+do_mkcol_file (SoupServerMessage *msg, GFile *file,
                GCancellable *cancellable, GError **err)
 {
   GError *error = NULL;
@@ -44,15 +44,16 @@ do_mkcol_file (SoupMessage *msg, GFile *file,
 }
 
 gint
-phodav_method_mkcol (PathHandler *handler, SoupMessage *msg,
+phodav_method_mkcol (PathHandler *handler, SoupServerMessage *msg,
                      const char *path, GError **err)
 {
   GFile *file = NULL;
   GCancellable *cancellable = handler_get_cancellable (handler);
   gint status;
   GList *submitted = NULL;
+  SoupMessageBody *request_body = soup_server_message_get_request_body (msg);
 
-  if (msg->request_body && msg->request_body->length)
+  if (request_body && request_body->length)
     {
       status = SOUP_STATUS_UNSUPPORTED_MEDIA_TYPE;
       goto end;
diff --git a/libphodav/phodav-method-movecopy.c b/libphodav/phodav-method-movecopy.c
index b4ec78d..40b773b 100644
--- a/libphodav/phodav-method-movecopy.c
+++ b/libphodav/phodav-method-movecopy.c
@@ -71,7 +71,7 @@ end:
 }
 
 static gint
-do_movecopy_file (SoupMessage *msg, GFile *file,
+do_movecopy_file (SoupServerMessage *msg, GFile *file,
                   GFile *dest, const gchar *dest_path,
                   GCancellable *cancellable, GError **err)
 {
@@ -79,14 +79,15 @@ do_movecopy_file (SoupMessage *msg, GFile *file,
   gboolean overwrite;
   DepthType depth;
   gint status = SOUP_STATUS_PRECONDITION_FAILED;
-  gboolean copy = msg->method == SOUP_METHOD_COPY;
+  gboolean copy = soup_server_message_get_method (msg) == SOUP_METHOD_COPY;
+  SoupMessageHeaders *request_headers = soup_server_message_get_request_headers (msg);
   GFileCopyFlags flags = G_FILE_COPY_ALL_METADATA;
   gboolean retry = FALSE;
   gboolean exists;
 
-  depth = depth_from_string (soup_message_headers_get_one (msg->request_headers, "Depth"));
+  depth = depth_from_string (soup_message_headers_get_one (request_headers, "Depth"));
   overwrite = !!g_strcmp0 (
-    soup_message_headers_get_one (msg->request_headers, "Overwrite"), "F");
+    soup_message_headers_get_one (request_headers, "Overwrite"), "F");
   if (overwrite)
     flags |= G_FILE_COPY_OVERWRITE;
   exists = g_file_query_exists (dest, cancellable);
@@ -150,22 +151,22 @@ end:
 }
 
 gint
-phodav_method_movecopy (PathHandler *handler, SoupMessage *msg,
+phodav_method_movecopy (PathHandler *handler, SoupServerMessage *msg,
                         const char *path, GError **err)
 {
   GFile *file = NULL, *dest_file = NULL;
   GCancellable *cancellable = handler_get_cancellable (handler);
-  SoupURI *dest_uri = NULL;
+  GUri *dest_uri = NULL;
   gint status = SOUP_STATUS_NOT_FOUND;
   const gchar *dest;
   gchar *udest;
   GList *submitted = NULL;
 
-  dest = soup_message_headers_get_one (msg->request_headers, "Destination");
+  dest = soup_message_headers_get_one (soup_server_message_get_request_headers (msg), "Destination");
   if (!dest)
     goto end;
-  dest_uri = soup_uri_new (dest);
-  dest = soup_uri_get_path (dest_uri);
+  dest_uri = g_uri_parse (dest, SOUP_HTTP_URI_FLAGS, NULL);
+  dest = g_uri_get_path (dest_uri);
   if (!dest || !*dest)
     goto end;
 
@@ -196,7 +197,7 @@ phodav_method_movecopy (PathHandler *handler, SoupMessage *msg,
 
 end:
   if (dest_uri)
-    soup_uri_free (dest_uri);
+    g_uri_unref (dest_uri);
   g_clear_object (&file);
   g_clear_object (&dest_file);
   g_list_free_full (submitted, (GDestroyNotify) lock_submitted_free);
diff --git a/libphodav/phodav-method-propfind.c b/libphodav/phodav-method-propfind.c
index d0dc0ae..93b7350 100644
--- a/libphodav/phodav-method-propfind.c
+++ b/libphodav/phodav-method-propfind.c
@@ -137,18 +137,31 @@ end:
   return node;
 }
 
+typedef enum {
+        NODE_DATE_FORMAT_HTTP,
+        NODE_DATE_FORMAT_ISO8601
+} NodeDateFormat;
+
 static void
-node_add_time (xmlNodePtr node, guint64 time, SoupDateFormat format)
+node_add_time (xmlNodePtr node, guint64 time, NodeDateFormat format)
 {
-  SoupDate *date;
+  GDateTime *date;
   gchar *text;
 
   g_warn_if_fail (time != 0);
-  date = soup_date_new_from_time_t (time);
-  text = soup_date_to_string (date, format);
+  date = g_date_time_new_from_unix_utc (time);
+  switch (format)
+    {
+    case NODE_DATE_FORMAT_HTTP:
+      text = soup_date_time_to_string (date, SOUP_DATE_HTTP);
+      break;
+    case NODE_DATE_FORMAT_ISO8601:
+      text = g_date_time_format_iso8601 (date);
+      break;
+    }
   xmlAddChild (node, xmlNewText (BAD_CAST text));
   g_free (text);
-  soup_date_free (date);
+  g_date_time_unref (date);
 }
 
 static xmlNodePtr
@@ -173,7 +186,7 @@ prop_creationdate (PathHandler *handler, PropFind *pf,
   if (time == 0)
     status = SOUP_STATUS_NOT_FOUND;
   else
-    node_add_time (node, time, SOUP_DATE_HTTP);
+    node_add_time (node, time, NODE_DATE_FORMAT_HTTP);
 
 end:
   PROP_SET_STATUS (node, status);
@@ -197,7 +210,7 @@ prop_getlastmodified (PathHandler *handler, PropFind *pf,
   if (time == 0)
     status = SOUP_STATUS_NOT_FOUND;
   else
-    node_add_time (node, time, SOUP_DATE_ISO8601);
+    node_add_time (node, time, NODE_DATE_FORMAT_ISO8601);
 
 end:
   PROP_SET_STATUS (node, status);
@@ -684,7 +697,7 @@ end:
 }
 
 gint
-phodav_method_propfind (PathHandler *handler, SoupMessage *msg,
+phodav_method_propfind (PathHandler *handler, SoupServerMessage *msg,
                         const char *path, GError **err)
 {
   PropFind *pf = NULL;
@@ -693,9 +706,11 @@ phodav_method_propfind (PathHandler *handler, SoupMessage *msg,
   DavDoc doc = {0, };
   gint status = SOUP_STATUS_NOT_FOUND;
   xmlNsPtr ns = NULL;
+  SoupMessageHeaders *request_headers = soup_server_message_get_request_headers (msg);
+  SoupMessageBody *request_body = soup_server_message_get_request_body (msg);
 
-  depth = depth_from_string (soup_message_headers_get_one (msg->request_headers, "Depth"));
-  if (!msg->request_body || !msg->request_body->length)
+  depth = depth_from_string (soup_message_headers_get_one (request_headers, "Depth"));
+  if (!request_body || !request_body->length)
     {
       /* Win kludge: http://code.google.com/p/sabredav/wiki/Windows */
       pf = propfind_new ();
@@ -703,7 +718,7 @@ phodav_method_propfind (PathHandler *handler, SoupMessage *msg,
     }
   else
     {
-      if (!davdoc_parse (&doc, msg, msg->request_body, "propfind"))
+      if (!davdoc_parse (&doc, msg, request_body, "propfind"))
         {
           status = SOUP_STATUS_BAD_REQUEST;
           goto end;
diff --git a/libphodav/phodav-method-proppatch.c b/libphodav/phodav-method-proppatch.c
index 3421e32..a3cc886 100644
--- a/libphodav/phodav-method-proppatch.c
+++ b/libphodav/phodav-method-proppatch.c
@@ -92,7 +92,7 @@ set_attr (GFile *file, xmlNodePtr attrnode,
 }
 
 static gint
-prop_set (SoupMessage *msg,
+prop_set (SoupServerMessage *msg,
           GFile *file, xmlNodePtr parent, xmlNodePtr *attr,
           gboolean remove, GCancellable *cancellable)
 {
@@ -134,7 +134,7 @@ prop_set (SoupMessage *msg,
 }
 
 gint
-phodav_method_proppatch (PathHandler *handler, SoupMessage *msg,
+phodav_method_proppatch (PathHandler *handler, SoupServerMessage *msg,
                          const char *path, GError **err)
 {
   GCancellable *cancellable = handler_get_cancellable (handler);
@@ -145,7 +145,7 @@ phodav_method_proppatch (PathHandler *handler, SoupMessage *msg,
   GList *props = NULL, *submitted = NULL;
   gint status;
 
-  if (!davdoc_parse (&doc, msg, msg->request_body, "propertyupdate"))
+  if (!davdoc_parse (&doc, msg, soup_server_message_get_request_body (msg), "propertyupdate"))
     {
       status = SOUP_STATUS_BAD_REQUEST;
       goto end;
diff --git a/libphodav/phodav-method-put.c b/libphodav/phodav-method-put.c
index 785996b..e426fdd 100644
--- a/libphodav/phodav-method-put.c
+++ b/libphodav/phodav-method-put.c
@@ -19,8 +19,8 @@
 #include "phodav-utils.h"
 
 static void
-method_put_finished (SoupMessage *msg,
-                     gpointer     user_data)
+method_put_finished (SoupServerMessage *msg,
+                     gpointer           user_data)
 {
   GFileOutputStream *output = user_data;
 
@@ -30,20 +30,24 @@ method_put_finished (SoupMessage *msg,
 }
 
 static void
-method_put_got_chunk (SoupMessage *msg,
-                      SoupBuffer  *chunk,
-                      gpointer     user_data)
+method_put_got_chunk (SoupServerMessage *msg,
+                      GBytes            *chunk,
+                      gpointer           user_data)
 {
   GFileOutputStream *output = user_data;
   PathHandler *handler = g_object_get_data (user_data, "handler");
   GCancellable *cancellable = handler_get_cancellable (handler);
   GError *err = NULL;
   gsize bytes_written;
+  gpointer data;
+  gsize data_length;
 
   g_debug ("PUT got chunk");
 
+  data = g_bytes_get_data (chunk, &data_length);
+
   if (!g_output_stream_write_all (G_OUTPUT_STREAM (output),
-                                  chunk->data, chunk->length,
+                                  data, data_length,
                                   &bytes_written, cancellable, &err))
     goto end;
 
@@ -52,19 +56,19 @@ end:
     {
       g_warning ("error: %s", err->message);
       g_clear_error (&err);
-      soup_message_set_status (msg, SOUP_STATUS_INTERNAL_SERVER_ERROR);
+      soup_server_message_set_status (msg, SOUP_STATUS_INTERNAL_SERVER_ERROR, NULL);
     }
 }
 
 static gint
-put_start (SoupMessage *msg, GFile *file,
+put_start (SoupServerMessage *msg, GFile *file,
            GFileOutputStream **output, GCancellable *cancellable,
            GError **err)
 {
   GFileOutputStream *s = NULL;
   gchar *etag = NULL;
   gboolean created = TRUE;
-  SoupMessageHeaders *headers = msg->request_headers;
+  SoupMessageHeaders *headers = soup_server_message_get_request_headers (msg);
   gint status = SOUP_STATUS_INTERNAL_SERVER_ERROR;
 
   if (g_file_query_exists (file, cancellable))
@@ -89,17 +93,18 @@ end:
 }
 
 void
-phodav_method_put (PathHandler *handler, SoupMessage *msg, const gchar *path, GError **err)
+phodav_method_put (PathHandler *handler, SoupServerMessage *msg, const gchar *path, GError **err)
 {
   GCancellable *cancellable = handler_get_cancellable (handler);
   GFile *file = NULL;
   GList *submitted = NULL;
   GFileOutputStream *output = NULL;
   gint status;
+  SoupMessageHeaders *request_headers = soup_server_message_get_request_headers (msg);
 
-  g_debug ("%s %s HTTP/1.%d %s %s", msg->method, path, soup_message_get_http_version (msg),
-           soup_message_headers_get_one (msg->request_headers, "X-Litmus") ? : "",
-           soup_message_headers_get_one (msg->request_headers, "X-Litmus-Second") ? : "");
+  g_debug ("%s %s HTTP/1.%d %s %s", soup_server_message_get_method (msg), path, 
soup_server_message_get_http_version (msg),
+           soup_message_headers_get_one (request_headers, "X-Litmus") ? : "",
+           soup_message_headers_get_one (request_headers, "X-Litmus-Second") ? : "");
 
   if (handler_get_readonly(handler))
     {
@@ -117,13 +122,13 @@ phodav_method_put (PathHandler *handler, SoupMessage *msg, const gchar *path, GE
     goto end;
 
   g_debug ("PUT output %p", output);
-  soup_message_body_set_accumulate (msg->request_body, FALSE);
+  soup_message_body_set_accumulate (soup_server_message_get_request_body (msg), FALSE);
   g_object_set_data (G_OBJECT (output), "handler", handler);
   g_signal_connect (msg, "got-chunk", G_CALLBACK (method_put_got_chunk), output);
   g_signal_connect (msg, "finished", G_CALLBACK (method_put_finished), output);
 
 end:
-  soup_message_set_status (msg, status);
+  soup_server_message_set_status (msg, status, NULL);
   g_clear_object (&file);
-  g_debug ("  -> %d %s\n", msg->status_code, msg->reason_phrase);
+  g_debug ("  -> %d %s\n", soup_server_message_get_status (msg), soup_server_message_get_reason_phrase 
(msg));
 }
diff --git a/libphodav/phodav-method-unlock.c b/libphodav/phodav-method-unlock.c
index 8f51991..370f13d 100644
--- a/libphodav/phodav-method-unlock.c
+++ b/libphodav/phodav-method-unlock.c
@@ -33,14 +33,14 @@ remove_brackets (const gchar *str)
 }
 
 gint
-phodav_method_unlock (PathHandler *handler, SoupMessage *msg,
+phodav_method_unlock (PathHandler *handler, SoupServerMessage *msg,
                       const char *path, GError **err)
 {
   DAVLock *lock;
   gint status = SOUP_STATUS_BAD_REQUEST;
 
   gchar *token = remove_brackets (
-                                  soup_message_headers_get_one (msg->request_headers, "Lock-Token"));
+                                  soup_message_headers_get_one (soup_server_message_get_request_headers 
(msg), "Lock-Token"));
 
   g_return_val_if_fail (token != NULL, SOUP_STATUS_BAD_REQUEST);
 
diff --git a/libphodav/phodav-multistatus.c b/libphodav/phodav-multistatus.c
index 12a2594..d8f48e8 100644
--- a/libphodav/phodav-multistatus.c
+++ b/libphodav/phodav-multistatus.c
@@ -61,7 +61,7 @@ status_node_new (xmlNsPtr ns, gint status)
 }
 
 static void
-add_propstat (xmlNodePtr parent, xmlNsPtr ns, SoupMessage *msg,
+add_propstat (xmlNodePtr parent, xmlNsPtr ns, SoupServerMessage *msg,
               const gchar *path, GList *props)
 {
   xmlNodePtr node, propstat, prop = NULL, stnode = NULL;
@@ -92,7 +92,7 @@ add_propstat (xmlNodePtr parent, xmlNsPtr ns, SoupMessage *msg,
 }
 
 gint
-set_response_multistatus (SoupMessage *msg,
+set_response_multistatus (SoupServerMessage *msg,
                           GHashTable  *mstatus)
 {
   xmlChar *mem = NULL;
@@ -111,14 +111,14 @@ set_response_multistatus (SoupMessage *msg,
   while (g_hash_table_iter_next (&iter, (gpointer *) &path, (gpointer *) &resp))
     {
       xmlNodePtr response;
-      SoupURI *new_uri;
+      GUri *new_uri;
 
       response = xmlNewChild (root, ns, BAD_CAST "response", NULL);
-      new_uri = soup_uri_new_with_base (soup_message_get_uri (msg), path);
-      text = soup_uri_to_string (new_uri, FALSE);
+      new_uri = g_uri_parse_relative (soup_server_message_get_uri (msg), path, SOUP_HTTP_URI_FLAGS, NULL);
+      text = g_uri_to_string (new_uri);
       xmlNewChild (response, ns, BAD_CAST "href", BAD_CAST text);
       g_free (text);
-      soup_uri_free (new_uri);
+      g_uri_unref (new_uri);
 
       if (resp->props)
         add_propstat (response, ns, msg, path, resp->props);
@@ -127,8 +127,8 @@ set_response_multistatus (SoupMessage *msg,
     }
 
   xml_node_to_string (root, &mem, &size);
-  soup_message_set_response (msg, "application/xml",
-                             SOUP_MEMORY_TAKE, (gchar *) mem, size);
+  soup_server_message_set_response (msg, "application/xml",
+                                    SOUP_MEMORY_TAKE, (gchar *) mem, size);
 
   return SOUP_STATUS_MULTI_STATUS;
 }
diff --git a/libphodav/phodav-multistatus.h b/libphodav/phodav-multistatus.h
index a81984a..fc2cde3 100644
--- a/libphodav/phodav-multistatus.h
+++ b/libphodav/phodav-multistatus.h
@@ -32,8 +32,8 @@ Response *     response_new                      (GList       *props,
                                                   gint         status);
 void           response_free                     (Response    *h);
 
-gint           set_response_multistatus          (SoupMessage *msg,
-                                                  GHashTable  *mstatus);
+gint           set_response_multistatus          (SoupServerMessage *msg,
+                                                  GHashTable        *mstatus);
 G_END_DECLS
 
 #endif /* __PHODAV_MULTISTATUS_H__ */
diff --git a/libphodav/phodav-priv.h b/libphodav/phodav-priv.h
index aee60d1..65a9417 100644
--- a/libphodav/phodav-priv.h
+++ b/libphodav/phodav-priv.h
@@ -90,30 +90,30 @@ gboolean                server_path_has_other_locks          (PhodavServer *self
 Path *                  server_get_path                      (PhodavServer *self,
                                                               const gchar *_path);
 
-gint                    phodav_check_if                      (PathHandler *handler, SoupMessage *msg,
+gint                    phodav_check_if                      (PathHandler *handler, SoupServerMessage *msg,
                                                               const gchar *path, GList **locks);
 
 gint                    phodav_delete_file                   (const gchar *path, GFile *file,
                                                               GHashTable *mstatus,
                                                               GCancellable *cancellable);
 
-gint                    phodav_method_get                    (PathHandler *handler, SoupMessage *msg,
+gint                    phodav_method_get                    (PathHandler *handler, SoupServerMessage *msg,
                                                               const char *path, GError **err);
-gint                    phodav_method_propfind               (PathHandler *handler, SoupMessage *msg,
+gint                    phodav_method_propfind               (PathHandler *handler, SoupServerMessage *msg,
                                                               const char *path, GError **err);
-gint                    phodav_method_proppatch              (PathHandler *handler, SoupMessage *msg,
+gint                    phodav_method_proppatch              (PathHandler *handler, SoupServerMessage *msg,
                                                               const char *path, GError **err);
-gint                    phodav_method_mkcol                  (PathHandler *handler, SoupMessage *msg,
+gint                    phodav_method_mkcol                  (PathHandler *handler, SoupServerMessage *msg,
                                                               const char *path, GError **err);
-gint                    phodav_method_delete                 (PathHandler *handler, SoupMessage *msg,
+gint                    phodav_method_delete                 (PathHandler *handler, SoupServerMessage *msg,
                                                               const char *path, GError **err);
-gint                    phodav_method_movecopy               (PathHandler *handler, SoupMessage *msg,
+gint                    phodav_method_movecopy               (PathHandler *handler, SoupServerMessage *msg,
                                                               const char *path, GError **err);
-gint                    phodav_method_lock                   (PathHandler *handler, SoupMessage *msg,
+gint                    phodav_method_lock                   (PathHandler *handler, SoupServerMessage *msg,
                                                               const char *path, GError **err);
-gint                    phodav_method_unlock                 (PathHandler *handler, SoupMessage *msg,
+gint                    phodav_method_unlock                 (PathHandler *handler, SoupServerMessage *msg,
                                                               const char *path, GError **err);
-void                    phodav_method_put                    (PathHandler *handler, SoupMessage *msg,
+void                    phodav_method_put                    (PathHandler *handler, SoupServerMessage *msg,
                                                               const gchar *path, GError **err);
 
 G_END_DECLS
diff --git a/libphodav/phodav-server.c b/libphodav/phodav-server.c
index b648ca9..b86ef6b 100644
--- a/libphodav/phodav-server.c
+++ b/libphodav/phodav-server.c
@@ -63,15 +63,13 @@ enum {
 };
 
 static void server_callback (SoupServer        *server,
-                             SoupMessage       *msg,
+                             SoupServerMessage *msg,
                              const char        *path,
                              GHashTable        *query,
-                             SoupClientContext *context,
                              gpointer           user_data);
 
 static void request_started (SoupServer        *server,
-                             SoupMessage       *message,
-                             SoupClientContext *client,
+                             SoupServerMessage *message,
                              gpointer           user_data);
 
 Path *
@@ -175,7 +173,7 @@ phodav_server_constructed (GObject *gobject)
 {
   PhodavServer *self = PHODAV_SERVER (gobject);
 
-  self->server = soup_server_new (SOUP_SERVER_SERVER_HEADER, "PhodavServer ",
+  self->server = soup_server_new ("server-header", "PhodavServer ",
                                   NULL);
 
   update_root_handler (self);
@@ -444,15 +442,15 @@ server_path_has_other_locks (PhodavServer *self, const gchar *path, GList *locks
 }
 
 static void
-got_headers (SoupMessage *msg,
+got_headers (SoupServerMessage *msg,
              gpointer     user_data)
 {
   PhodavServer *self = user_data;
-  SoupURI *uri = soup_message_get_uri (msg);
-  const gchar *path = uri->path;
+  GUri *uri = soup_server_message_get_uri (msg);
+  const gchar *path = g_uri_get_path (uri);
   GError *err = NULL;
 
-  if (msg->method == SOUP_METHOD_PUT)
+  if (soup_server_message_get_method (msg) == SOUP_METHOD_PUT)
     phodav_method_put (self->root_handler, msg, path, &err);
 
   if (err)
@@ -464,8 +462,7 @@ got_headers (SoupMessage *msg,
 
 static void
 request_started (SoupServer        *server,
-                 SoupMessage       *message,
-                 SoupClientContext *client,
+                 SoupServerMessage *message,
                  gpointer           user_data)
 {
   PhodavServer *self = user_data;
@@ -474,26 +471,29 @@ request_started (SoupServer        *server,
 }
 
 static void
-server_callback (SoupServer *server, SoupMessage *msg,
+server_callback (SoupServer *server, SoupServerMessage *msg,
                  const char *path, GHashTable *query,
-                 SoupClientContext *context, gpointer user_data)
+                 gpointer user_data)
 {
   GError *err = NULL;
   PathHandler *handler = user_data;
   gint status = SOUP_STATUS_NOT_IMPLEMENTED;
-  SoupURI *uri = soup_message_get_uri (msg);
+  GUri *uri = soup_server_message_get_uri (msg);
+  const char *method = soup_server_message_get_method (msg);
+  SoupMessageHeaders *request_headers = soup_server_message_get_request_headers (msg);
+  SoupMessageHeaders *response_headers;
   GHashTable *params;
 
-  g_debug ("%s %s HTTP/1.%d %s %s", msg->method, path, soup_message_get_http_version (msg),
-           soup_message_headers_get_one (msg->request_headers, "X-Litmus") ? : "",
-           soup_message_headers_get_one (msg->request_headers, "X-Litmus-Second") ? : "");
+  g_debug ("%s %s HTTP/1.%d %s %s", method, path, soup_server_message_get_http_version (msg),
+           soup_message_headers_get_one (request_headers, "X-Litmus") ? : "",
+           soup_message_headers_get_one (request_headers, "X-Litmus-Second") ? : "");
 
   if (!(path && *path == '/'))
     {
       g_debug ("path must begin with /");
       return;
     }
-  if (!(uri && uri->fragment == NULL))
+  if (!(uri && g_uri_get_fragment (uri) == NULL))
     {
       g_debug ("using fragments in query is not supported");
       return;
@@ -501,53 +501,54 @@ server_callback (SoupServer *server, SoupMessage *msg,
 
   params = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
   g_hash_table_insert (params, g_strdup ("charset"), g_strdup ("utf-8"));
-  soup_message_headers_set_content_type (msg->response_headers,
+  response_headers = soup_server_message_get_response_headers (msg);
+  soup_message_headers_set_content_type (response_headers,
                                          "text/xml", params);
   g_hash_table_destroy (params);
 
   if (handler->self->readonly &&
-      (msg->method == SOUP_METHOD_PROPPATCH ||
-       msg->method == SOUP_METHOD_MKCOL ||
-       msg->method == SOUP_METHOD_DELETE ||
-       msg->method == SOUP_METHOD_MOVE ||
-       msg->method == SOUP_METHOD_COPY ||
-       msg->method == SOUP_METHOD_LOCK))
+      (method == SOUP_METHOD_PROPPATCH ||
+       method == SOUP_METHOD_MKCOL ||
+       method == SOUP_METHOD_DELETE ||
+       method == SOUP_METHOD_MOVE ||
+       method == SOUP_METHOD_COPY ||
+       method == SOUP_METHOD_LOCK))
       status = SOUP_STATUS_FORBIDDEN;
-  else if (msg->method == SOUP_METHOD_OPTIONS)
+  else if (method == SOUP_METHOD_OPTIONS)
     {
-      soup_message_headers_append (msg->response_headers, "DAV", "1,2");
+      soup_message_headers_append (response_headers, "DAV", "1,2");
 
       /* according to http://code.google.com/p/sabredav/wiki/Windows */
-      soup_message_headers_append (msg->response_headers, "MS-Author-Via", "DAV");
+      soup_message_headers_append (response_headers, "MS-Author-Via", "DAV");
 
-      soup_message_headers_append (msg->response_headers, "Allow",
+      soup_message_headers_append (response_headers, "Allow",
                                    "GET, HEAD, PUT, PROPFIND, PROPPATCH, MKCOL, DELETE, MOVE, COPY, LOCK, 
UNLOCK");
       status = SOUP_STATUS_OK;
     }
-  else if (msg->method == SOUP_METHOD_GET ||
-           msg->method == SOUP_METHOD_HEAD)
+  else if (method == SOUP_METHOD_GET ||
+           method == SOUP_METHOD_HEAD)
     status = phodav_method_get (handler, msg, path, &err);
-  else if (msg->method == SOUP_METHOD_PROPFIND)
+  else if (method == SOUP_METHOD_PROPFIND)
     status = phodav_method_propfind (handler, msg, path, &err);
-  else if (msg->method == SOUP_METHOD_PROPPATCH)
+  else if (method == SOUP_METHOD_PROPPATCH)
     status = phodav_method_proppatch (handler, msg, path, &err);
-  else if (msg->method == SOUP_METHOD_MKCOL)
+  else if (method == SOUP_METHOD_MKCOL)
     status = phodav_method_mkcol (handler, msg, path, &err);
-  else if (msg->method == SOUP_METHOD_DELETE)
+  else if (method == SOUP_METHOD_DELETE)
     status = phodav_method_delete (handler, msg, path, &err);
-  else if (msg->method == SOUP_METHOD_MOVE ||
-           msg->method == SOUP_METHOD_COPY)
+  else if (method == SOUP_METHOD_MOVE ||
+           method == SOUP_METHOD_COPY)
     status = phodav_method_movecopy (handler, msg, path, &err);
-  else if (msg->method == SOUP_METHOD_LOCK)
+  else if (method == SOUP_METHOD_LOCK)
     status = phodav_method_lock (handler, msg, path, &err);
-  else if (msg->method == SOUP_METHOD_UNLOCK)
+  else if (method == SOUP_METHOD_UNLOCK)
     status = phodav_method_unlock (handler, msg, path, &err);
   else
     g_warn_if_reached ();
 
-  soup_message_set_status (msg, status);
+  soup_server_message_set_status (msg, status, NULL);
 
-  g_debug ("  -> %d %s\n", msg->status_code, msg->reason_phrase);
+  g_debug ("  -> %d %s\n", soup_server_message_get_status (msg), soup_server_message_get_reason_phrase 
(msg));
   if (err)
     {
       g_warning ("error: %s", err->message);
diff --git a/libphodav/phodav-utils.c b/libphodav/phodav-utils.c
index 9362c30..c935384 100644
--- a/libphodav/phodav-utils.c
+++ b/libphodav/phodav-utils.c
@@ -77,23 +77,23 @@ parse_xml (const gchar  *data,
 }
 
 gboolean
-davdoc_parse (DavDoc *dd, SoupMessage *msg, SoupMessageBody *body,
+davdoc_parse (DavDoc *dd, SoupServerMessage *msg, SoupMessageBody *body,
               const gchar *name)
 {
   xmlDocPtr doc;
   xmlNodePtr root;
-  SoupURI *uri;
+  GUri *uri;
 
   doc = parse_xml (body->data, body->length, &root, name);
   if (!doc)
     return FALSE;
 
-  uri = soup_message_get_uri (msg);
+  uri = soup_server_message_get_uri (msg);
 
   dd->doc = doc;
   dd->root = root;
   dd->target = uri;
-  dd->path = g_uri_unescape_string (uri->path, "/");
+  dd->path = g_uri_unescape_string (g_uri_get_path (uri), "/");
 
   return TRUE;
 }
diff --git a/libphodav/phodav-utils.h b/libphodav/phodav-utils.h
index 1cbfd26..74eefc0 100644
--- a/libphodav/phodav-utils.h
+++ b/libphodav/phodav-utils.h
@@ -35,11 +35,11 @@ struct _DavDoc
   xmlDocPtr  doc;
   xmlNodePtr root;
 
-  SoupURI   *target;
+  GUri      *target;
   char      *path;
 };
 
-gboolean         davdoc_parse                    (DavDoc *dd, SoupMessage *msg,
+gboolean         davdoc_parse                    (DavDoc *dd, SoupServerMessage *msg,
                                                   SoupMessageBody *body,
                                                   const gchar *name);
 void             davdoc_free                     (DavDoc *dd);
diff --git a/meson.build b/meson.build
index b8ff125..8163c06 100644
--- a/meson.build
+++ b/meson.build
@@ -34,7 +34,7 @@ else
   deps += dependency('gio-unix-2.0', version : '>= 2.44')
 endif
 
-deps += dependency('libsoup-2.4', version : '>= 2.48.0')
+deps += dependency('libsoup-3.0', version : '>= 3.0.0')
 deps += dependency('libxml-2.0')
 
 d1 = dependency('avahi-gobject', required : get_option('avahi'))
diff --git a/tests/virtual-dir-server.c b/tests/virtual-dir-server.c
index 2678e74..6058ebd 100644
--- a/tests/virtual-dir-server.c
+++ b/tests/virtual-dir-server.c
@@ -126,6 +126,8 @@ main (int argc, char *argv[])
     g_io_channel_unref (stdin_channel);
   }
 
+  g_print ("OK\n");
+
   g_main_loop_run (loop);
   g_main_loop_unref (loop);
   g_object_unref (phodav);
diff --git a/tests/virtual-dir.c b/tests/virtual-dir.c
index 7273b49..7bec362 100644
--- a/tests/virtual-dir.c
+++ b/tests/virtual-dir.c
@@ -43,19 +43,24 @@ test_generic (gconstpointer data)
   if (test->method == SOUP_METHOD_COPY)
     {
       gchar *dest_uri = g_build_path ("/", SERVER_URI, test->destination, NULL);
-      soup_message_headers_append (msg->request_headers, "Destination", dest_uri);
+      soup_message_headers_append (soup_message_get_request_headers (msg), "Destination", dest_uri);
       g_free (dest_uri);
     }
 
   if (test->method == SOUP_METHOD_PUT)
     {
-      soup_message_body_append (msg->request_body, SOUP_MEMORY_STATIC,
-                                test_put_data, strlen (test_put_data));
+      GBytes *bytes;
+
+      bytes = g_bytes_new_static (test_put_data, strlen (test_put_data));
+      soup_message_set_request_body_from_bytes (msg, NULL, bytes);
+      g_bytes_unref (bytes);
     }
 
-  GInputStream *in = soup_session_send (session, msg, NULL, NULL);
+  GError *error = NULL;
+  GInputStream *in = soup_session_send (session, msg, NULL, &error);
+  g_assert_no_error (error);
 
-  g_assert_cmpint (msg->status_code, ==, test->status_code);
+  g_assert_cmpint (soup_message_get_status (msg), ==, test->status_code);
 
   g_object_unref (in);
   g_object_unref (msg);
@@ -97,7 +102,7 @@ main (int argc, char *argv[])
   GError *error = NULL;
   GSubprocess *server_subproc;
   server_subproc = g_subprocess_new (
-    G_SUBPROCESS_FLAGS_STDIN_PIPE, &error,
+    G_SUBPROCESS_FLAGS_STDIN_PIPE | G_SUBPROCESS_FLAGS_STDOUT_PIPE, &error,
     "tests/virtual-dir-server", "--quit-on-stdin", NULL);
 
   if (error) {
@@ -106,6 +111,29 @@ main (int argc, char *argv[])
     return 1;
   }
 
+  /* wait for the server to start */
+  GDataInputStream *stream = g_data_input_stream_new (g_subprocess_get_stdout_pipe (server_subproc));
+  g_filter_input_stream_set_close_base_stream (G_FILTER_INPUT_STREAM (stream), FALSE);
+  gboolean server_started = FALSE;
+  while (!server_started) {
+    char *line = g_data_input_stream_read_line_utf8 (stream, NULL, NULL, &error);
+
+    if (error) {
+      g_printerr ("Failed to start virtual-dir-server: %s\n", error->message);
+      g_error_free (error);
+      return 1;
+    }
+
+    if (line == NULL) {
+      g_printerr ("Failed to start virtual-dir-server\n");
+      return 1;
+    }
+
+    server_started = g_strcmp0 (line, "OK") == 0;
+    g_free (line);
+  }
+  g_object_unref (stream);
+
   g_test_init (&argc, &argv, NULL);
 
   session = soup_session_new ();


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