summaryrefslogtreecommitdiff
path: root/libsoup/soup-proxy-resolver-wrapper.c
diff options
context:
space:
mode:
Diffstat (limited to 'libsoup/soup-proxy-resolver-wrapper.c')
-rw-r--r--libsoup/soup-proxy-resolver-wrapper.c167
1 files changed, 167 insertions, 0 deletions
diff --git a/libsoup/soup-proxy-resolver-wrapper.c b/libsoup/soup-proxy-resolver-wrapper.c
new file mode 100644
index 00000000..e07664ca
--- /dev/null
+++ b/libsoup/soup-proxy-resolver-wrapper.c
@@ -0,0 +1,167 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * soup-proxy-resolver-wrapper.c: SoupProxyURIResolver -> GProxyResolver wrapper
+ *
+ * Copyright 2013 Red Hat, Inc.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "soup-proxy-resolver-wrapper.h"
+#include "soup.h"
+
+static void soup_proxy_resolver_wrapper_interface_init (GProxyResolverInterface *proxy_resolver_interface);
+
+G_DEFINE_TYPE_WITH_CODE (SoupProxyResolverWrapper, soup_proxy_resolver_wrapper, G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (G_TYPE_PROXY_RESOLVER, soup_proxy_resolver_wrapper_interface_init);
+ )
+
+static void
+soup_proxy_resolver_wrapper_init (SoupProxyResolverWrapper *resolver_wrapper)
+{
+}
+
+static void
+soup_proxy_resolver_wrapper_finalize (GObject *object)
+{
+ SoupProxyResolverWrapper *wrapper =
+ SOUP_PROXY_RESOLVER_WRAPPER (object);
+
+ g_clear_object (&wrapper->soup_resolver);
+
+ G_OBJECT_CLASS (soup_proxy_resolver_wrapper_parent_class)->finalize (object);
+}
+
+static char **
+convert_response (SoupURI *source_uri, guint status,
+ SoupURI *proxy_uri, GError **error)
+{
+ char **proxies = NULL;
+
+ if (status == SOUP_STATUS_CANT_RESOLVE_PROXY) {
+ g_set_error (error, G_RESOLVER_ERROR, G_RESOLVER_ERROR_NOT_FOUND,
+ "%s (%s)", soup_status_get_phrase (status),
+ source_uri->host);
+ } else if (status == SOUP_STATUS_CANT_CONNECT_PROXY) {
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_CONNECTION_REFUSED,
+ "%s (%s)", soup_status_get_phrase (status),
+ source_uri->host);
+ } else {
+ g_return_val_if_fail (status == SOUP_STATUS_OK, NULL);
+
+ proxies = g_new (char *, 2);
+ proxies[0] = soup_uri_to_string (proxy_uri, FALSE);
+ proxies[1] = NULL;
+
+ soup_uri_free (proxy_uri);
+ }
+
+ return proxies;
+}
+
+static void
+wrapper_lookup_async_complete (SoupProxyURIResolver *resolver,
+ guint status, SoupURI *proxy_uri,
+ gpointer user_data)
+{
+ GTask *task = user_data;
+ SoupURI *source_uri = g_task_get_task_data (task);
+ char **proxies;
+ GError *error = NULL;
+
+ proxies = convert_response (source_uri, status, proxy_uri, &error);
+ if (error)
+ g_task_return_error (task, error);
+ else
+ g_task_return_pointer (task, proxies, (GDestroyNotify) g_strfreev);
+ g_object_unref (task);
+}
+
+static void
+soup_proxy_resolver_wrapper_lookup_async (GProxyResolver *resolver,
+ const gchar *uri,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ SoupProxyResolverWrapper *wrapper =
+ SOUP_PROXY_RESOLVER_WRAPPER (resolver);
+ GTask *task;
+ SoupURI *source_uri;
+
+ task = g_task_new (resolver, cancellable, callback, user_data);
+ source_uri = soup_uri_new (uri);
+ g_task_set_task_data (task, source_uri, (GDestroyNotify) soup_uri_free);
+
+ G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
+ soup_proxy_uri_resolver_get_proxy_uri_async (wrapper->soup_resolver,
+ source_uri,
+ g_main_context_get_thread_default (),
+ cancellable,
+ wrapper_lookup_async_complete,
+ task);
+ G_GNUC_END_IGNORE_DEPRECATIONS;
+}
+
+static char **
+soup_proxy_resolver_wrapper_lookup_finish (GProxyResolver *resolver,
+ GAsyncResult *result,
+ GError **error)
+{
+ return g_task_propagate_pointer (G_TASK (result), error);
+}
+
+static gchar **
+soup_proxy_resolver_wrapper_lookup (GProxyResolver *resolver,
+ const gchar *uri,
+ GCancellable *cancellable,
+ GError **error)
+{
+ SoupProxyResolverWrapper *wrapper =
+ SOUP_PROXY_RESOLVER_WRAPPER (resolver);
+ SoupURI *source_uri, *proxy_uri;
+ guint status;
+ gchar **proxies;
+
+ source_uri = soup_uri_new (uri);
+ G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
+ status = soup_proxy_uri_resolver_get_proxy_uri_sync (wrapper->soup_resolver,
+ source_uri,
+ cancellable,
+ &proxy_uri);
+ G_GNUC_END_IGNORE_DEPRECATIONS;
+ proxies = convert_response (source_uri, status, proxy_uri, error);
+ soup_uri_free (source_uri);
+ return proxies;
+}
+
+static void
+soup_proxy_resolver_wrapper_class_init (SoupProxyResolverWrapperClass *static_class)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (static_class);
+
+ object_class->finalize = soup_proxy_resolver_wrapper_finalize;
+}
+
+static void
+soup_proxy_resolver_wrapper_interface_init (GProxyResolverInterface *proxy_resolver_interface)
+{
+ proxy_resolver_interface->lookup =
+ soup_proxy_resolver_wrapper_lookup;
+ proxy_resolver_interface->lookup_async =
+ soup_proxy_resolver_wrapper_lookup_async;
+ proxy_resolver_interface->lookup_finish =
+ soup_proxy_resolver_wrapper_lookup_finish;
+}
+
+GProxyResolver *
+soup_proxy_resolver_wrapper_new (SoupProxyURIResolver *soup_resolver)
+{
+ SoupProxyResolverWrapper *wrapper;
+
+ wrapper = g_object_new (SOUP_TYPE_PROXY_RESOLVER_WRAPPER, NULL);
+ wrapper->soup_resolver = g_object_ref (soup_resolver);
+ return (GProxyResolver *)wrapper;
+}