summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Kellner <gicmo@gnome.org>2008-01-16 16:02:44 +0000
committerChristian Kellner <gicmo@src.gnome.org>2008-01-16 16:02:44 +0000
commit1eb27e74f98bc7cdd02fb7a530a42590b3a5d94a (patch)
tree427bd9979e8af175858350d767eb2784cc9f0f63
parent0e7c90f52fa6474b96cb7afe14fe9b367c590e8f (diff)
downloadgvfs-1eb27e74f98bc7cdd02fb7a530a42590b3a5d94a.tar.gz
A few cleanups.
2008-01-16 Christian Kellner <gicmo@gnome.org> * daemon/gvfsbackenddav.c: * daemon/gvfsbackendhttp.c: * daemon/gvfsbackendhttp.h: A few cleanups. svn path=/trunk/; revision=1141
-rw-r--r--ChangeLog8
-rw-r--r--daemon/gvfsbackenddav.c205
-rw-r--r--daemon/gvfsbackendhttp.c78
-rw-r--r--daemon/gvfsbackendhttp.h6
4 files changed, 169 insertions, 128 deletions
diff --git a/ChangeLog b/ChangeLog
index 50bcdd17..4a5341c1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
2008-01-16 Christian Kellner <gicmo@gnome.org>
+ * daemon/gvfsbackenddav.c:
+ * daemon/gvfsbackendhttp.c:
+ * daemon/gvfsbackendhttp.h:
+ A few cleanups.
+
+2008-01-16 Christian Kellner <gicmo@gnome.org>
+
* daemon/gvfsbackenddav.c:
* daemon/gvfsbackendhttp.c:
* daemon/gvfsbackendhttp.h:
@@ -11,6 +18,7 @@
* daemon/Makefile.am:
Make building of http optional (and depend on wether
libsoup is found or not)
+ Patch from Dan Winship.
2008-01-16 Frederic Crozat <fcrozat@mandriva.com>
diff --git a/daemon/gvfsbackenddav.c b/daemon/gvfsbackenddav.c
index 2ccb0ef0..bca998c0 100644
--- a/daemon/gvfsbackenddav.c
+++ b/daemon/gvfsbackenddav.c
@@ -96,9 +96,6 @@ sm_has_header (SoupMessage *msg, const char *header)
return soup_message_headers_get (msg->response_headers, header) != NULL;
}
-/* ************************************************************************* */
-/* */
-
static inline void
send_message (GVfsBackend *backend,
SoupMessage *message,
@@ -111,25 +108,84 @@ send_message (GVfsBackend *backend,
callback, user_data);
}
-static inline SoupMessage *
-message_new_from_filename (GVfsBackend *backend,
- const char *method,
- const char *filename)
+static char *
+path_get_parent_dir (const char *path)
{
- SoupMessage *msg;
- SoupURI *uri;
+ char *parent;
+ size_t len;
+
+ if ((len = strlen (path)) < 1)
+ return NULL;
- uri = g_vfs_backend_uri_for_filename (backend, filename);
- msg = soup_message_new_from_uri (method, uri);
- soup_uri_free (uri);
+ /* maybe this should be while, but then again
+ * I should be reading the uri rfc and see
+ * what the deal was with multiple slashes */
- soup_message_headers_append (msg->request_headers,
- "User-Agent", "gvfs/" VERSION);
- return msg;
+ if (path[len - 1] == '/')
+ len--;
+
+ parent = g_strrstr_len (path, len, "/");
+
+ if (parent == NULL)
+ return NULL;
+
+ return g_strndup (path, (parent - path) + 1);
+}
+
+static char *
+uri_get_basename (const char *uri_str)
+{
+ const char *parent;
+ const char *path;
+ char *to_free;
+ char *basename;
+ size_t len;
+
+ if (uri_str == NULL || *uri_str == '\0')
+ return NULL;
+
+ path = uri_str;
+
+ /* remove any leading slashes */
+ while (*path == '/' || *path == ' ')
+ path++;
+
+ len = strlen (path);
+
+ if (len == 0)
+ return g_strdup ("/");
+
+ /* remove any trailing slashes */
+ while (path[len - 1] == '/' || path[len - 1] == ' ')
+ len--;
+
+ parent = g_strrstr_len (path, len, "/");
+
+ if (parent)
+ {
+ parent++; /* skip the found / char */
+ to_free = g_strndup (parent, (len - (parent - path)));
+ }
+ else
+ to_free = g_strndup (path, len);
+
+ basename = soup_uri_decode (to_free);
+ g_free (to_free);
+
+ return basename;
}
/* ************************************************************************* */
/* */
+
+static inline gboolean
+node_has_name (xmlNodePtr node, const char *name)
+{
+ g_return_val_if_fail (node != NULL, FALSE);
+
+ return ! strcmp ((char *) node->name, name);
+}
+
static xmlDocPtr
multistatus_parse_xml (SoupMessage *msg, xmlNodePtr *root, GError **error)
{
@@ -278,24 +334,12 @@ multistatus_parse_response (xmlDocPtr doc,
else if (! strcmp ((char *) node->name, "href"))
{
xmlChar *text;
- char *path;
- char *p;
- size_t len;
- /* FIXME: redo this (quickly hacked together) */
text = xmlNodeGetContent (node);
- path = (char *) text;
-
- if ((len = strlen (path)) > 1)
- {
- if (path[len - 1] == '/')
- len--;
- }
-
- p = g_strrstr_len (path, len, "/");
-
- name = g_strndup (p + 1, (len - (p - path + 1)));
+ name = uri_get_basename ((char *) text);
+ xmlFree (text);
}
+
else if (! strcmp ((char *) node->name, "propstat"))
{
xmlNodePtr iter;
@@ -407,35 +451,36 @@ create_propfind_request (GFileAttributeMatcher *matcher, gulong *size)
/* ************************************************************************* */
/* */
-
static void
-do_authentication (SoupSession *session,
+soup_authenticate (SoupSession *session,
SoupMessage *msg,
- gchar *auth_type,
- gchar *auth_realm,
- char **username,
- char **password,
- gboolean is_reprompt,
- gpointer user_data)
+ SoupAuth *auth,
+ gboolean retrying,
+ gpointer data)
{
GVfsBackendDav *backend;
GVfsJobMount *job;
SoupURI *mount_base;
gboolean res;
gboolean aborted;
+ const char *auth_realm;
char *prompt;
char *new_password;
char *new_user;
- job = G_VFS_JOB_MOUNT (user_data);
+ job = G_VFS_JOB_MOUNT (data);
backend = G_VFS_BACKEND_DAV (job->backend);
mount_base = G_VFS_BACKEND_HTTP (backend)->mount_base;
- new_user = new_password = NULL;
- prompt = g_strdup_printf (_("Enter password for %s"), auth_realm);
+ auth_realm = soup_auth_get_realm (auth);
+
+ if (auth_realm == NULL)
+ auth_realm = _("WebDAV share");
- g_print ("+ authenticate \n");
+ prompt = g_strdup_printf (_("Enter password for %s"), auth_realm);
+ new_user = new_password = NULL;
+
res = g_mount_source_ask_password (backend->mount_source,
prompt,
mount_base->user,
@@ -446,60 +491,14 @@ do_authentication (SoupSession *session,
&new_password,
&new_user,
NULL);
-
if (res && !aborted)
{
- g_print ("Setting u/p\n");
- *username = new_user;
- *password = new_password;
+ soup_auth_authenticate (auth, new_user, new_password);
}
- else
- {
- g_free (new_user);
- g_free (new_password);
- }
+ g_free (new_user);
+ g_free (new_password);
g_free (prompt);
-
- g_print ("- authenticate \n");
-}
-
-static void
-authenticate (SoupSession *session,
- SoupMessage *msg,
- gchar *auth_type,
- gchar *auth_realm,
- char **username,
- char **password,
- gpointer user_data)
-{
- do_authentication (session,
- msg,
- auth_type,
- auth_realm,
- username,
- password,
- FALSE,
- user_data);
-}
-
-static void
-reauthenticate (SoupSession *session,
- SoupMessage *msg,
- gchar *auth_type,
- gchar *auth_realm,
- gpointer username,
- gpointer password,
- gpointer user_data)
-{
- do_authentication (session,
- msg,
- auth_type,
- auth_realm,
- username,
- password,
- TRUE,
- user_data);
}
static void discover_mount_root_ready (SoupSession *session,
@@ -545,27 +544,18 @@ discover_mount_root_ready (SoupSession *session,
if (is_success && is_dav)
{
- char *parent, *path;
- size_t len;
+ backend->last_good_path = mount_base->path;
+ mount_base->path = path_get_parent_dir (mount_base->path);
- path = backend->last_good_path = mount_base->path;
- mount_base->path = NULL;
-
- if ((len = strlen (path)) > 1)
+ if (mount_base->path)
{
- if (path[len - 1] == '/')
- len--;
-
- parent = g_strrstr_len (path, len, "/");
- mount_base->path = g_strndup (path, (parent - path) + 1);
discover_mount_root (backend, job);
return;
- }
-
+ }
}
/* we have reached the end of paths we are allowed to
- * chdir up to */
+ * chdir up to (or couldn't chdir up at all) */
/* check if we at all have a good path */
if (backend->last_good_path == NULL)
@@ -623,10 +613,7 @@ mount (GVfsBackend *backend,
session = G_VFS_BACKEND_HTTP (backend)->session;
g_signal_connect (session, "authenticate",
- G_CALLBACK (authenticate), job);
-
- g_signal_connect (session, "reauthenticate",
- G_CALLBACK (reauthenticate), job);
+ G_CALLBACK (soup_authenticate), job);
op_backend->mount_source = mount_source;
discover_mount_root (op_backend, job);
diff --git a/daemon/gvfsbackendhttp.c b/daemon/gvfsbackendhttp.c
index 30531728..7fde5639 100644
--- a/daemon/gvfsbackendhttp.c
+++ b/daemon/gvfsbackendhttp.c
@@ -54,8 +54,6 @@
#include "soup-output-stream.h"
-
-
G_DEFINE_TYPE (GVfsBackendHttp, g_vfs_backend_http, G_VFS_TYPE_BACKEND);
static void
@@ -106,7 +104,57 @@ g_vfs_backend_uri_for_filename (GVfsBackend *backend, const char *filename)
return uri;
}
+/* ************************************************************************* */
+/* public utility functions */
+
+SoupMessage *
+message_new_from_uri (const char *method,
+ SoupURI *uri)
+{
+ SoupMessage *msg;
+
+ msg = soup_message_new_from_uri (method, uri);
+
+ /* Add standard headers */
+ soup_message_headers_append (msg->request_headers,
+ "User-Agent", "gvfs/" VERSION);
+ return msg;
+}
+
+SoupMessage *
+message_new_from_filename (GVfsBackend *backend,
+ const char *method,
+ const char *filename)
+{
+ GVfsBackendHttp *op_backend;
+ SoupMessage *msg;
+ SoupURI *uri;
+ op_backend = G_VFS_BACKEND_HTTP (backend);
+ uri = soup_uri_copy (op_backend->mount_base);
+
+ uri = g_vfs_backend_uri_for_filename (backend, filename);
+ msg = message_new_from_uri (method, uri);
+
+ /* "/" means "whatever mount_base is" */
+ if (strcmp (filename, "/"))
+ {
+ char *path;
+ /* Otherwise, we append filename to mount_base (which is assumed to
+ * be a directory in this case).
+ */
+
+ path = g_build_path ("/", uri->path, filename, NULL);
+ soup_uri_set_path (uri, path);
+ g_free (path);
+ }
+
+ soup_uri_free (uri);
+ return msg;
+}
+
+/* ************************************************************************* */
+/* virtual functions overrides */
static gboolean
try_mount (GVfsBackend *backend,
@@ -193,15 +241,10 @@ try_open_for_read (GVfsBackend *backend,
{
GVfsBackendHttp *op_backend;
GInputStream *stream;
- SoupURI *uri;
SoupMessage *msg;
op_backend = G_VFS_BACKEND_HTTP (backend);
- uri = g_vfs_backend_uri_for_filename (backend, filename);
-
- msg = soup_message_new_from_uri (SOUP_METHOD_GET, uri);
- soup_uri_free (uri);
- soup_message_headers_append (msg->request_headers, "User-Agent", "gvfs/" VERSION);
+ msg = message_new_from_filename (backend, "GET", filename);
stream = soup_input_stream_new (op_backend->session, msg);
g_object_unref (msg);
@@ -374,9 +417,8 @@ try_create_tested_existence (SoupSession *session, SoupMessage *msg,
}
/* FIXME: other errors */
- put_msg = soup_message_new_from_uri (SOUP_METHOD_PUT,
- soup_message_get_uri (msg));
- soup_message_headers_append (put_msg->request_headers, "User-Agent", "gvfs/" VERSION);
+ put_msg = message_new_from_uri ("PUT", soup_message_get_uri (msg));
+
soup_message_headers_append (put_msg->request_headers, "If-None-Match", "*");
stream = soup_output_stream_new (op_backend->session, put_msg, -1);
g_object_unref (put_msg);
@@ -392,7 +434,6 @@ try_create (GVfsBackend *backend,
GFileCreateFlags flags)
{
GVfsBackendHttp *op_backend;
- SoupURI *uri;
SoupMessage *msg;
/* FIXME: if SoupOutputStream supported chunked requests, we could
@@ -400,11 +441,8 @@ try_create (GVfsBackend *backend,
*/
op_backend = G_VFS_BACKEND_HTTP (backend);
- uri = g_vfs_backend_uri_for_filename (backend, filename);
- msg = soup_message_new_from_uri (SOUP_METHOD_HEAD, uri);
- soup_uri_free (uri);
- soup_message_headers_append (msg->request_headers, "User-Agent", "gvfs/" VERSION);
+ msg = message_new_from_filename (backend, "HEAD", filename);
g_vfs_job_set_backend_data (G_VFS_JOB (job), op_backend, NULL);
soup_session_queue_message (op_backend->session, msg,
@@ -420,8 +458,8 @@ open_for_replace_succeeded (GVfsBackendHttp *op_backend, GVfsJob *job,
SoupMessage *put_msg;
GOutputStream *stream;
- put_msg = soup_message_new_from_uri (SOUP_METHOD_PUT, uri);
- soup_message_headers_append (put_msg->request_headers, "User-Agent", "gvfs/" VERSION);
+ put_msg = message_new_from_uri (SOUP_METHOD_PUT, uri);
+
if (etag)
soup_message_headers_append (put_msg->request_headers, "If-Match", etag);
@@ -479,11 +517,13 @@ try_replace (GVfsBackend *backend,
return TRUE;
}
+
+
uri = g_vfs_backend_uri_for_filename (backend, filename);
if (etag)
{
- SoupMessage *msg;
+ SoupMessage *msg;
msg = soup_message_new_from_uri (SOUP_METHOD_HEAD, uri);
soup_uri_free (uri);
diff --git a/daemon/gvfsbackendhttp.h b/daemon/gvfsbackendhttp.h
index 5fbda8e9..016c507d 100644
--- a/daemon/gvfsbackendhttp.h
+++ b/daemon/gvfsbackendhttp.h
@@ -54,6 +54,12 @@ struct _GVfsBackendHttp
GType g_vfs_backend_http_get_type (void) G_GNUC_CONST;
SoupURI * g_vfs_backend_uri_for_filename (GVfsBackend *backend, const char *filename);
+
+SoupMessage * message_new_from_filename (GVfsBackend *backend,
+ const char *method,
+ const char *filename);
+SoupMessage * message_new_from_uri (const char *method,
+ SoupURI *uri);
G_END_DECLS
#endif /* __G_VFS_BACKEND_HTTP_H__ */