1 /* GIO - GLib Input, Output and Streaming Library
3 * Copyright (C) 2010 Collabora Ltd.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General
16 * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
18 * Author: Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
25 #include "giomodule.h"
26 #include "giomodule-priv.h"
31 * @short_description: Interface for proxy handling
34 * A #GProxy handles connecting to a remote host via a given type of
35 * proxy server. It is implemented by the 'gio-proxy' extension point.
36 * The extensions are named after their proxy protocol name. As an
37 * example, a SOCKS5 proxy implementation can be retrieved with the
38 * name 'socks5' using the function
39 * g_io_extension_point_get_extension_by_name().
44 G_DEFINE_INTERFACE (GProxy
, g_proxy
, G_TYPE_OBJECT
)
47 g_proxy_default_init (GProxyInterface
*iface
)
52 * g_proxy_get_default_for_protocol:
53 * @protocol: the proxy protocol name (e.g. http, socks, etc)
55 * Lookup "gio-proxy" extension point for a proxy implementation that supports
58 * Returns: (transfer full): return a #GProxy or NULL if protocol
64 g_proxy_get_default_for_protocol (const gchar
*protocol
)
66 GIOExtensionPoint
*ep
;
67 GIOExtension
*extension
;
69 /* Ensure proxy modules loaded */
70 _g_io_modules_ensure_loaded ();
72 ep
= g_io_extension_point_lookup (G_PROXY_EXTENSION_POINT_NAME
);
74 extension
= g_io_extension_point_get_extension_by_name (ep
, protocol
);
77 return g_object_new (g_io_extension_get_type (extension
), NULL
);
85 * @connection: a #GIOStream
86 * @proxy_address: a #GProxyAddress
87 * @cancellable: (nullable): a #GCancellable
88 * @error: return #GError
90 * Given @connection to communicate with a proxy (eg, a
91 * #GSocketConnection that is connected to the proxy server), this
92 * does the necessary handshake to connect to @proxy_address, and if
93 * required, wraps the #GIOStream to handle proxy payload.
95 * Returns: (transfer full): a #GIOStream that will replace @connection. This might
96 * be the same as @connection, in which case a reference
102 g_proxy_connect (GProxy
*proxy
,
103 GIOStream
*connection
,
104 GProxyAddress
*proxy_address
,
105 GCancellable
*cancellable
,
108 GProxyInterface
*iface
;
110 g_return_val_if_fail (G_IS_PROXY (proxy
), NULL
);
112 iface
= G_PROXY_GET_IFACE (proxy
);
114 return (* iface
->connect
) (proxy
,
122 * g_proxy_connect_async:
124 * @connection: a #GIOStream
125 * @proxy_address: a #GProxyAddress
126 * @cancellable: (nullable): a #GCancellable
127 * @callback: (scope async): a #GAsyncReadyCallback
128 * @user_data: (closure): callback data
130 * Asynchronous version of g_proxy_connect().
135 g_proxy_connect_async (GProxy
*proxy
,
136 GIOStream
*connection
,
137 GProxyAddress
*proxy_address
,
138 GCancellable
*cancellable
,
139 GAsyncReadyCallback callback
,
142 GProxyInterface
*iface
;
144 g_return_if_fail (G_IS_PROXY (proxy
));
146 iface
= G_PROXY_GET_IFACE (proxy
);
148 (* iface
->connect_async
) (proxy
,
157 * g_proxy_connect_finish:
159 * @result: a #GAsyncResult
160 * @error: return #GError
162 * See g_proxy_connect().
164 * Returns: (transfer full): a #GIOStream.
169 g_proxy_connect_finish (GProxy
*proxy
,
170 GAsyncResult
*result
,
173 GProxyInterface
*iface
;
175 g_return_val_if_fail (G_IS_PROXY (proxy
), NULL
);
177 iface
= G_PROXY_GET_IFACE (proxy
);
179 return (* iface
->connect_finish
) (proxy
, result
, error
);
183 * g_proxy_supports_hostname:
186 * Some proxy protocols expect to be passed a hostname, which they
187 * will resolve to an IP address themselves. Others, like SOCKS4, do
188 * not allow this. This function will return %FALSE if @proxy is
189 * implementing such a protocol. When %FALSE is returned, the caller
190 * should resolve the destination hostname first, and then pass a
191 * #GProxyAddress containing the stringified IP address to
192 * g_proxy_connect() or g_proxy_connect_async().
194 * Returns: %TRUE if hostname resolution is supported.
199 g_proxy_supports_hostname (GProxy
*proxy
)
201 GProxyInterface
*iface
;
203 g_return_val_if_fail (G_IS_PROXY (proxy
), FALSE
);
205 iface
= G_PROXY_GET_IFACE (proxy
);
207 return (* iface
->supports_hostname
) (proxy
);