[gio] Terminate connect call when application proxy is used
[platform/upstream/glib.git] / gio / gsocketclient.c
1 /*  GIO - GLib Input, Output and Streaming Library
2  *
3  * Copyright © 2008, 2009 codethink
4  * Copyright © 2009 Red Hat, Inc
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General
17  * Public License along with this library; if not, write to the
18  * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
19  * Boston, MA 02111-1307, USA.
20  *
21  * Authors: Ryan Lortie <desrt@desrt.ca>
22  *          Alexander Larsson <alexl@redhat.com>
23  */
24
25 #include "config.h"
26 #include "gsocketclient.h"
27
28 #include <stdlib.h>
29 #include <string.h>
30
31 #include <gio/gioenumtypes.h>
32 #include <gio/gsocketaddressenumerator.h>
33 #include <gio/gsocketconnectable.h>
34 #include <gio/gsocketconnection.h>
35 #include <gio/gproxyaddressenumerator.h>
36 #include <gio/gproxyaddress.h>
37 #include <gio/gsimpleasyncresult.h>
38 #include <gio/gcancellable.h>
39 #include <gio/gioerror.h>
40 #include <gio/gsocket.h>
41 #include <gio/gnetworkaddress.h>
42 #include <gio/gnetworkservice.h>
43 #include <gio/gproxy.h>
44 #include <gio/gsocketaddress.h>
45 #include <gio/gtcpconnection.h>
46 #include <gio/gtcpwrapperconnection.h>
47 #include <gio/gtlscertificate.h>
48 #include <gio/gtlsclientconnection.h>
49 #include <gio/ginetaddress.h>
50 #include "glibintl.h"
51
52
53 /**
54  * SECTION:gsocketclient
55  * @short_description: Helper for connecting to a network service
56  * @include: gio/gio.h
57  * @see_also: #GSocketConnection, #GSocketListener
58  *
59  * #GSocketClient is a high-level utility class for connecting to a
60  * network host using a connection oriented socket type.
61  *
62  * You create a #GSocketClient object, set any options you want, and then
63  * call a sync or async connect operation, which returns a #GSocketConnection
64  * subclass on success.
65  *
66  * The type of the #GSocketConnection object returned depends on the type of
67  * the underlying socket that is in use. For instance, for a TCP/IP connection
68  * it will be a #GTcpConnection.
69  *
70  * Since: 2.22
71  */
72
73
74 G_DEFINE_TYPE (GSocketClient, g_socket_client, G_TYPE_OBJECT);
75
76 enum
77 {
78   PROP_NONE,
79   PROP_FAMILY,
80   PROP_TYPE,
81   PROP_PROTOCOL,
82   PROP_LOCAL_ADDRESS,
83   PROP_TIMEOUT,
84   PROP_ENABLE_PROXY,
85   PROP_TLS,
86   PROP_TLS_VALIDATION_FLAGS
87 };
88
89 struct _GSocketClientPrivate
90 {
91   GSocketFamily family;
92   GSocketType type;
93   GSocketProtocol protocol;
94   GSocketAddress *local_address;
95   guint timeout;
96   gboolean enable_proxy;
97   GHashTable *app_proxies;
98   gboolean tls;
99   GTlsCertificateFlags tls_validation_flags;
100 };
101
102 static GSocket *
103 create_socket (GSocketClient  *client,
104                GSocketAddress *dest_address,
105                GError        **error)
106 {
107   GSocketFamily family;
108   GSocket *socket;
109
110   family = client->priv->family;
111   if (family == G_SOCKET_FAMILY_INVALID &&
112       client->priv->local_address != NULL)
113     family = g_socket_address_get_family (client->priv->local_address);
114   if (family == G_SOCKET_FAMILY_INVALID)
115     family = g_socket_address_get_family (dest_address);
116
117   socket = g_socket_new (family,
118                          client->priv->type,
119                          client->priv->protocol,
120                          error);
121   if (socket == NULL)
122     return NULL;
123
124   if (client->priv->local_address)
125     {
126       if (!g_socket_bind (socket,
127                           client->priv->local_address,
128                           FALSE,
129                           error))
130         {
131           g_object_unref (socket);
132           return NULL;
133         }
134     }
135
136   if (client->priv->timeout)
137     g_socket_set_timeout (socket, client->priv->timeout);
138
139   return socket;
140 }
141
142 static gboolean
143 can_use_proxy (GSocketClient *client)
144 {
145   GSocketClientPrivate *priv = client->priv;
146
147   return priv->enable_proxy
148           && priv->type == G_SOCKET_TYPE_STREAM;
149 }
150
151 static void
152 clarify_connect_error (GError             *error,
153                        GSocketConnectable *connectable,
154                        GSocketAddress     *address)
155 {
156   const char *name;
157   char *tmp_name = NULL;
158
159   if (G_IS_PROXY_ADDRESS (address))
160     {
161       name = tmp_name = g_inet_address_to_string (g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (address)));
162
163       g_prefix_error (&error, _("Could not connect to proxy server %s: "), name);
164     }
165   else
166     {
167       if (G_IS_NETWORK_ADDRESS (connectable))
168         name = g_network_address_get_hostname (G_NETWORK_ADDRESS (connectable));
169       else if (G_IS_NETWORK_SERVICE (connectable))
170         name = g_network_service_get_domain (G_NETWORK_SERVICE (connectable));
171       else if (G_IS_INET_SOCKET_ADDRESS (connectable))
172         name = tmp_name = g_inet_address_to_string (g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (connectable)));
173       else
174         name = NULL;
175
176       if (name)
177         g_prefix_error (&error, _("Could not connect to %s: "), name);
178       else
179         g_prefix_error (&error, _("Could not connect: "));
180     }
181
182   g_free (tmp_name);
183 }
184
185 static void
186 g_socket_client_init (GSocketClient *client)
187 {
188   client->priv = G_TYPE_INSTANCE_GET_PRIVATE (client,
189                                               G_TYPE_SOCKET_CLIENT,
190                                               GSocketClientPrivate);
191   client->priv->type = G_SOCKET_TYPE_STREAM;
192   client->priv->app_proxies = g_hash_table_new_full (g_str_hash,
193                                                      g_str_equal,
194                                                      g_free,
195                                                      NULL);
196 }
197
198 /**
199  * g_socket_client_new:
200  *
201  * Creates a new #GSocketClient with the default options.
202  *
203  * Returns: a #GSocketClient.
204  *     Free the returned object with g_object_unref().
205  *
206  * Since: 2.22
207  */
208 GSocketClient *
209 g_socket_client_new (void)
210 {
211   return g_object_new (G_TYPE_SOCKET_CLIENT, NULL);
212 }
213
214 static void
215 g_socket_client_finalize (GObject *object)
216 {
217   GSocketClient *client = G_SOCKET_CLIENT (object);
218
219   if (client->priv->local_address)
220     g_object_unref (client->priv->local_address);
221
222   if (G_OBJECT_CLASS (g_socket_client_parent_class)->finalize)
223     (*G_OBJECT_CLASS (g_socket_client_parent_class)->finalize) (object);
224
225   g_hash_table_unref (client->priv->app_proxies);
226 }
227
228 static void
229 g_socket_client_get_property (GObject    *object,
230                               guint       prop_id,
231                               GValue     *value,
232                               GParamSpec *pspec)
233 {
234   GSocketClient *client = G_SOCKET_CLIENT (object);
235
236   switch (prop_id)
237     {
238       case PROP_FAMILY:
239         g_value_set_enum (value, client->priv->family);
240         break;
241
242       case PROP_TYPE:
243         g_value_set_enum (value, client->priv->type);
244         break;
245
246       case PROP_PROTOCOL:
247         g_value_set_enum (value, client->priv->protocol);
248         break;
249
250       case PROP_LOCAL_ADDRESS:
251         g_value_set_object (value, client->priv->local_address);
252         break;
253
254       case PROP_TIMEOUT:
255         g_value_set_uint (value, client->priv->timeout);
256         break;
257
258       case PROP_ENABLE_PROXY:
259         g_value_set_boolean (value, client->priv->enable_proxy);
260         break;
261
262       case PROP_TLS:
263         g_value_set_boolean (value, g_socket_client_get_tls (client));
264         break;
265
266       case PROP_TLS_VALIDATION_FLAGS:
267         g_value_set_flags (value, g_socket_client_get_tls_validation_flags (client));
268         break;
269
270       default:
271         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
272     }
273 }
274
275 static void
276 g_socket_client_set_property (GObject      *object,
277                               guint         prop_id,
278                               const GValue *value,
279                               GParamSpec   *pspec)
280 {
281   GSocketClient *client = G_SOCKET_CLIENT (object);
282
283   switch (prop_id)
284     {
285     case PROP_FAMILY:
286       g_socket_client_set_family (client, g_value_get_enum (value));
287       break;
288
289     case PROP_TYPE:
290       g_socket_client_set_socket_type (client, g_value_get_enum (value));
291       break;
292
293     case PROP_PROTOCOL:
294       g_socket_client_set_protocol (client, g_value_get_enum (value));
295       break;
296
297     case PROP_LOCAL_ADDRESS:
298       g_socket_client_set_local_address (client, g_value_get_object (value));
299       break;
300
301     case PROP_TIMEOUT:
302       g_socket_client_set_timeout (client, g_value_get_uint (value));
303       break;
304
305     case PROP_ENABLE_PROXY:
306       g_socket_client_set_enable_proxy (client, g_value_get_boolean (value));
307       break;
308
309     case PROP_TLS:
310       g_socket_client_set_tls (client, g_value_get_boolean (value));
311       break;
312
313     case PROP_TLS_VALIDATION_FLAGS:
314       g_socket_client_set_tls_validation_flags (client, g_value_get_flags (value));
315       break;
316
317     default:
318       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
319     }
320 }
321
322 /**
323  * g_socket_client_get_family:
324  * @client: a #GSocketClient.
325  *
326  * Gets the socket family of the socket client.
327  *
328  * See g_socket_client_set_family() for details.
329  *
330  * Returns: a #GSocketFamily
331  *
332  * Since: 2.22
333  */
334 GSocketFamily
335 g_socket_client_get_family (GSocketClient *client)
336 {
337   return client->priv->family;
338 }
339
340 /**
341  * g_socket_client_set_family:
342  * @client: a #GSocketClient.
343  * @family: a #GSocketFamily
344  *
345  * Sets the socket family of the socket client.
346  * If this is set to something other than %G_SOCKET_FAMILY_INVALID
347  * then the sockets created by this object will be of the specified
348  * family.
349  *
350  * This might be useful for instance if you want to force the local
351  * connection to be an ipv4 socket, even though the address might
352  * be an ipv6 mapped to ipv4 address.
353  *
354  * Since: 2.22
355  */
356 void
357 g_socket_client_set_family (GSocketClient *client,
358                             GSocketFamily  family)
359 {
360   if (client->priv->family == family)
361     return;
362
363   client->priv->family = family;
364   g_object_notify (G_OBJECT (client), "family");
365 }
366
367 /**
368  * g_socket_client_get_socket_type:
369  * @client: a #GSocketClient.
370  *
371  * Gets the socket type of the socket client.
372  *
373  * See g_socket_client_set_socket_type() for details.
374  *
375  * Returns: a #GSocketFamily
376  *
377  * Since: 2.22
378  */
379 GSocketType
380 g_socket_client_get_socket_type (GSocketClient *client)
381 {
382   return client->priv->type;
383 }
384
385 /**
386  * g_socket_client_set_socket_type:
387  * @client: a #GSocketClient.
388  * @type: a #GSocketType
389  *
390  * Sets the socket type of the socket client.
391  * The sockets created by this object will be of the specified
392  * type.
393  *
394  * It doesn't make sense to specify a type of %G_SOCKET_TYPE_DATAGRAM,
395  * as GSocketClient is used for connection oriented services.
396  *
397  * Since: 2.22
398  */
399 void
400 g_socket_client_set_socket_type (GSocketClient *client,
401                                  GSocketType    type)
402 {
403   if (client->priv->type == type)
404     return;
405
406   client->priv->type = type;
407   g_object_notify (G_OBJECT (client), "type");
408 }
409
410 /**
411  * g_socket_client_get_protocol:
412  * @client: a #GSocketClient
413  *
414  * Gets the protocol name type of the socket client.
415  *
416  * See g_socket_client_set_protocol() for details.
417  *
418  * Returns: a #GSocketProtocol
419  *
420  * Since: 2.22
421  */
422 GSocketProtocol
423 g_socket_client_get_protocol (GSocketClient *client)
424 {
425   return client->priv->protocol;
426 }
427
428 /**
429  * g_socket_client_set_protocol:
430  * @client: a #GSocketClient.
431  * @protocol: a #GSocketProtocol
432  *
433  * Sets the protocol of the socket client.
434  * The sockets created by this object will use of the specified
435  * protocol.
436  *
437  * If @protocol is %0 that means to use the default
438  * protocol for the socket family and type.
439  *
440  * Since: 2.22
441  */
442 void
443 g_socket_client_set_protocol (GSocketClient   *client,
444                               GSocketProtocol  protocol)
445 {
446   if (client->priv->protocol == protocol)
447     return;
448
449   client->priv->protocol = protocol;
450   g_object_notify (G_OBJECT (client), "protocol");
451 }
452
453 /**
454  * g_socket_client_get_local_address:
455  * @client: a #GSocketClient.
456  *
457  * Gets the local address of the socket client.
458  *
459  * See g_socket_client_set_local_address() for details.
460  *
461  * Returns: (transfer none): a #GSocketAddress or %NULL. Do not free.
462  *
463  * Since: 2.22
464  */
465 GSocketAddress *
466 g_socket_client_get_local_address (GSocketClient *client)
467 {
468   return client->priv->local_address;
469 }
470
471 /**
472  * g_socket_client_set_local_address:
473  * @client: a #GSocketClient.
474  * @address: a #GSocketAddress, or %NULL
475  *
476  * Sets the local address of the socket client.
477  * The sockets created by this object will bound to the
478  * specified address (if not %NULL) before connecting.
479  *
480  * This is useful if you want to ensure that the local
481  * side of the connection is on a specific port, or on
482  * a specific interface.
483  *
484  * Since: 2.22
485  */
486 void
487 g_socket_client_set_local_address (GSocketClient  *client,
488                                    GSocketAddress *address)
489 {
490   if (address)
491     g_object_ref (address);
492
493   if (client->priv->local_address)
494     {
495       g_object_unref (client->priv->local_address);
496     }
497   client->priv->local_address = address;
498   g_object_notify (G_OBJECT (client), "local-address");
499 }
500
501 /**
502  * g_socket_client_get_timeout:
503  * @client: a #GSocketClient
504  *
505  * Gets the I/O timeout time for sockets created by @client.
506  *
507  * See g_socket_client_set_timeout() for details.
508  *
509  * Returns: the timeout in seconds
510  *
511  * Since: 2.26
512  */
513 guint
514 g_socket_client_get_timeout (GSocketClient *client)
515 {
516   return client->priv->timeout;
517 }
518
519
520 /**
521  * g_socket_client_set_timeout:
522  * @client: a #GSocketClient.
523  * @timeout: the timeout
524  *
525  * Sets the I/O timeout for sockets created by @client. @timeout is a
526  * time in seconds, or 0 for no timeout (the default).
527  *
528  * The timeout value affects the initial connection attempt as well,
529  * so setting this may cause calls to g_socket_client_connect(), etc,
530  * to fail with %G_IO_ERROR_TIMED_OUT.
531  *
532  * Since: 2.26
533  */
534 void
535 g_socket_client_set_timeout (GSocketClient *client,
536                              guint          timeout)
537 {
538   if (client->priv->timeout == timeout)
539     return;
540
541   client->priv->timeout = timeout;
542   g_object_notify (G_OBJECT (client), "timeout");
543 }
544
545 /**
546  * g_socket_client_get_enable_proxy:
547  * @client: a #GSocketClient.
548  *
549  * Gets the proxy enable state; see g_socket_client_set_enable_proxy()
550  *
551  * Returns: whether proxying is enabled
552  *
553  * Since: 2.26
554  */
555 gboolean
556 g_socket_client_get_enable_proxy (GSocketClient *client)
557 {
558   return client->priv->enable_proxy;
559 }
560
561 /**
562  * g_socket_client_set_enable_proxy:
563  * @client: a #GSocketClient.
564  * @enable: whether to enable proxies
565  *
566  * Sets whether or not @client attempts to make connections via a
567  * proxy server. When enabled (the default), #GSocketClient will use a
568  * #GProxyResolver to determine if a proxy protocol such as SOCKS is
569  * needed, and automatically do the necessary proxy negotiation.
570  *
571  * Since: 2.26
572  */
573 void
574 g_socket_client_set_enable_proxy (GSocketClient *client,
575                                   gboolean       enable)
576 {
577   enable = !!enable;
578   if (client->priv->enable_proxy == enable)
579     return;
580
581   client->priv->enable_proxy = enable;
582   g_object_notify (G_OBJECT (client), "enable-proxy");
583 }
584
585 /**
586  * g_socket_client_get_tls:
587  * @client: a #GSocketClient.
588  *
589  * Gets whether @client creates TLS connections. See
590  * g_socket_client_set_tls() for details.
591  *
592  * Returns: whether @client uses TLS
593  *
594  * Since: 2.28
595  */
596 gboolean
597 g_socket_client_get_tls (GSocketClient *client)
598 {
599   return client->priv->tls;
600 }
601
602 /**
603  * g_socket_client_set_tls:
604  * @client: a #GSocketClient.
605  * @tls: whether to use TLS
606  *
607  * Sets whether @client creates TLS (aka SSL) connections. If @tls is
608  * %TRUE, @client will wrap its connections in a #GTlsClientConnection
609  * and perform a TLS handshake when connecting.
610  *
611  * Note that since #GSocketClient must return a #GSocketConnection,
612  * but #GTlsClientConnection is not a #GSocketConnection, this
613  * actually wraps the resulting #GTlsClientConnection in a
614  * #GTcpWrapperConnection when returning it. You can use
615  * g_tcp_wrapper_connection_get_base_io_stream() on the return value
616  * to extract the #GTlsClientConnection.
617  *
618  * Since: 2.28
619  */
620 void
621 g_socket_client_set_tls (GSocketClient *client,
622                          gboolean       tls)
623 {
624   tls = !!tls;
625   if (tls == client->priv->tls)
626     return;
627
628   client->priv->tls = tls;
629   g_object_notify (G_OBJECT (client), "tls");
630 }
631
632 /**
633  * g_socket_client_get_tls_validation_flags:
634  * @client: a #GSocketClient.
635  *
636  * Gets the TLS validation flags used creating TLS connections via
637  * @client.
638  *
639  * Returns: the TLS validation flags
640  *
641  * Since: 2.28
642  */
643 GTlsCertificateFlags
644 g_socket_client_get_tls_validation_flags (GSocketClient *client)
645 {
646   return client->priv->tls_validation_flags;
647 }
648
649 /**
650  * g_socket_client_set_tls_validation_flags:
651  * @client: a #GSocketClient.
652  * @flags: the validation flags
653  *
654  * Sets the TLS validation flags used when creating TLS connections
655  * via @client. The default value is %G_TLS_CERTIFICATE_VALIDATE_ALL.
656  *
657  * Since: 2.28
658  */
659 void
660 g_socket_client_set_tls_validation_flags (GSocketClient        *client,
661                                           GTlsCertificateFlags  flags)
662 {
663   if (client->priv->tls_validation_flags != flags)
664     {
665       client->priv->tls_validation_flags = flags;
666       g_object_notify (G_OBJECT (client), "tls-validation-flags");
667     }
668 }
669
670 static void
671 g_socket_client_class_init (GSocketClientClass *class)
672 {
673   GObjectClass *gobject_class = G_OBJECT_CLASS (class);
674
675   g_type_class_add_private (class, sizeof (GSocketClientPrivate));
676
677   gobject_class->finalize = g_socket_client_finalize;
678   gobject_class->set_property = g_socket_client_set_property;
679   gobject_class->get_property = g_socket_client_get_property;
680
681   g_object_class_install_property (gobject_class, PROP_FAMILY,
682                                    g_param_spec_enum ("family",
683                                                       P_("Socket family"),
684                                                       P_("The sockets address family to use for socket construction"),
685                                                       G_TYPE_SOCKET_FAMILY,
686                                                       G_SOCKET_FAMILY_INVALID,
687                                                       G_PARAM_CONSTRUCT |
688                                                       G_PARAM_READWRITE |
689                                                       G_PARAM_STATIC_STRINGS));
690
691   g_object_class_install_property (gobject_class, PROP_TYPE,
692                                    g_param_spec_enum ("type",
693                                                       P_("Socket type"),
694                                                       P_("The sockets type to use for socket construction"),
695                                                       G_TYPE_SOCKET_TYPE,
696                                                       G_SOCKET_TYPE_STREAM,
697                                                       G_PARAM_CONSTRUCT |
698                                                       G_PARAM_READWRITE |
699                                                       G_PARAM_STATIC_STRINGS));
700
701   g_object_class_install_property (gobject_class, PROP_PROTOCOL,
702                                    g_param_spec_enum ("protocol",
703                                                       P_("Socket protocol"),
704                                                       P_("The protocol to use for socket construction, or 0 for default"),
705                                                       G_TYPE_SOCKET_PROTOCOL,
706                                                       G_SOCKET_PROTOCOL_DEFAULT,
707                                                       G_PARAM_CONSTRUCT |
708                                                       G_PARAM_READWRITE |
709                                                       G_PARAM_STATIC_STRINGS));
710
711   g_object_class_install_property (gobject_class, PROP_LOCAL_ADDRESS,
712                                    g_param_spec_object ("local-address",
713                                                         P_("Local address"),
714                                                         P_("The local address constructed sockets will be bound to"),
715                                                         G_TYPE_SOCKET_ADDRESS,
716                                                         G_PARAM_CONSTRUCT |
717                                                         G_PARAM_READWRITE |
718                                                         G_PARAM_STATIC_STRINGS));
719
720   g_object_class_install_property (gobject_class, PROP_TIMEOUT,
721                                    g_param_spec_uint ("timeout",
722                                                       P_("Socket timeout"),
723                                                       P_("The I/O timeout for sockets, or 0 for none"),
724                                                       0, G_MAXUINT, 0,
725                                                       G_PARAM_CONSTRUCT |
726                                                       G_PARAM_READWRITE |
727                                                       G_PARAM_STATIC_STRINGS));
728
729    g_object_class_install_property (gobject_class, PROP_ENABLE_PROXY,
730                                     g_param_spec_boolean ("enable-proxy",
731                                                           P_("Enable proxy"),
732                                                           P_("Enable proxy support"),
733                                                           TRUE,
734                                                           G_PARAM_CONSTRUCT |
735                                                           G_PARAM_READWRITE |
736                                                           G_PARAM_STATIC_STRINGS));
737
738   g_object_class_install_property (gobject_class, PROP_TLS,
739                                    g_param_spec_boolean ("tls",
740                                                          P_("TLS"),
741                                                          P_("Whether to create TLS connections"),
742                                                          FALSE,
743                                                          G_PARAM_CONSTRUCT |
744                                                          G_PARAM_READWRITE |
745                                                          G_PARAM_STATIC_STRINGS));
746   g_object_class_install_property (gobject_class, PROP_TLS_VALIDATION_FLAGS,
747                                    g_param_spec_flags ("tls-validation-flags",
748                                                        P_("TLS validation flags"),
749                                                        P_("TLS validation flags to use"),
750                                                        G_TYPE_TLS_CERTIFICATE_FLAGS,
751                                                        G_TLS_CERTIFICATE_VALIDATE_ALL,
752                                                        G_PARAM_CONSTRUCT |
753                                                        G_PARAM_READWRITE |
754                                                        G_PARAM_STATIC_STRINGS));
755 }
756
757 /**
758  * g_socket_client_connect:
759  * @client: a #GSocketClient.
760  * @connectable: a #GSocketConnectable specifying the remote address.
761  * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
762  * @error: #GError for error reporting, or %NULL to ignore.
763  *
764  * Tries to resolve the @connectable and make a network connection to it.
765  *
766  * Upon a successful connection, a new #GSocketConnection is constructed
767  * and returned.  The caller owns this new object and must drop their
768  * reference to it when finished with it.
769  *
770  * The type of the #GSocketConnection object returned depends on the type of
771  * the underlying socket that is used. For instance, for a TCP/IP connection
772  * it will be a #GTcpConnection.
773  *
774  * The socket created will be the same family as the address that the
775  * @connectable resolves to, unless family is set with g_socket_client_set_family()
776  * or indirectly via g_socket_client_set_local_address(). The socket type
777  * defaults to %G_SOCKET_TYPE_STREAM but can be set with
778  * g_socket_client_set_socket_type().
779  *
780  * If a local address is specified with g_socket_client_set_local_address() the
781  * socket will be bound to this address before connecting.
782  *
783  * Returns: (transfer full): a #GSocketConnection on success, %NULL on error.
784  *
785  * Since: 2.22
786  */
787 GSocketConnection *
788 g_socket_client_connect (GSocketClient       *client,
789                          GSocketConnectable  *connectable,
790                          GCancellable        *cancellable,
791                          GError             **error)
792 {
793   GIOStream *connection = NULL;
794   GSocketAddressEnumerator *enumerator = NULL;
795   GError *last_error, *tmp_error;
796
797   last_error = NULL;
798
799   if (can_use_proxy (client))
800     enumerator = g_socket_connectable_proxy_enumerate (connectable);
801   else
802     enumerator = g_socket_connectable_enumerate (connectable);
803
804   while (connection == NULL)
805     {
806       GSocketAddress *address = NULL;
807       gboolean application_proxy = FALSE;
808       GSocket *socket;
809
810       if (g_cancellable_is_cancelled (cancellable))
811         {
812           g_clear_error (error);
813           g_cancellable_set_error_if_cancelled (cancellable, error);
814           break;
815         }
816
817       tmp_error = NULL;
818       address = g_socket_address_enumerator_next (enumerator, cancellable,
819                                                   &tmp_error);
820
821       if (address == NULL)
822         {
823           if (tmp_error)
824             {
825               g_clear_error (&last_error);
826               g_propagate_error (error, tmp_error);
827             }
828           else if (last_error)
829             {
830               g_propagate_error (error, last_error);
831             }
832           else
833             g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
834                                  _("Unknown error on connect"));
835           break;
836         }
837
838       /* clear error from previous attempt */
839       g_clear_error (&last_error);
840
841       socket = create_socket (client, address, &last_error);
842       if (socket == NULL)
843         {
844           g_object_unref (address);
845           continue;
846         }
847
848       if (g_socket_connect (socket, address, cancellable, &last_error))
849         connection = (GIOStream *)g_socket_connection_factory_create_connection (socket);
850       else
851         clarify_connect_error (last_error, connectable, address);
852
853       if (connection &&
854           G_IS_PROXY_ADDRESS (address) &&
855           client->priv->enable_proxy)
856         {
857           GProxyAddress *proxy_addr = G_PROXY_ADDRESS (address);
858           const gchar *protocol;
859           GProxy *proxy;
860
861           protocol = g_proxy_address_get_protocol (proxy_addr);
862           proxy = g_proxy_get_default_for_protocol (protocol);
863
864           /* The connection should not be anything else then TCP Connection,
865            * but let's put a safety guard in case
866            */
867           if (!G_IS_TCP_CONNECTION (connection))
868             {
869               g_critical ("Trying to proxy over non-TCP connection, this is "
870                           "most likely a bug in GLib IO library.");
871
872               g_set_error_literal (&last_error,
873                   G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
874                   _("Trying to proxy over non-TCP connection is not supported."));
875
876               g_object_unref (connection);
877               connection = NULL;
878             }
879           else if (proxy)
880             {
881               GIOStream *proxy_connection;
882
883               proxy_connection = g_proxy_connect (proxy,
884                                                   connection,
885                                                   proxy_addr,
886                                                   cancellable,
887                                                   &last_error);
888               g_object_unref (connection);
889               connection = proxy_connection;
890               g_object_unref (proxy);
891             }
892           else if (!g_hash_table_lookup_extended (client->priv->app_proxies,
893                                                   protocol, NULL, NULL))
894             {
895               g_set_error (&last_error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
896                            _("Proxy protocol '%s' is not supported."),
897                            protocol);
898               g_object_unref (connection);
899               connection = NULL;
900             }
901           else
902             {
903               application_proxy = TRUE;
904             }
905         }
906
907       if (!application_proxy && connection && client->priv->tls)
908         {
909           GIOStream *tlsconn;
910
911           tlsconn = g_tls_client_connection_new (connection, connectable, &last_error);
912           g_object_unref (connection);
913           connection = tlsconn;
914
915           if (tlsconn)
916             {
917               g_tls_client_connection_set_validation_flags (G_TLS_CLIENT_CONNECTION (tlsconn),
918                                                             client->priv->tls_validation_flags);
919               if (!g_tls_connection_handshake (G_TLS_CONNECTION (tlsconn),
920                                                cancellable, &last_error))
921                 {
922                   g_object_unref (tlsconn);
923                   connection = NULL;
924                 }
925             }
926         }
927
928       if (connection && !G_IS_SOCKET_CONNECTION (connection))
929         {
930           GSocketConnection *wrapper_connection;
931
932           wrapper_connection = g_tcp_wrapper_connection_new (connection, socket);
933           g_object_unref (connection);
934           connection = (GIOStream *)wrapper_connection;
935         }
936
937       g_object_unref (socket);
938       g_object_unref (address);
939     }
940   g_object_unref (enumerator);
941
942   return G_SOCKET_CONNECTION (connection);
943 }
944
945 /**
946  * g_socket_client_connect_to_host:
947  * @client: a #GSocketClient
948  * @host_and_port: the name and optionally port of the host to connect to
949  * @default_port: the default port to connect to
950  * @cancellable: (allow-none): a #GCancellable, or %NULL
951  * @error: a pointer to a #GError, or %NULL
952  *
953  * This is a helper function for g_socket_client_connect().
954  *
955  * Attempts to create a TCP connection to the named host.
956  *
957  * @host_and_port may be in any of a number of recognized formats; an IPv6
958  * address, an IPv4 address, or a domain name (in which case a DNS
959  * lookup is performed).  Quoting with [] is supported for all address
960  * types.  A port override may be specified in the usual way with a
961  * colon.  Ports may be given as decimal numbers or symbolic names (in
962  * which case an /etc/services lookup is performed).
963  *
964  * If no port override is given in @host_and_port then @default_port will be
965  * used as the port number to connect to.
966  *
967  * In general, @host_and_port is expected to be provided by the user (allowing
968  * them to give the hostname, and a port override if necessary) and
969  * @default_port is expected to be provided by the application.
970  *
971  * In the case that an IP address is given, a single connection
972  * attempt is made.  In the case that a name is given, multiple
973  * connection attempts may be made, in turn and according to the
974  * number of address records in DNS, until a connection succeeds.
975  *
976  * Upon a successful connection, a new #GSocketConnection is constructed
977  * and returned.  The caller owns this new object and must drop their
978  * reference to it when finished with it.
979  *
980  * In the event of any failure (DNS error, service not found, no hosts
981  * connectable) %NULL is returned and @error (if non-%NULL) is set
982  * accordingly.
983  *
984  * Returns: (transfer full): a #GSocketConnection on success, %NULL on error.
985  *
986  * Since: 2.22
987  */
988 GSocketConnection *
989 g_socket_client_connect_to_host (GSocketClient  *client,
990                                  const gchar    *host_and_port,
991                                  guint16         default_port,
992                                  GCancellable   *cancellable,
993                                  GError        **error)
994 {
995   GSocketConnectable *connectable;
996   GSocketConnection *connection;
997
998   connectable = g_network_address_parse (host_and_port, default_port, error);
999   if (connectable == NULL)
1000     return NULL;
1001
1002   connection = g_socket_client_connect (client, connectable,
1003                                         cancellable, error);
1004   g_object_unref (connectable);
1005
1006   return connection;
1007 }
1008
1009 /**
1010  * g_socket_client_connect_to_service:
1011  * @client: a #GSocketConnection
1012  * @domain: a domain name
1013  * @service: the name of the service to connect to
1014  * @cancellable: (allow-none): a #GCancellable, or %NULL
1015  * @error: a pointer to a #GError, or %NULL
1016  * @returns: (transfer full): a #GSocketConnection if successful, or %NULL on error
1017  *
1018  * Attempts to create a TCP connection to a service.
1019  *
1020  * This call looks up the SRV record for @service at @domain for the
1021  * "tcp" protocol.  It then attempts to connect, in turn, to each of
1022  * the hosts providing the service until either a connection succeeds
1023  * or there are no hosts remaining.
1024  *
1025  * Upon a successful connection, a new #GSocketConnection is constructed
1026  * and returned.  The caller owns this new object and must drop their
1027  * reference to it when finished with it.
1028  *
1029  * In the event of any failure (DNS error, service not found, no hosts
1030  * connectable) %NULL is returned and @error (if non-%NULL) is set
1031  * accordingly.
1032  */
1033 GSocketConnection *
1034 g_socket_client_connect_to_service (GSocketClient  *client,
1035                                     const gchar    *domain,
1036                                     const gchar    *service,
1037                                     GCancellable   *cancellable,
1038                                     GError        **error)
1039 {
1040   GSocketConnectable *connectable;
1041   GSocketConnection *connection;
1042
1043   connectable = g_network_service_new (service, "tcp", domain);
1044   connection = g_socket_client_connect (client, connectable,
1045                                         cancellable, error);
1046   g_object_unref (connectable);
1047
1048   return connection;
1049 }
1050
1051 /**
1052  * g_socket_client_connect_to_uri:
1053  * @client: a #GSocketClient
1054  * @uri: A network URI
1055  * @default_port: the default port to connect to
1056  * @cancellable: (allow-none): a #GCancellable, or %NULL
1057  * @error: a pointer to a #GError, or %NULL
1058  *
1059  * This is a helper function for g_socket_client_connect().
1060  *
1061  * Attempts to create a TCP connection with a network URI.
1062  *
1063  * @uri may be any valid URI containing an "authority" (hostname/port)
1064  * component. If a port is not specified in the URI, @default_port
1065  * will be used. TLS will be negotiated if #GSocketClient:tls is %TRUE.
1066  * (#GSocketClient does not know to automatically assume TLS for
1067  * certain URI schemes.)
1068  *
1069  * Using this rather than g_socket_client_connect() or
1070  * g_socket_client_connect_to_host() allows #GSocketClient to
1071  * determine when to use application-specific proxy protocols.
1072  *
1073  * Upon a successful connection, a new #GSocketConnection is constructed
1074  * and returned.  The caller owns this new object and must drop their
1075  * reference to it when finished with it.
1076  *
1077  * In the event of any failure (DNS error, service not found, no hosts
1078  * connectable) %NULL is returned and @error (if non-%NULL) is set
1079  * accordingly.
1080  *
1081  * Returns: (transfer full): a #GSocketConnection on success, %NULL on error.
1082  *
1083  * Since: 2.26
1084  */
1085 GSocketConnection *
1086 g_socket_client_connect_to_uri (GSocketClient  *client,
1087                                 const gchar    *uri,
1088                                 guint16         default_port,
1089                                 GCancellable   *cancellable,
1090                                 GError        **error)
1091 {
1092   GSocketConnectable *connectable;
1093   GSocketConnection *connection;
1094
1095   connectable = g_network_address_parse_uri (uri, default_port, error);
1096   if (connectable == NULL)
1097     return NULL;
1098
1099   connection = g_socket_client_connect (client, connectable,
1100                                         cancellable, error);
1101   g_object_unref (connectable);
1102
1103   return connection;
1104 }
1105
1106 typedef struct
1107 {
1108   GSimpleAsyncResult *result;
1109   GCancellable *cancellable;
1110   GSocketClient *client;
1111
1112   GSocketConnectable *connectable;
1113   GSocketAddressEnumerator *enumerator;
1114   GProxyAddress *proxy_addr;
1115   GSocketAddress *current_addr;
1116   GSocket *current_socket;
1117   GIOStream *connection;
1118
1119   GError *last_error;
1120 } GSocketClientAsyncConnectData;
1121
1122 static void
1123 g_socket_client_async_connect_complete (GSocketClientAsyncConnectData *data)
1124 {
1125   if (data->last_error)
1126     {
1127       g_simple_async_result_take_error (data->result, data->last_error);
1128     }
1129   else
1130     {
1131       g_assert (data->connection);
1132
1133       if (!G_IS_SOCKET_CONNECTION (data->connection))
1134         {
1135           GSocketConnection *wrapper_connection;
1136
1137           wrapper_connection = g_tcp_wrapper_connection_new (data->connection,
1138                                                              data->current_socket);
1139           g_object_unref (data->connection);
1140           data->connection = (GIOStream *)wrapper_connection;
1141         }
1142
1143       g_simple_async_result_set_op_res_gpointer (data->result,
1144                                                  data->connection,
1145                                                  g_object_unref);
1146     }
1147
1148   g_simple_async_result_complete (data->result);
1149   g_object_unref (data->result);
1150   g_object_unref (data->connectable);
1151   g_object_unref (data->enumerator);
1152   if (data->cancellable)
1153     g_object_unref (data->cancellable);
1154   if (data->current_addr)
1155     g_object_unref (data->current_addr);
1156   if (data->current_socket)
1157     g_object_unref (data->current_socket);
1158   if (data->proxy_addr)
1159     g_object_unref (data->proxy_addr);
1160   g_slice_free (GSocketClientAsyncConnectData, data);
1161 }
1162
1163
1164 static void
1165 g_socket_client_enumerator_callback (GObject      *object,
1166                                      GAsyncResult *result,
1167                                      gpointer      user_data);
1168
1169 static void
1170 set_last_error (GSocketClientAsyncConnectData *data,
1171                 GError *error)
1172 {
1173   g_clear_error (&data->last_error);
1174   data->last_error = error;
1175 }
1176
1177 static void
1178 enumerator_next_async (GSocketClientAsyncConnectData *data)
1179 {
1180   /* We need to cleanup the state */
1181   g_clear_object (&data->current_socket);
1182   g_clear_object (&data->current_addr);
1183   g_clear_object (&data->proxy_addr);
1184   g_clear_object (&data->connection);
1185
1186   g_socket_address_enumerator_next_async (data->enumerator,
1187                                           data->cancellable,
1188                                           g_socket_client_enumerator_callback,
1189                                           data);
1190 }
1191
1192 static void
1193 g_socket_client_tls_handshake_callback (GObject      *object,
1194                                         GAsyncResult *result,
1195                                         gpointer      user_data)
1196 {
1197   GSocketClientAsyncConnectData *data = user_data;
1198
1199   if (g_tls_connection_handshake_finish (G_TLS_CONNECTION (object),
1200                                          result,
1201                                          &data->last_error))
1202     {
1203       g_object_unref (data->connection);
1204       data->connection = G_IO_STREAM (object);
1205
1206       g_socket_client_async_connect_complete (data);
1207     }
1208   else
1209     {
1210       g_object_unref (object);
1211       enumerator_next_async (data);
1212     }
1213 }
1214
1215 static void
1216 g_socket_client_tls_handshake (GSocketClientAsyncConnectData *data)
1217 {
1218   GIOStream *tlsconn;
1219
1220   if (!data->client->priv->tls)
1221     {
1222       g_socket_client_async_connect_complete (data);
1223       return;
1224     }
1225
1226   tlsconn = g_tls_client_connection_new (data->connection,
1227                                          data->connectable,
1228                                          &data->last_error);
1229   if (tlsconn)
1230     {
1231       g_tls_client_connection_set_validation_flags (G_TLS_CLIENT_CONNECTION (tlsconn),
1232                                                     data->client->priv->tls_validation_flags);
1233       g_tls_connection_handshake_async (G_TLS_CONNECTION (tlsconn),
1234                                         G_PRIORITY_DEFAULT,
1235                                         data->cancellable,
1236                                         g_socket_client_tls_handshake_callback,
1237                                         data);
1238     }
1239   else
1240     {
1241       enumerator_next_async (data);
1242     }
1243 }
1244
1245 static void
1246 g_socket_client_proxy_connect_callback (GObject      *object,
1247                                         GAsyncResult *result,
1248                                         gpointer      user_data)
1249 {
1250   GSocketClientAsyncConnectData *data = user_data;
1251
1252   g_object_unref (data->connection);
1253   data->connection = g_proxy_connect_finish (G_PROXY (object),
1254                                              result,
1255                                              &data->last_error);
1256   if (!data->connection)
1257     {
1258       enumerator_next_async (data);
1259       return;
1260     }
1261
1262   g_socket_client_tls_handshake (data);
1263 }
1264
1265 static void
1266 g_socket_client_proxy_connect (GSocketClientAsyncConnectData *data)
1267 {
1268   GProxy *proxy;
1269   const gchar *protocol;
1270
1271   if (!data->proxy_addr)
1272     {
1273       g_socket_client_tls_handshake (data);
1274       return;
1275     }
1276
1277   protocol  = g_proxy_address_get_protocol (data->proxy_addr);
1278   proxy = g_proxy_get_default_for_protocol (protocol);
1279
1280   /* The connection should not be anything else then TCP Connection,
1281    * but let's put a safety guard in case
1282    */
1283   if (!G_IS_TCP_CONNECTION (data->connection))
1284     {
1285       g_critical ("Trying to proxy over non-TCP connection, this is "
1286           "most likely a bug in GLib IO library.");
1287
1288       g_set_error_literal (&data->last_error,
1289           G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
1290           _("Trying to proxy over non-TCP connection is not supported."));
1291
1292       enumerator_next_async (data);
1293     }
1294   else if (proxy)
1295     {
1296       g_proxy_connect_async (proxy,
1297                              data->connection,
1298                              data->proxy_addr,
1299                              data->cancellable,
1300                              g_socket_client_proxy_connect_callback,
1301                              data);
1302       g_object_unref (proxy);
1303     }
1304   else if (!g_hash_table_lookup_extended (data->client->priv->app_proxies,
1305                                           protocol, NULL, NULL))
1306     {
1307       g_clear_error (&data->last_error);
1308
1309       g_set_error (&data->last_error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
1310           _("Proxy protocol '%s' is not supported."),
1311           protocol);
1312
1313       enumerator_next_async (data);
1314     }
1315   else
1316     {
1317       /* Simply complete the connection, we don't want to do TLS handshake
1318        * as the application proxy handling may need proxy handshake first */
1319       g_socket_client_async_connect_complete (data);
1320     }
1321 }
1322
1323 static void
1324 g_socket_client_socket_connected (GSocketClientAsyncConnectData *data)
1325 {
1326   g_socket_set_blocking (data->current_socket, TRUE);
1327
1328   data->connection = (GIOStream *)
1329     g_socket_connection_factory_create_connection (data->current_socket);
1330
1331   g_socket_client_proxy_connect (data);
1332 }
1333
1334 static gboolean
1335 g_socket_client_socket_callback (GSocket *socket,
1336                                  GIOCondition condition,
1337                                  GSocketClientAsyncConnectData *data)
1338 {
1339   GError *error = NULL;
1340
1341   if (g_cancellable_is_cancelled (data->cancellable))
1342     {
1343       /* Cancelled, return done with last error being cancelled */
1344       g_clear_error (&data->last_error);
1345       g_cancellable_set_error_if_cancelled (data->cancellable,
1346                                             &data->last_error);
1347
1348       g_socket_client_async_connect_complete (data);
1349       return FALSE;
1350     }
1351   else
1352     {
1353       /* socket is ready for writing means connect done, did it succeed? */
1354       if (!g_socket_check_connect_result (data->current_socket, &error))
1355         {
1356           clarify_connect_error (error, data->connectable,
1357                                  data->current_addr);
1358           set_last_error (data, error);
1359
1360           /* try next one */
1361           enumerator_next_async (data);
1362
1363           return FALSE;
1364         }
1365     }
1366
1367   g_socket_client_socket_connected (data);
1368   return FALSE;
1369 }
1370
1371 static void
1372 g_socket_client_enumerator_callback (GObject      *object,
1373                                      GAsyncResult *result,
1374                                      gpointer      user_data)
1375 {
1376   GSocketClientAsyncConnectData *data = user_data;
1377   GSocketAddress *address = NULL;
1378   GSocket *socket;
1379   GError *tmp_error = NULL;
1380
1381   if (g_cancellable_is_cancelled (data->cancellable))
1382     {
1383       g_clear_error (&data->last_error);
1384       g_cancellable_set_error_if_cancelled (data->cancellable, &data->last_error);
1385       g_socket_client_async_connect_complete (data);
1386       return;
1387     }
1388
1389   address = g_socket_address_enumerator_next_finish (data->enumerator,
1390                                                      result, &tmp_error);
1391
1392   if (address == NULL)
1393     {
1394       if (tmp_error)
1395         set_last_error (data, tmp_error);
1396       else if (data->last_error == NULL)
1397         g_set_error_literal (&data->last_error, G_IO_ERROR, G_IO_ERROR_FAILED,
1398                              _("Unknown error on connect"));
1399
1400       g_socket_client_async_connect_complete (data);
1401       return;
1402     }
1403
1404   if (G_IS_PROXY_ADDRESS (address) &&
1405       data->client->priv->enable_proxy)
1406     data->proxy_addr = g_object_ref (G_PROXY_ADDRESS (address));
1407
1408   g_clear_error (&data->last_error);
1409
1410   socket = create_socket (data->client, address, &data->last_error);
1411   if (socket != NULL)
1412     {
1413       g_socket_set_blocking (socket, FALSE);
1414       if (g_socket_connect (socket, address, data->cancellable, &tmp_error))
1415         {
1416           data->current_socket = socket;
1417           g_socket_client_socket_connected (data);
1418
1419           g_object_unref (address);
1420           return;
1421         }
1422       else if (g_error_matches (tmp_error, G_IO_ERROR, G_IO_ERROR_PENDING))
1423         {
1424           GSource *source;
1425
1426           data->current_socket = socket;
1427           data->current_addr = address;
1428           g_error_free (tmp_error);
1429
1430           source = g_socket_create_source (socket, G_IO_OUT,
1431                                            data->cancellable);
1432           g_source_set_callback (source,
1433                                  (GSourceFunc) g_socket_client_socket_callback,
1434                                  data, NULL);
1435           g_source_attach (source, g_main_context_get_thread_default ());
1436           g_source_unref (source);
1437           return;
1438         }
1439       else
1440         {
1441           clarify_connect_error (tmp_error, data->connectable, address);
1442           data->last_error = tmp_error;
1443           g_object_unref (socket);
1444         }
1445     }
1446
1447   g_object_unref (address);
1448   enumerator_next_async (data);
1449 }
1450
1451 /**
1452  * g_socket_client_connect_async:
1453  * @client: a #GSocketClient
1454  * @connectable: a #GSocketConnectable specifying the remote address.
1455  * @cancellable: (allow-none): a #GCancellable, or %NULL
1456  * @callback: (scope async): a #GAsyncReadyCallback
1457  * @user_data: (closure): user data for the callback
1458  *
1459  * This is the asynchronous version of g_socket_client_connect().
1460  *
1461  * When the operation is finished @callback will be
1462  * called. You can then call g_socket_client_connect_finish() to get
1463  * the result of the operation.
1464  *
1465  * Since: 2.22
1466  */
1467 void
1468 g_socket_client_connect_async (GSocketClient       *client,
1469                                GSocketConnectable  *connectable,
1470                                GCancellable        *cancellable,
1471                                GAsyncReadyCallback  callback,
1472                                gpointer             user_data)
1473 {
1474   GSocketClientAsyncConnectData *data;
1475
1476   g_return_if_fail (G_IS_SOCKET_CLIENT (client));
1477
1478   data = g_slice_new0 (GSocketClientAsyncConnectData);
1479
1480   data->result = g_simple_async_result_new (G_OBJECT (client),
1481                                             callback, user_data,
1482                                             g_socket_client_connect_async);
1483   data->client = client;
1484   if (cancellable)
1485     data->cancellable = g_object_ref (cancellable);
1486   else
1487     data->cancellable = NULL;
1488   data->last_error = NULL;
1489   data->connectable = g_object_ref (connectable);
1490
1491   if (can_use_proxy (client))
1492       data->enumerator = g_socket_connectable_proxy_enumerate (connectable);
1493   else
1494       data->enumerator = g_socket_connectable_enumerate (connectable);
1495
1496   enumerator_next_async (data);
1497 }
1498
1499 /**
1500  * g_socket_client_connect_to_host_async:
1501  * @client: a #GSocketClient
1502  * @host_and_port: the name and optionally the port of the host to connect to
1503  * @default_port: the default port to connect to
1504  * @cancellable: (allow-none): a #GCancellable, or %NULL
1505  * @callback: (scope async): a #GAsyncReadyCallback
1506  * @user_data: (closure): user data for the callback
1507  *
1508  * This is the asynchronous version of g_socket_client_connect_to_host().
1509  *
1510  * When the operation is finished @callback will be
1511  * called. You can then call g_socket_client_connect_to_host_finish() to get
1512  * the result of the operation.
1513  *
1514  * Since: 2.22
1515  */
1516 void
1517 g_socket_client_connect_to_host_async (GSocketClient        *client,
1518                                        const gchar          *host_and_port,
1519                                        guint16               default_port,
1520                                        GCancellable         *cancellable,
1521                                        GAsyncReadyCallback   callback,
1522                                        gpointer              user_data)
1523 {
1524   GSocketConnectable *connectable;
1525   GError *error;
1526
1527   error = NULL;
1528   connectable = g_network_address_parse (host_and_port, default_port,
1529                                          &error);
1530   if (connectable == NULL)
1531     {
1532       g_simple_async_report_take_gerror_in_idle (G_OBJECT (client),
1533                                             callback, user_data, error);
1534     }
1535   else
1536     {
1537       g_socket_client_connect_async (client,
1538                                      connectable, cancellable,
1539                                      callback, user_data);
1540       g_object_unref (connectable);
1541     }
1542 }
1543
1544 /**
1545  * g_socket_client_connect_to_service_async:
1546  * @client: a #GSocketClient
1547  * @domain: a domain name
1548  * @service: the name of the service to connect to
1549  * @cancellable: (allow-none): a #GCancellable, or %NULL
1550  * @callback: (scope async): a #GAsyncReadyCallback
1551  * @user_data: (closure): user data for the callback
1552  *
1553  * This is the asynchronous version of
1554  * g_socket_client_connect_to_service().
1555  *
1556  * Since: 2.22
1557  */
1558 void
1559 g_socket_client_connect_to_service_async (GSocketClient       *client,
1560                                           const gchar         *domain,
1561                                           const gchar         *service,
1562                                           GCancellable        *cancellable,
1563                                           GAsyncReadyCallback  callback,
1564                                           gpointer             user_data)
1565 {
1566   GSocketConnectable *connectable;
1567
1568   connectable = g_network_service_new (service, "tcp", domain);
1569   g_socket_client_connect_async (client,
1570                                  connectable, cancellable,
1571                                  callback, user_data);
1572   g_object_unref (connectable);
1573 }
1574
1575 /**
1576  * g_socket_client_connect_to_uri_async:
1577  * @client: a #GSocketClient
1578  * @uri: a network uri
1579  * @default_port: the default port to connect to
1580  * @cancellable: (allow-none): a #GCancellable, or %NULL
1581  * @callback: (scope async): a #GAsyncReadyCallback
1582  * @user_data: (closure): user data for the callback
1583  *
1584  * This is the asynchronous version of g_socket_client_connect_to_uri().
1585  *
1586  * When the operation is finished @callback will be
1587  * called. You can then call g_socket_client_connect_to_uri_finish() to get
1588  * the result of the operation.
1589  *
1590  * Since: 2.26
1591  */
1592 void
1593 g_socket_client_connect_to_uri_async (GSocketClient        *client,
1594                                       const gchar          *uri,
1595                                       guint16               default_port,
1596                                       GCancellable         *cancellable,
1597                                       GAsyncReadyCallback   callback,
1598                                       gpointer              user_data)
1599 {
1600   GSocketConnectable *connectable;
1601   GError *error;
1602
1603   error = NULL;
1604   connectable = g_network_address_parse_uri (uri, default_port, &error);
1605   if (connectable == NULL)
1606     {
1607       g_simple_async_report_take_gerror_in_idle (G_OBJECT (client),
1608                                             callback, user_data, error);
1609     }
1610   else
1611     {
1612       g_socket_client_connect_async (client,
1613                                      connectable, cancellable,
1614                                      callback, user_data);
1615       g_object_unref (connectable);
1616     }
1617 }
1618
1619
1620 /**
1621  * g_socket_client_connect_finish:
1622  * @client: a #GSocketClient.
1623  * @result: a #GAsyncResult.
1624  * @error: a #GError location to store the error occurring, or %NULL to
1625  * ignore.
1626  *
1627  * Finishes an async connect operation. See g_socket_client_connect_async()
1628  *
1629  * Returns: (transfer full): a #GSocketConnection on success, %NULL on error.
1630  *
1631  * Since: 2.22
1632  */
1633 GSocketConnection *
1634 g_socket_client_connect_finish (GSocketClient  *client,
1635                                 GAsyncResult   *result,
1636                                 GError        **error)
1637 {
1638   GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result);
1639
1640   if (g_simple_async_result_propagate_error (simple, error))
1641     return NULL;
1642
1643   return g_object_ref (g_simple_async_result_get_op_res_gpointer (simple));
1644 }
1645
1646 /**
1647  * g_socket_client_connect_to_host_finish:
1648  * @client: a #GSocketClient.
1649  * @result: a #GAsyncResult.
1650  * @error: a #GError location to store the error occurring, or %NULL to
1651  * ignore.
1652  *
1653  * Finishes an async connect operation. See g_socket_client_connect_to_host_async()
1654  *
1655  * Returns: (transfer full): a #GSocketConnection on success, %NULL on error.
1656  *
1657  * Since: 2.22
1658  */
1659 GSocketConnection *
1660 g_socket_client_connect_to_host_finish (GSocketClient  *client,
1661                                         GAsyncResult   *result,
1662                                         GError        **error)
1663 {
1664   return g_socket_client_connect_finish (client, result, error);
1665 }
1666
1667 /**
1668  * g_socket_client_connect_to_service_finish:
1669  * @client: a #GSocketClient.
1670  * @result: a #GAsyncResult.
1671  * @error: a #GError location to store the error occurring, or %NULL to
1672  * ignore.
1673  *
1674  * Finishes an async connect operation. See g_socket_client_connect_to_service_async()
1675  *
1676  * Returns: (transfer full): a #GSocketConnection on success, %NULL on error.
1677  *
1678  * Since: 2.22
1679  */
1680 GSocketConnection *
1681 g_socket_client_connect_to_service_finish (GSocketClient  *client,
1682                                            GAsyncResult   *result,
1683                                            GError        **error)
1684 {
1685   return g_socket_client_connect_finish (client, result, error);
1686 }
1687
1688 /**
1689  * g_socket_client_connect_to_uri_finish:
1690  * @client: a #GSocketClient.
1691  * @result: a #GAsyncResult.
1692  * @error: a #GError location to store the error occurring, or %NULL to
1693  * ignore.
1694  *
1695  * Finishes an async connect operation. See g_socket_client_connect_to_uri_async()
1696  *
1697  * Returns: (transfer full): a #GSocketConnection on success, %NULL on error.
1698  *
1699  * Since: 2.26
1700  */
1701 GSocketConnection *
1702 g_socket_client_connect_to_uri_finish (GSocketClient  *client,
1703                                        GAsyncResult   *result,
1704                                        GError        **error)
1705 {
1706   return g_socket_client_connect_finish (client, result, error);
1707 }
1708
1709 /**
1710  * g_socket_client_add_application_proxy:
1711  * @client: a #GSocketClient
1712  * @protocol: The proxy protocol
1713  *
1714  * Enable proxy protocols to be handled by the application. When the
1715  * indicated proxy protocol is returned by the #GProxyResolver,
1716  * #GSocketClient will consider this protocol as supported but will
1717  * not try to find a #GProxy instance to handle handshaking. The
1718  * application must check for this case by calling
1719  * g_socket_connection_get_remote_address() on the returned
1720  * #GSocketConnection, and seeing if it's a #GProxyAddress of the
1721  * appropriate type, to determine whether or not it needs to handle
1722  * the proxy handshaking itself.
1723  *
1724  * This should be used for proxy protocols that are dialects of
1725  * another protocol such as HTTP proxy. It also allows cohabitation of
1726  * proxy protocols that are reused between protocols. A good example
1727  * is HTTP. It can be used to proxy HTTP, FTP and Gopher and can also
1728  * be use as generic socket proxy through the HTTP CONNECT method.
1729  *
1730  * When the proxy is detected as being an application proxy, TLS handshake
1731  * will be skipped. This is required to let the application do the proxy
1732  * specific handshake.
1733  */
1734 void
1735 g_socket_client_add_application_proxy (GSocketClient *client,
1736                                        const gchar   *protocol)
1737 {
1738   g_hash_table_insert (client->priv->app_proxies, g_strdup (protocol), NULL);
1739 }