[Spice-devel] [PATCH spice-gtk] Add SpiceSession:proxy

Marc-André Lureau marcandre.lureau at gmail.com
Tue Jan 29 04:33:43 PST 2013


Add a session property to set proxy setting, since it is racy to rely
on setenv(). Also doing so would override system environment, which
will modify other session too sharing the same process.

v2:
- keep old proxy if update_proxy() fails
- remove strlen() usage
- return NULL in spice_proxy_to_string() on incomplete details
- update property comment
---
 gtk/spice-proxy.c   | 13 +++++++++++++
 gtk/spice-proxy.h   |  1 +
 gtk/spice-session.c | 52 ++++++++++++++++++++++++++++++++++++++++++----------
 3 files changed, 56 insertions(+), 10 deletions(-)

diff --git a/gtk/spice-proxy.c b/gtk/spice-proxy.c
index 97c3a6b..581f030 100644
--- a/gtk/spice-proxy.c
+++ b/gtk/spice-proxy.c
@@ -234,3 +234,16 @@ static void spice_proxy_class_init(SpiceProxyClass *klass)
                                                        G_PARAM_STATIC_STRINGS |
                                                        G_PARAM_READWRITE));
 }
+
+gchar* spice_proxy_to_string(SpiceProxy* self)
+{
+    SpiceProxyPrivate *p;
+
+    g_return_val_if_fail(SPICE_IS_PROXY(self), NULL);
+    p = self->priv;
+
+    if (p->protocol == NULL || p->hostname == NULL)
+        return NULL;
+
+    return g_strdup_printf("%s://%s:%u", p->protocol, p->hostname, p->port);
+}
diff --git a/gtk/spice-proxy.h b/gtk/spice-proxy.h
index c780931..1e7b6d7 100644
--- a/gtk/spice-proxy.h
+++ b/gtk/spice-proxy.h
@@ -53,6 +53,7 @@ const gchar* spice_proxy_get_hostname(SpiceProxy* self);
 void spice_proxy_set_hostname(SpiceProxy* self, const gchar* value);
 guint spice_proxy_get_port(SpiceProxy* self);
 void spice_proxy_set_port(SpiceProxy* self, guint port);
+gchar *spice_proxy_to_string(SpiceProxy* self);
 
 G_END_DECLS
 
diff --git a/gtk/spice-session.c b/gtk/spice-session.c
index 5beb6a1..299bebc 100644
--- a/gtk/spice-session.c
+++ b/gtk/spice-session.c
@@ -106,6 +106,7 @@ enum {
     PROP_UUID,
     PROP_NAME,
     PROP_CA,
+    PROP_PROXY
 };
 
 /* signals */
@@ -118,24 +119,29 @@ enum {
 static guint signals[SPICE_SESSION_LAST_SIGNAL];
 
 
-static SpiceProxy* get_proxy(void)
+static void update_proxy(SpiceSession *self, const gchar *str)
 {
+    SpiceSessionPrivate *s = self->priv;
+    SpiceProxy *proxy = NULL;
     GError *error = NULL;
-    SpiceProxy *proxy;
 
-    const gchar *proxy_env = g_getenv("SPICE_PROXY");
-    if (proxy_env == NULL || strlen(proxy_env) == 0)
-        return NULL;
+    if (str == NULL)
+        str = g_getenv("SPICE_PROXY");
+    if (str == NULL || *str == 0)
+        return;
 
     proxy = spice_proxy_new();
-    if (!spice_proxy_parse(proxy, proxy_env, &error))
+    if (!spice_proxy_parse(proxy, str, &error))
         g_clear_object(&proxy);
     if (error) {
         g_warning ("%s", error->message);
         g_clear_error (&error);
     }
 
-    return proxy;
+    if (proxy != NULL) {
+        g_clear_object(&s->proxy);
+        s->proxy = proxy;
+    }
 }
 
 static void spice_session_init(SpiceSession *session)
@@ -167,7 +173,7 @@ static void spice_session_init(SpiceSession *session)
     cache_init(&s->images, "image");
     cache_init(&s->palettes, "palette");
     s->glz_window = glz_decoder_window_new();
-    s->proxy = get_proxy();
+    update_proxy(session, NULL);
 }
 
 static void
@@ -513,6 +519,9 @@ static void spice_session_get_property(GObject    *gobject,
     case PROP_UUID:
         g_value_set_pointer(value, s->uuid);
 	break;
+    case PROP_PROXY:
+        g_value_take_string(value, spice_proxy_to_string(s->proxy));
+	break;
     default:
 	G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec);
 	break;
@@ -628,6 +637,9 @@ static void spice_session_set_property(GObject      *gobject,
         g_clear_pointer(&s->ca, g_byte_array_unref);
         s->ca = g_value_dup_boxed(value);
         break;
+    case PROP_PROXY:
+        update_proxy(session, g_value_get_string(value));
+        break;
     default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec);
         break;
@@ -1119,6 +1131,23 @@ static void spice_session_class_init(SpiceSessionClass *klass)
                               G_PARAM_READABLE |
                               G_PARAM_STATIC_STRINGS));
 
+    /**
+     * SpiceSession:proxy:
+     *
+     * URI to the proxy server to use when doing network connection.
+     * of the form <![CDATA[ [protocol://]<host>[:port] ]]>
+     *
+     * Since: 0.17
+     **/
+    g_object_class_install_property
+        (gobject_class, PROP_PROXY,
+         g_param_spec_string("proxy",
+                             "Proxy",
+                             "The proxy server",
+                             NULL,
+                             G_PARAM_READWRITE |
+                             G_PARAM_STATIC_STRINGS));
+
     g_type_class_add_private(klass, sizeof(SpiceSessionPrivate));
 }
 
@@ -1698,8 +1727,11 @@ static gboolean open_host_idle_cb(gpointer data)
                                       g_network_address_new(s->host, open_host->port));
 
     SPICE_DEBUG("open host %s:%d", s->host, open_host->port);
-    if (open_host->proxy != NULL)
-        SPICE_DEBUG("(with proxy %p)", open_host->proxy);
+    if (open_host->proxy != NULL) {
+        gchar *str = spice_proxy_to_string(open_host->proxy);
+        SPICE_DEBUG("(with proxy %s)", str);
+        g_free(str);
+    }
 
     return FALSE;
 }
-- 
1.8.1.1.439.g50a6b54



More information about the Spice-devel mailing list