1 /* GLib testing framework examples and tests
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, write to the
17 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
18 * Boston, MA 02111-1307, USA.
20 * Authors: Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
35 #include "gio/gunixsocketaddress.h"
38 static const gchar *info = NULL;
39 static GCancellable *cancellable = NULL;
40 static gint return_value = 0;
42 static void G_GNUC_NORETURN
45 fprintf (stderr, "Usage: proxy [-s] (uri|host:port|ip:port|path|srv/protocol/domain)\n");
46 fprintf (stderr, " Use -t to enable threading.\n");
47 fprintf (stderr, " Use -s to do synchronous lookups.\n");
48 fprintf (stderr, " Use -c to cancel operation.\n");
49 fprintf (stderr, " Use -e to use enumerator.\n");
50 fprintf (stderr, " Use -inet to use GInetSocketAddress enumerator (ip:port).\n");
52 fprintf (stderr, " Use -unix to use GUnixSocketAddress enumerator (path).\n");
54 fprintf (stderr, " Use -proxyaddr tp use GProxyAddress enumerator "
55 "(ip:port:protocol:dest_host:dest_port[:username[:password]]).\n");
56 fprintf (stderr, " Use -netaddr to use GNetworkAddress enumerator (host:port).\n");
57 fprintf (stderr, " Use -neturi to use GNetworkAddress enumerator (uri).\n");
58 fprintf (stderr, " Use -netsrv to use GNetworkService enumerator (srv/protocol/domain).\n");
63 print_and_free_error (GError *error)
65 fprintf (stderr, "Failed to obtain proxies: %s\n", error->message);
71 print_proxies (const gchar *info, gchar **proxies)
73 printf ("Proxies for URI '%s' are:\n", info);
75 if (proxies == NULL || proxies[0] == NULL)
78 for (; proxies[0]; proxies++)
79 printf ("\t%s\n", proxies[0]);
83 _proxy_lookup_cb (GObject *source_object,
89 GMainLoop *loop = user_data;
91 proxies = g_proxy_resolver_lookup_finish (G_PROXY_RESOLVER (source_object),
96 print_and_free_error (error);
100 print_proxies (info, proxies);
101 g_strfreev (proxies);
104 g_main_loop_quit (loop);
108 use_resolver (gboolean synchronous)
110 GProxyResolver *resolver;
112 resolver = g_proxy_resolver_get_default ();
116 GError *error = NULL;
119 proxies = g_proxy_resolver_lookup (resolver, info, cancellable, &error);
122 print_and_free_error (error);
124 print_proxies (info, proxies);
126 g_strfreev (proxies);
130 GMainLoop *loop = g_main_loop_new (NULL, FALSE);
132 g_proxy_resolver_lookup_async (resolver,
138 g_main_loop_run (loop);
139 g_main_loop_unref (loop);
144 print_proxy_address (GSocketAddress *sockaddr)
146 GProxyAddress *proxy = NULL;
148 if (sockaddr == NULL)
150 printf ("\tdirect://\n");
154 if (G_IS_PROXY_ADDRESS (sockaddr))
156 proxy = G_PROXY_ADDRESS (sockaddr);
157 printf ("\t%s://", g_proxy_address_get_protocol(proxy));
161 printf ("\tdirect://");
164 if (G_IS_INET_SOCKET_ADDRESS (sockaddr))
166 GInetAddress *inetaddr;
170 g_object_get (sockaddr,
171 "address", &inetaddr,
175 addr = g_inet_address_to_string (inetaddr);
177 printf ("%s:%u", addr, port);
184 if (g_proxy_address_get_username(proxy))
185 printf (" (Username: %s Password: %s)",
186 g_proxy_address_get_username(proxy),
187 g_proxy_address_get_password(proxy));
188 printf (" (Hostname: %s, Port: %i)",
189 g_proxy_address_get_destination_hostname (proxy),
190 g_proxy_address_get_destination_port (proxy));
197 _proxy_enumerate_cb (GObject *object,
198 GAsyncResult *result,
201 GError *error = NULL;
202 GMainLoop *loop = user_data;
203 GSocketAddressEnumerator *enumerator = G_SOCKET_ADDRESS_ENUMERATOR (object);
204 GSocketAddress *sockaddr;
206 sockaddr = g_socket_address_enumerator_next_finish (enumerator,
211 print_proxy_address (sockaddr);
212 g_socket_address_enumerator_next_async (enumerator,
216 g_object_unref (sockaddr);
221 print_and_free_error (error);
223 g_main_loop_quit (loop);
228 run_with_enumerator (gboolean synchronous, GSocketAddressEnumerator *enumerator)
230 GError *error = NULL;
234 GSocketAddress *sockaddr;
236 while ((sockaddr = g_socket_address_enumerator_next (enumerator,
240 print_proxy_address (sockaddr);
241 g_object_unref (sockaddr);
245 print_and_free_error (error);
249 GMainLoop *loop = g_main_loop_new (NULL, FALSE);
251 g_socket_address_enumerator_next_async (enumerator,
255 g_main_loop_run (loop);
256 g_main_loop_unref (loop);
261 use_enumerator (gboolean synchronous)
263 GSocketAddressEnumerator *enumerator;
265 enumerator = g_object_new (G_TYPE_PROXY_ADDRESS_ENUMERATOR,
269 printf ("Proxies for URI '%s' are:\n", info);
270 run_with_enumerator (synchronous, enumerator);
272 g_object_unref (enumerator);
276 use_inet_address (gboolean synchronous)
278 GSocketAddressEnumerator *enumerator;
279 GSocketAddress *sockaddr;
284 ip_and_port = g_strsplit (info, ":", 2);
288 addr = g_inet_address_new_from_string (ip_and_port[0]);
290 port = strtoul (ip_and_port [1], NULL, 10);
293 g_strfreev (ip_and_port);
295 if (addr == NULL || port <= 0 || port >= 65535)
297 fprintf (stderr, "Bad 'ip:port' parameter '%s'\n", info);
299 g_object_unref (addr);
304 sockaddr = g_inet_socket_address_new (addr, port);
305 g_object_unref (addr);
308 g_socket_connectable_proxy_enumerate (G_SOCKET_CONNECTABLE (sockaddr));
309 g_object_unref (sockaddr);
311 printf ("Proxies for ip and port '%s' are:\n", info);
312 run_with_enumerator (synchronous, enumerator);
314 g_object_unref (enumerator);
319 use_unix_address (gboolean synchronous)
321 GSocketAddressEnumerator *enumerator;
322 GSocketAddress *sockaddr;
324 sockaddr = g_unix_socket_address_new_abstract (info, -1);
326 if (sockaddr == NULL)
328 fprintf (stderr, "Failed to create unix socket with name '%s'\n", info);
334 g_socket_connectable_proxy_enumerate (G_SOCKET_CONNECTABLE (sockaddr));
335 g_object_unref (sockaddr);
337 printf ("Proxies for path '%s' are:\n", info);
338 run_with_enumerator (synchronous, enumerator);
340 g_object_unref (enumerator);
345 use_proxy_address (gboolean synchronous)
347 GSocketAddressEnumerator *enumerator;
348 GSocketAddress *sockaddr;
354 gchar *username = NULL;
355 gchar *password = NULL;
358 split_info = g_strsplit (info, ":", 7);
366 fprintf (stderr, "Bad 'ip:port:protocol:dest_host:dest_port' parameter '%s'\n", info);
371 addr = g_inet_address_new_from_string (split_info[0]);
372 port = strtoul (split_info [1], NULL, 10);
373 protocol = g_strdup (split_info[2]);
374 dest_host = g_strdup (split_info[3]);
375 dest_port = strtoul (split_info[4], NULL, 10);
379 username = g_strdup (split_info[5]);
381 password = g_strdup (split_info[6]);
384 g_strfreev (split_info);
386 sockaddr = g_proxy_address_new (addr, port,
387 protocol, dest_host, dest_port,
390 g_object_unref (addr);
397 g_socket_connectable_proxy_enumerate (G_SOCKET_CONNECTABLE (sockaddr));
398 g_object_unref (sockaddr);
400 printf ("Proxies for ip and port '%s' are:\n", info);
401 run_with_enumerator (synchronous, enumerator);
403 g_object_unref (enumerator);
407 use_network_address (gboolean synchronous)
409 GError *error = NULL;
410 GSocketAddressEnumerator *enumerator;
411 GSocketConnectable *connectable;
413 connectable = g_network_address_parse (info, -1, &error);
417 print_and_free_error (error);
421 enumerator = g_socket_connectable_proxy_enumerate (connectable);
422 g_object_unref (connectable);
424 printf ("Proxies for hostname and port '%s' are:\n", info);
425 run_with_enumerator (synchronous, enumerator);
427 g_object_unref (enumerator);
431 use_network_uri (gboolean synchronous)
433 GError *error = NULL;
434 GSocketAddressEnumerator *enumerator;
435 GSocketConnectable *connectable;
437 connectable = g_network_address_parse_uri (info, 0, &error);
441 print_and_free_error (error);
445 enumerator = g_socket_connectable_proxy_enumerate (connectable);
446 g_object_unref (connectable);
448 printf ("Proxies for URI '%s' are:\n", info);
449 run_with_enumerator (synchronous, enumerator);
451 g_object_unref (enumerator);
455 use_network_service (gboolean synchronous)
457 GSocketAddressEnumerator *enumerator;
458 GSocketConnectable *connectable = NULL;
461 split = g_strsplit (info, "/", 3);
463 if (split[0] && split[1] && split[2])
464 connectable = g_network_service_new (split[0], split[1], split[2]);
468 if (connectable == NULL)
470 fprintf (stderr, "Bad 'srv/protocol/domain' parameter '%s'\n", info);
475 enumerator = g_socket_connectable_proxy_enumerate (connectable);
476 g_object_unref (connectable);
478 printf ("Proxies for hostname and port '%s' are:\n", info);
479 run_with_enumerator (synchronous, enumerator);
481 g_object_unref (enumerator);
489 USE_UNIX_SOCKET_ADDRESS,
491 USE_INET_SOCKET_ADDRESS,
499 main (gint argc, gchar **argv)
501 gboolean synchronous = FALSE;
502 gboolean cancel = FALSE;
503 ProxyTestType type = USE_RESOLVER;
507 while (argc >= 2 && argv[1][0] == '-')
509 if (!strcmp (argv[1], "-s"))
511 else if (!strcmp (argv[1], "-c"))
513 else if (!strcmp (argv[1], "-e"))
514 type = USE_ENUMERATOR;
515 else if (!strcmp (argv[1], "-inet"))
516 type = USE_INET_SOCKET_ADDRESS;
518 else if (!strcmp (argv[1], "-unix"))
519 type = USE_UNIX_SOCKET_ADDRESS;
521 else if (!strcmp (argv[1], "-proxyaddr"))
522 type = USE_PROXY_ADDRESS;
523 else if (!strcmp (argv[1], "-netaddr"))
524 type = USE_NETWORK_ADDRESS;
525 else if (!strcmp (argv[1], "-neturi"))
526 type = USE_NETWORK_URI;
527 else if (!strcmp (argv[1], "-netsrv"))
528 type = USE_NETWORK_SERVICE;
539 /* Save URI for asynchronous callback */
544 cancellable = g_cancellable_new ();
545 g_cancellable_cancel (cancellable);
551 use_resolver (synchronous);
554 use_enumerator (synchronous);
556 case USE_INET_SOCKET_ADDRESS:
557 use_inet_address (synchronous);
560 case USE_UNIX_SOCKET_ADDRESS:
561 use_unix_address (synchronous);
564 case USE_PROXY_ADDRESS:
565 use_proxy_address (synchronous);
567 case USE_NETWORK_ADDRESS:
568 use_network_address (synchronous);
570 case USE_NETWORK_URI:
571 use_network_uri (synchronous);
573 case USE_NETWORK_SERVICE:
574 use_network_service (synchronous);