/* -*- 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 #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; }