static void use_resolver (gboolean synchronous) { GProxyResolver *resolver; resolver = g_proxy_resolver_get_default (); if (synchronous) { GError *error = NULL; gchar **proxies; proxies = g_proxy_resolver_lookup (resolver, info, cancellable, &error); if (error) print_and_free_error (error); else print_proxies (info, proxies); g_strfreev (proxies); } else { GMainLoop *loop = g_main_loop_new (NULL, FALSE); g_proxy_resolver_lookup_async (resolver, info, cancellable, _proxy_lookup_cb, loop); g_main_loop_run (loop); g_main_loop_unref (loop); } }
static guint get_proxy_uri_sync (SoupProxyURIResolver *resolver, SoupURI *uri, GCancellable *cancellable, SoupURI **proxy_uri) { SoupProxyResolverDefault *resolver_default = SOUP_PROXY_RESOLVER_DEFAULT (resolver); SoupProxyResolverDefaultPrivate *priv = soup_proxy_resolver_default_get_instance_private (resolver_default); GError *error = NULL; char** proxy_uris = NULL; char *uri_string; guint status = SOUP_STATUS_OK; uri_string = soup_uri_to_string (uri, FALSE); proxy_uris = g_proxy_resolver_lookup (priv->gproxy_resolver, uri_string, cancellable, &error); g_free (uri_string); if (error || proxy_uris == NULL || proxy_uris[0] == NULL) { status = SOUP_STATUS_CANT_RESOLVE_PROXY; goto cleanup; } /* We need to handle direct:// specially, otherwise * SoupSession will try to resolve it as the proxy address. */ if (!g_strcmp0 (proxy_uris[0], "direct://")) goto cleanup; *proxy_uri = soup_uri_new (proxy_uris[0]); if (!*proxy_uri) status = SOUP_STATUS_CANT_RESOLVE_PROXY; cleanup: g_strfreev (proxy_uris); if (error) g_clear_error (&error); return status; }
static GSocketAddress * g_proxy_address_enumerator_next (GSocketAddressEnumerator *enumerator, GCancellable *cancellable, GError **error) { GProxyAddressEnumeratorPrivate *priv = GET_PRIVATE (enumerator); GSocketAddress *result = NULL; GError *first_error = NULL; if (priv->proxies == NULL) { GProxyResolver *resolver = g_proxy_resolver_get_default (); priv->proxies = g_proxy_resolver_lookup (resolver, priv->dest_uri, cancellable, error); priv->next_proxy = priv->proxies; if (priv->proxies == NULL) return NULL; } while (result == NULL && (*priv->next_proxy || priv->addr_enum)) { gchar *dest_hostname; gchar *dest_protocol; GInetSocketAddress *inetsaddr; GInetAddress *inetaddr; guint16 port; next_enumerator (priv); if (!priv->addr_enum) continue; if (priv->proxy_address == NULL) { priv->proxy_address = g_socket_address_enumerator_next ( priv->addr_enum, cancellable, first_error ? NULL : &first_error); } if (priv->proxy_address == NULL) { g_object_unref (priv->addr_enum); priv->addr_enum = NULL; if (priv->dest_ips) { g_resolver_free_addresses (priv->dest_ips); priv->dest_ips = NULL; } continue; } if (strcmp ("direct", priv->proxy_type) == 0) { result = priv->proxy_address; priv->proxy_address = NULL; continue; } if (!priv->supports_hostname) { GInetAddress *dest_ip; if (!priv->dest_ips) { GResolver *resolver; resolver = g_resolver_get_default(); priv->dest_ips = g_resolver_lookup_by_name (resolver, priv->dest_hostname, cancellable, first_error ? NULL : &first_error); g_object_unref (resolver); if (!priv->dest_ips) { g_object_unref (priv->proxy_address); priv->proxy_address = NULL; continue; } } if (!priv->next_dest_ip) priv->next_dest_ip = priv->dest_ips; dest_ip = G_INET_ADDRESS (priv->next_dest_ip->data); dest_hostname = g_inet_address_to_string (dest_ip); priv->next_dest_ip = g_list_next (priv->next_dest_ip); } else { dest_hostname = g_strdup (priv->dest_hostname); } dest_protocol = g_uri_parse_scheme (priv->dest_uri); g_return_val_if_fail (G_IS_INET_SOCKET_ADDRESS (priv->proxy_address), NULL); inetsaddr = G_INET_SOCKET_ADDRESS (priv->proxy_address); inetaddr = g_inet_socket_address_get_address (inetsaddr); port = g_inet_socket_address_get_port (inetsaddr); result = g_object_new (G_TYPE_PROXY_ADDRESS, "address", inetaddr, "port", port, "protocol", priv->proxy_type, "destination-protocol", dest_protocol, "destination-hostname", dest_hostname, "destination-port", priv->dest_port, "username", priv->proxy_username, "password", priv->proxy_password, "uri", priv->proxy_uri, NULL); g_free (dest_hostname); g_free (dest_protocol); if (priv->supports_hostname || priv->next_dest_ip == NULL) { g_object_unref (priv->proxy_address); priv->proxy_address = NULL; } } if (result == NULL && first_error) g_propagate_error (error, first_error); else if (first_error) g_error_free (first_error); return result; }