diff options
author | Wim Taymans <wim.taymans@collabora.co.uk> | 2009-03-31 19:08:37 +0200 |
---|---|---|
committer | Wim Taymans <wim@metal.(none)> | 2009-03-31 19:08:37 +0200 |
commit | b037369d5b4547c3dd2d501c3751e5990d01a4f9 (patch) | |
tree | ca8f9a92731cb2f866972ac688355616b646499e | |
parent | 605ded52927528bada4a79844ca8d2316aae98eb (diff) |
rtspsrc: add proxy support
-rw-r--r-- | gst/rtsp/gstrtspsrc.c | 85 | ||||
-rw-r--r-- | gst/rtsp/gstrtspsrc.h | 4 |
2 files changed, 89 insertions, 0 deletions
diff --git a/gst/rtsp/gstrtspsrc.c b/gst/rtsp/gstrtspsrc.c index 64b501cb9..667211a33 100644 --- a/gst/rtsp/gstrtspsrc.c +++ b/gst/rtsp/gstrtspsrc.c @@ -145,12 +145,13 @@ enum #define DEFAULT_TIMEOUT 5000000 #define DEFAULT_TCP_TIMEOUT 20000000 #define DEFAULT_LATENCY_MS 3000 #define DEFAULT_CONNECTION_SPEED 0 #define DEFAULT_NAT_METHOD GST_RTSP_NAT_DUMMY #define DEFAULT_DO_RTCP TRUE +#define DEFAULT_PROXY NULL enum { PROP_0, PROP_LOCATION, PROP_PROTOCOLS, @@ -159,12 +160,13 @@ enum PROP_TIMEOUT, PROP_TCP_TIMEOUT, PROP_LATENCY, PROP_CONNECTION_SPEED, PROP_NAT_METHOD, PROP_DO_RTCP, + PROP_PROXY, PROP_LAST }; #define GST_TYPE_RTSP_LOWER_TRANS (gst_rtsp_lower_trans_get_type()) static GType gst_rtsp_lower_trans_get_type (void) @@ -349,12 +351,25 @@ gst_rtspsrc_class_init (GstRTSPSrcClass * klass) */ g_object_class_install_property (gobject_class, PROP_DO_RTCP, g_param_spec_boolean ("do-rtcp", "Do RTCP", "Send RTCP packets, disable for old incompatible server.", DEFAULT_DO_RTCP, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + /** + * GstRTSPSrc::proxy + * + * Set the proxy parameters. This has to be a string of the format + * [user:passwd@]host[:port]. + * + * Since: 0.10.15 + */ + g_object_class_install_property (gobject_class, PROP_PROXY, + g_param_spec_string ("proxy", "Proxy", + "Proxy settings for HTTP tunneling. Format: [user:passwd@]host[:port]", + DEFAULT_PROXY, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + gstelement_class->change_state = gst_rtspsrc_change_state; gstbin_class->handle_message = gst_rtspsrc_handle_message; gst_rtsp_ext_list_init (); } @@ -420,12 +435,59 @@ gst_rtspsrc_finalize (GObject * object) WSACleanup (); #endif G_OBJECT_CLASS (parent_class)->finalize (object); } +/* a proxy string of the format [user:passwd@]host[:port] */ +static gboolean +gst_rtspsrc_set_proxy (GstRTSPSrc * rtsp, const gchar * proxy) +{ + gchar *p, *at, *col; + + g_free (rtsp->proxy_user); + rtsp->proxy_user = NULL; + g_free (rtsp->proxy_passwd); + rtsp->proxy_passwd = NULL; + g_free (rtsp->proxy_host); + rtsp->proxy_host = NULL; + rtsp->proxy_port = 0; + + p = (gchar *) proxy; + + if (p == NULL) + return TRUE; + + at = strchr (p, '@'); + if (at) { + /* look for user:passwd */ + col = strchr (proxy, ':'); + if (col == NULL || col > at) + return FALSE; + + rtsp->proxy_user = g_strndup (p, col - p); + col++; + rtsp->proxy_passwd = g_strndup (col, at - col); + + /* move to host */ + p = at + 1; + } + col = strchr (p, ':'); + + if (col) { + /* everything before the colon is the hostname */ + rtsp->proxy_host = g_strndup (p, col - p); + p = col + 1; + rtsp->proxy_port = strtoul (p, (char **) &p, 10); + } else { + rtsp->proxy_host = g_strdup (p); + rtsp->proxy_port = 8080; + } + return TRUE; +} + static void gst_rtspsrc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstRTSPSrc *rtspsrc; @@ -470,12 +532,15 @@ gst_rtspsrc_set_property (GObject * object, guint prop_id, const GValue * value, case PROP_NAT_METHOD: rtspsrc->nat_method = g_value_get_enum (value); break; case PROP_DO_RTCP: rtspsrc->do_rtcp = g_value_get_boolean (value); break; + case PROP_PROXY: + gst_rtspsrc_set_proxy (rtspsrc, g_value_get_string (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } @@ -521,12 +586,25 @@ gst_rtspsrc_get_property (GObject * object, guint prop_id, GValue * value, case PROP_NAT_METHOD: g_value_set_enum (value, rtspsrc->nat_method); break; case PROP_DO_RTCP: g_value_set_boolean (value, rtspsrc->do_rtcp); break; + case PROP_PROXY: + { + gchar *str; + + if (rtspsrc->proxy_host) { + str = + g_strdup_printf ("%s:%d", rtspsrc->proxy_host, rtspsrc->proxy_port); + } else { + str = NULL; + } + g_value_take_string (value, str); + break; + } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } @@ -4318,12 +4396,19 @@ restart: url = gst_rtsp_connection_get_url (src->connection); if (url->transports & GST_RTSP_LOWER_TRANS_HTTP) gst_rtsp_connection_set_tunneled (src->connection, TRUE); + if (src->proxy_host) { + GST_DEBUG_OBJECT (src, "setting proxy %s:%d", src->proxy_host, + src->proxy_port); + gst_rtsp_connection_set_proxy (src->connection, src->proxy_host, + src->proxy_port); + } + /* connect */ GST_DEBUG_OBJECT (src, "connecting (%s)...", src->req_location); if ((res = gst_rtsp_connection_connect (src->connection, src->ptcp_timeout)) < 0) goto could_not_connect; diff --git a/gst/rtsp/gstrtspsrc.h b/gst/rtsp/gstrtspsrc.h index c90e671ae..2e41c2749 100644 --- a/gst/rtsp/gstrtspsrc.h +++ b/gst/rtsp/gstrtspsrc.h @@ -185,12 +185,16 @@ struct _GstRTSPSrc { GTimeVal tcp_timeout; GTimeVal *ptcp_timeout; guint latency; guint connection_speed; GstRTSPNatMethod nat_method; gboolean do_rtcp; + gchar *proxy_host; + guint proxy_port; + gchar *proxy_user; + gchar *proxy_passwd; /* state */ GstRTSPState state; gchar *content_base; GstRTSPLowerTrans cur_protocols; gboolean tried_url_auth; |