[phodav/carlosgc/soup3] Port to libsoup3
- From: Carlos Garcia Campos <carlosgc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [phodav/carlosgc/soup3] Port to libsoup3
- Date: Tue, 28 Jun 2022 12:46:15 +0000 (UTC)
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]