[glib] GSocketClient: fix handling of application proxies



commit 6ce79e586f0bb5df49e8f1a1935bfef666986f8a
Author: Dan Winship <danw gnome org>
Date:   Tue Dec 9 13:35:06 2014 +0100

    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

 gio/gsocketclient.c |   34 +++++++++++++++-------------------
 1 files changed, 15 insertions(+), 19 deletions(-)
---
diff --git a/gio/gsocketclient.c b/gio/gsocketclient.c
index 2cd9893..7b3cf8b 100644
--- a/gio/gsocketclient.c
+++ b/gio/gsocketclient.c
@@ -1067,7 +1067,6 @@ g_socket_client_connect (GSocketClient       *client,
          GProxy *proxy;
 
          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,
            * but let's put a safety guard in case
@@ -1084,7 +1083,11 @@ g_socket_client_connect (GSocketClient       *client,
              g_object_unref (connection);
              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;
 
@@ -1101,8 +1104,7 @@ g_socket_client_connect (GSocketClient       *client,
              if (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,
-                                                 protocol, NULL, NULL))
+         else
            {
              g_set_error (&last_error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
                           _("Proxy protocol '%s' is not supported."),
@@ -1110,10 +1112,6 @@ g_socket_client_connect (GSocketClient       *client,
              g_object_unref (connection);
              connection = NULL;
            }
-         else
-           {
-             application_proxy = TRUE;
-           }
        }
 
       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);
-  proxy = g_proxy_get_default_for_protocol (protocol);
 
   /* The connection should not be anything other than TCP,
    * but let's put a safety guard in case
@@ -1539,7 +1536,13 @@ g_socket_client_connected_callback (GObject      *source,
 
       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_proxy_connect_async (proxy,
@@ -1550,8 +1553,7 @@ g_socket_client_connected_callback (GObject      *source,
                              data);
       g_object_unref (proxy);
     }
-  else if (!g_hash_table_lookup_extended (data->client->priv->app_proxies,
-                                         protocol, NULL, NULL))
+  else
     {
       g_clear_error (&data->last_error);
 
@@ -1561,12 +1563,6 @@ g_socket_client_connected_callback (GObject      *source,
 
       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
@@ -1926,5 +1922,5 @@ void
 g_socket_client_add_application_proxy (GSocketClient *client,
                                       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));
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]