mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-03 09:46:17 +01:00
GSocketClient: fix handling of application proxies
g_socket_client_add_application_proxy() claimed "When the indicated proxy protocol is returned by the #GProxyResolver, #GSocketClient will consider this protocol as supported but will not try to find a #GProxy instance to handle handshaking." But in fact, it did the checks in the wrong order, so GProxy proxies ended up overriding application-specified ones. Fix that. Also, simplify the code a bit by making use of g_hash_table_add() and g_hash_table_contains(). https://bugzilla.gnome.org/show_bug.cgi?id=733876
This commit is contained in:
parent
ed4a742946
commit
6ce79e586f
@ -1067,7 +1067,6 @@ g_socket_client_connect (GSocketClient *client,
|
|||||||
GProxy *proxy;
|
GProxy *proxy;
|
||||||
|
|
||||||
protocol = g_proxy_address_get_protocol (proxy_addr);
|
protocol = g_proxy_address_get_protocol (proxy_addr);
|
||||||
proxy = g_proxy_get_default_for_protocol (protocol);
|
|
||||||
|
|
||||||
/* The connection should not be anything else then TCP Connection,
|
/* The connection should not be anything else then TCP Connection,
|
||||||
* but let's put a safety guard in case
|
* but let's put a safety guard in case
|
||||||
@ -1084,7 +1083,11 @@ g_socket_client_connect (GSocketClient *client,
|
|||||||
g_object_unref (connection);
|
g_object_unref (connection);
|
||||||
connection = NULL;
|
connection = NULL;
|
||||||
}
|
}
|
||||||
else if (proxy)
|
else if (g_hash_table_contains (client->priv->app_proxies, protocol))
|
||||||
|
{
|
||||||
|
application_proxy = TRUE;
|
||||||
|
}
|
||||||
|
else if ((proxy = g_proxy_get_default_for_protocol (protocol)))
|
||||||
{
|
{
|
||||||
GIOStream *proxy_connection;
|
GIOStream *proxy_connection;
|
||||||
|
|
||||||
@ -1101,8 +1104,7 @@ g_socket_client_connect (GSocketClient *client,
|
|||||||
if (connection)
|
if (connection)
|
||||||
g_socket_client_emit_event (client, G_SOCKET_CLIENT_PROXY_NEGOTIATED, connectable, connection);
|
g_socket_client_emit_event (client, G_SOCKET_CLIENT_PROXY_NEGOTIATED, connectable, connection);
|
||||||
}
|
}
|
||||||
else if (!g_hash_table_lookup_extended (client->priv->app_proxies,
|
else
|
||||||
protocol, NULL, NULL))
|
|
||||||
{
|
{
|
||||||
g_set_error (&last_error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
|
g_set_error (&last_error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
|
||||||
_("Proxy protocol '%s' is not supported."),
|
_("Proxy protocol '%s' is not supported."),
|
||||||
@ -1110,10 +1112,6 @@ g_socket_client_connect (GSocketClient *client,
|
|||||||
g_object_unref (connection);
|
g_object_unref (connection);
|
||||||
connection = NULL;
|
connection = NULL;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
application_proxy = TRUE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!application_proxy && connection && client->priv->tls)
|
if (!application_proxy && connection && client->priv->tls)
|
||||||
@ -1523,7 +1521,6 @@ g_socket_client_connected_callback (GObject *source,
|
|||||||
}
|
}
|
||||||
|
|
||||||
protocol = g_proxy_address_get_protocol (data->proxy_addr);
|
protocol = g_proxy_address_get_protocol (data->proxy_addr);
|
||||||
proxy = g_proxy_get_default_for_protocol (protocol);
|
|
||||||
|
|
||||||
/* The connection should not be anything other than TCP,
|
/* The connection should not be anything other than TCP,
|
||||||
* but let's put a safety guard in case
|
* but let's put a safety guard in case
|
||||||
@ -1539,7 +1536,13 @@ g_socket_client_connected_callback (GObject *source,
|
|||||||
|
|
||||||
enumerator_next_async (data);
|
enumerator_next_async (data);
|
||||||
}
|
}
|
||||||
else if (proxy)
|
else if (g_hash_table_contains (data->client->priv->app_proxies, protocol))
|
||||||
|
{
|
||||||
|
/* Simply complete the connection, we don't want to do TLS handshake
|
||||||
|
* as the application proxy handling may need proxy handshake first */
|
||||||
|
g_socket_client_async_connect_complete (data);
|
||||||
|
}
|
||||||
|
else if ((proxy = g_proxy_get_default_for_protocol (protocol)))
|
||||||
{
|
{
|
||||||
g_socket_client_emit_event (data->client, G_SOCKET_CLIENT_PROXY_NEGOTIATING, data->connectable, data->connection);
|
g_socket_client_emit_event (data->client, G_SOCKET_CLIENT_PROXY_NEGOTIATING, data->connectable, data->connection);
|
||||||
g_proxy_connect_async (proxy,
|
g_proxy_connect_async (proxy,
|
||||||
@ -1550,8 +1553,7 @@ g_socket_client_connected_callback (GObject *source,
|
|||||||
data);
|
data);
|
||||||
g_object_unref (proxy);
|
g_object_unref (proxy);
|
||||||
}
|
}
|
||||||
else if (!g_hash_table_lookup_extended (data->client->priv->app_proxies,
|
else
|
||||||
protocol, NULL, NULL))
|
|
||||||
{
|
{
|
||||||
g_clear_error (&data->last_error);
|
g_clear_error (&data->last_error);
|
||||||
|
|
||||||
@ -1561,12 +1563,6 @@ g_socket_client_connected_callback (GObject *source,
|
|||||||
|
|
||||||
enumerator_next_async (data);
|
enumerator_next_async (data);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Simply complete the connection, we don't want to do TLS handshake
|
|
||||||
* as the application proxy handling may need proxy handshake first */
|
|
||||||
g_socket_client_async_connect_complete (data);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -1926,5 +1922,5 @@ void
|
|||||||
g_socket_client_add_application_proxy (GSocketClient *client,
|
g_socket_client_add_application_proxy (GSocketClient *client,
|
||||||
const gchar *protocol)
|
const gchar *protocol)
|
||||||
{
|
{
|
||||||
g_hash_table_insert (client->priv->app_proxies, g_strdup (protocol), NULL);
|
g_hash_table_add (client->priv->app_proxies, g_strdup (protocol));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user