Blame libsoup/soup-proxy-resolver-wrapper.c

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