[Spice-devel] [spice-gtk 06/13] http-proxy: add https proxy

Marc-André Lureau marcandre.lureau at gmail.com
Wed Feb 12 02:59:22 PST 2014


On Wed, Feb 12, 2014 at 11:48 AM, Christophe Fergeau
<cfergeau at redhat.com> wrote:
> On Tue, Feb 11, 2014 at 12:37:53PM -0500, Marc-André Lureau wrote:
>> > >  static void
>> > >  wocky_http_proxy_init (WockyHttpProxy *proxy)
>> > > @@ -180,10 +182,34 @@ wocky_http_proxy_connect (GProxy *proxy,
>> > >  {
>> > >    GInputStream *in;
>> > >    GOutputStream *out;
>> > > -  GDataInputStream *data_in;
>> > > -  gchar *buffer;
>> > > +  GDataInputStream *data_in = NULL;
>> > > +  gchar *buffer = NULL;
>> > >    gboolean has_cred;
>> > >
>> > > +#if GLIB_CHECK_VERSION(2, 28, 0)
>> > > +  if (WOCKY_IS_HTTPS_PROXY (proxy))
>> >
>> > Having runtime type checks in a interface virtual method is not very nice,
>> > having a wocky_https_proxy_iface_init would allow to call directly the
>> > right implementation without having to resort to runtime type checking.
>>
>> I decided to use this consciously, as doing it differently added much
>> more boilerplate for no clear benefit.
>
> Gave it a quick try (only compile-tested), and the resulting code is not
> particularly bad. Having both inheritance and runtime type checks is imo
> quite ugly. I can send a follow-up patch after your series land if it's likely
> to be accepted.

Sure, I'll review then (the patch below looks incomplete from a brief
view). I still prefer a runtime type check for this final case.

>
>
> diff --git a/gtk/wocky-http-proxy.c b/gtk/wocky-http-proxy.c
> index 25f2af5..3eb6931 100644
> --- a/gtk/wocky-http-proxy.c
> +++ b/gtk/wocky-http-proxy.c
> @@ -186,30 +186,6 @@ wocky_http_proxy_connect (GProxy *proxy,
>        gchar *buffer = NULL;
>        gboolean has_cred;
>
> -#if GLIB_CHECK_VERSION(2, 28, 0)
> -  if (WOCKY_IS_HTTPS_PROXY (proxy))
> -    {
> -      GIOStream *tlsconn;
> -
> -      tlsconn = g_tls_client_connection_new (io_stream,
> -                                             G_SOCKET_CONNECTABLE(proxy_address),
> -                                             error);
> -      if (!tlsconn)
> -          goto error;
> -
> -      GTlsCertificateFlags tls_validation_flags = G_TLS_CERTIFICATE_VALIDATE_ALL;
> -#ifdef DEBUG
> -      tls_validation_flags -= G_TLS_CERTIFICATE_UNKNOWN_CA + G_TLS_CERTIFICATE_BAD_IDENTITY;
> -#endif
> -      g_tls_client_connection_set_validation_flags (G_TLS_CLIENT_CONNECTION (tlsconn),
> -                                                    tls_validation_flags);
> -      if (!g_tls_connection_handshake (G_TLS_CONNECTION (tlsconn), cancellable, error))
> -          goto error;
> -
> -      io_stream = tlsconn;
> -    }
> -#endif
> -
>        in = g_io_stream_get_input_stream (io_stream);
>        out = g_io_stream_get_output_stream (io_stream);
>
> @@ -251,6 +227,41 @@ error:
>        return NULL;
>      }
>
> +#if GLIB_CHECK_VERSION(2, 28, 0)
> +static GIOStream *
> +wocky_https_proxy_connect (GProxy *proxy,
> +                           GIOStream *io_stream,
> +                           GProxyAddress *proxy_address,
> +                           GCancellable *cancellable,
> +                           GError **error)
> +{
> +    {
> +        GIOStream *tlsconn;
> +
> +        tlsconn = g_tls_client_connection_new (io_stream,
> +                                               G_SOCKET_CONNECTABLE(proxy_address),
> +                                               error);
> +        if (!tlsconn)
> +            goto error;
> +
> +        GTlsCertificateFlags tls_validation_flags = G_TLS_CERTIFICATE_VALIDATE_ALL;
> +#ifdef DEBUG
> +        tls_validation_flags -= G_TLS_CERTIFICATE_UNKNOWN_CA + G_TLS_CERTIFICATE_BAD_IDENTITY;
> +#endif
> +        g_tls_client_connection_set_validation_flags (G_TLS_CLIENT_CONNECTION (tlsconn),
> +                                                      tls_validation_flags);
> +        if (!g_tls_connection_handshake (G_TLS_CONNECTION (tlsconn), cancellable, error))
> +            goto error;
> +
> +        io_stream = tlsconn;
> +    }
> +    return wocky_http_proxy_connect(proxy, io_stream, proxy_address, cancellable, error);
> +
> +error:
> +    return NULL;
> +}
> +#endif
> +
>
>      typedef struct
>      {
> @@ -351,8 +362,9 @@ handshake_completed (GObject *source_object,
>      }
>  #endif
>
> -static void
> -wocky_http_proxy_connect_async (GProxy *proxy,
> +    static ConnectAsyncData *
> +    wocky_http_proxy_connect_async_data_new (
> +        GProxy *proxy,
>          GIOStream *io_stream,
>          GProxyAddress *proxy_address,
>          GCancellable *cancellable,
> @@ -364,7 +376,7 @@ wocky_http_proxy_connect_async (GProxy *proxy,
>
>        simple = g_simple_async_result_new (G_OBJECT (proxy),
>                                            callback, user_data,
> -                                      wocky_http_proxy_connect_async);
> +                                          wocky_http_proxy_connect_async_data_new);
>
>        data = g_slice_new0 (ConnectAsyncData);
>        if (cancellable != NULL)
> @@ -378,12 +390,30 @@ wocky_http_proxy_connect_async (GProxy *proxy,
>        g_simple_async_result_set_op_res_gpointer (simple, data,
>                                                   (GDestroyNotify) free_connect_data);
>
> +      return data;
> +    }
> +
> +
>  #if GLIB_CHECK_VERSION(2, 28, 0)
> -  if (WOCKY_IS_HTTPS_PROXY (proxy))
> +static void
> +wocky_https_proxy_connect_async (GProxy *proxy,
> +                                 GIOStream *io_stream,
> +                                 GProxyAddress *proxy_address,
> +                                 GCancellable *cancellable,
> +                                 GAsyncReadyCallback callback,
> +                                 gpointer user_data)
>  {
> +    ConnectAsyncData *data;
>      GError *error = NULL;
>      GIOStream *tlsconn;
>
> +    data = wocky_http_proxy_connect_async_data_new(proxy,
> +                                                   io_stream,
> +                                                   proxy_address,
> +                                                   cancellable,
> +                                                   callback,
> +                                                   user_data);
> +
>      tlsconn = g_tls_client_connection_new (io_stream,
>                                             G_SOCKET_CONNECTABLE(proxy_address),
>                                             &error);
> @@ -405,12 +435,26 @@ wocky_http_proxy_connect_async (GProxy *proxy,
>                                        G_PRIORITY_DEFAULT, cancellable,
>                                        handshake_completed, data);
>  }
> -  else
>  #endif
> +
> +static void
> +wocky_http_proxy_connect_async (GProxy *proxy,
> +                                GIOStream *io_stream,
> +                                GProxyAddress *proxy_address,
> +                                GCancellable *cancellable,
> +                                GAsyncReadyCallback callback,
> +                                gpointer user_data)
>  {
> +    ConnectAsyncData *data;
> +    data = wocky_http_proxy_connect_async_data_new(proxy,
> +                                                   io_stream,
> +                                                   proxy_address,
> +                                                   cancellable,
> +                                                   callback,
> +                                                   user_data);
> +
>      stream_connected(data, io_stream);
>  }
> -}
>
>      static void
>      request_write_cb (GObject *source,
> @@ -510,6 +554,16 @@ wocky_http_proxy_iface_init (GProxyInterface *proxy_iface)
>    proxy_iface->supports_hostname = wocky_http_proxy_supports_hostname;
>  }
>
> +static void
> +wocky_https_proxy_iface_init (GProxyInterface *proxy_iface)
> +{
> +  proxy_iface->connect  = wocky_https_proxy_connect;
> +  proxy_iface->connect_async = wocky_https_proxy_connect_async;
> +  proxy_iface->connect_finish = wocky_http_proxy_connect_finish;
> +  proxy_iface->supports_hostname = wocky_http_proxy_supports_hostname;
> +}
> +
> +
>  #if GLIB_CHECK_VERSION(2, 28, 0)
>  struct _WockyHttpsProxy
>  {
> @@ -524,7 +578,7 @@ struct _WockyHttpsProxyClass
>  #define wocky_https_proxy_get_type _wocky_https_proxy_get_type
>  G_DEFINE_TYPE_WITH_CODE (WockyHttpsProxy, wocky_https_proxy, WOCKY_TYPE_HTTP_PROXY,
>    G_IMPLEMENT_INTERFACE (G_TYPE_PROXY,
> -    wocky_http_proxy_iface_init)
> +    wocky_https_proxy_iface_init)
>    g_io_extension_point_set_required_type (
>      g_io_extension_point_register (G_PROXY_EXTENSION_POINT_NAME),
>      G_TYPE_PROXY);
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
>



-- 
Marc-André Lureau


More information about the Spice-devel mailing list