summaryrefslogtreecommitdiffstats
path: root/ext/soup
diff options
context:
space:
mode:
authorRon McOuat <rmcouat@smartt.com>2008-11-27 16:43:24 +0000
committerSebastian Dröge <slomo@circular-chaos.org>2008-11-27 16:43:24 +0000
commit24e30c883470beabbe88e84ead18ad0d24adc99a (patch)
treeaea79052ee5bbf2af453896a6d7319c6ba149480 /ext/soup
parent3f39ed1a0cee75bcf0ef3ae857f02d70f1630e83 (diff)
Add support for basic and digest authentication in souphttpsrc.
Original commit message from CVS: Patch by: Ron McOuat <rmcouat at smartt dot com> * ext/soup/gstsouphttpsrc.c: (gst_soup_http_src_class_init), (gst_soup_http_src_init), (gst_soup_http_src_dispose), (gst_soup_http_src_set_property), (gst_soup_http_src_get_property), (gst_soup_http_src_authenticate_cb), (gst_soup_http_src_start): * ext/soup/gstsouphttpsrc.h: * tests/check/elements/souphttpsrc.c: (basic_auth_cb), (digest_auth_cb), (run_test), (GST_START_TEST), (souphttpsrc_suite), (run_server): Add support for basic and digest authentication in souphttpsrc. Fixes bug #561775.
Diffstat (limited to 'ext/soup')
-rw-r--r--ext/soup/gstsouphttpsrc.c95
-rw-r--r--ext/soup/gstsouphttpsrc.h4
2 files changed, 92 insertions, 7 deletions
diff --git a/ext/soup/gstsouphttpsrc.c b/ext/soup/gstsouphttpsrc.c
index 67219e06..139d3337 100644
--- a/ext/soup/gstsouphttpsrc.c
+++ b/ext/soup/gstsouphttpsrc.c
@@ -121,6 +121,10 @@ enum
PROP_USER_AGENT,
PROP_AUTOMATIC_REDIRECT,
PROP_PROXY,
+ PROP_USER_ID,
+ PROP_USER_PW,
+ PROP_PROXY_ID,
+ PROP_PROXY_PW,
PROP_COOKIES,
PROP_IRADIO_MODE,
PROP_IRADIO_NAME,
@@ -195,7 +199,9 @@ static void gst_soup_http_src_got_body_cb (SoupMessage * msg,
GstSoupHTTPSrc * src);
static void gst_soup_http_src_finished_cb (SoupMessage * msg,
GstSoupHTTPSrc * src);
-
+static void gst_soup_http_src_authenticate_cb (SoupSession * session,
+ SoupMessage * msg, SoupAuth * auth, gboolean retrying,
+ GstSoupHTTPSrc * src);
static void
_do_init (GType type)
@@ -262,12 +268,27 @@ gst_soup_http_src_class_init (GstSoupHTTPSrcClass * klass)
g_param_spec_string ("proxy", "Proxy",
"HTTP proxy server URI", "", G_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
- PROP_COOKIES, g_param_spec_boxed ("cookies", "Cookies",
- "HTTP request cookies", G_TYPE_STRV, G_PARAM_READWRITE));
- g_object_class_install_property (gobject_class,
- PROP_IS_LIVE,
- g_param_spec_boolean ("is-live", "is-live",
- "Act like a live source", FALSE, G_PARAM_READWRITE));
+ PROP_USER_ID,
+ g_param_spec_string ("user-id", "user-id",
+ "HTTP location URI user id for authentication", "",
+ G_PARAM_READWRITE));
+ g_object_class_install_property (gobject_class, PROP_USER_PW,
+ g_param_spec_string ("user-pw", "user-pw",
+ "HTTP location URI user password for authentication", "",
+ G_PARAM_READWRITE));
+ g_object_class_install_property (gobject_class, PROP_PROXY_ID,
+ g_param_spec_string ("proxy-id", "proxy-id",
+ "HTTP proxy URI user id for authentication", "", G_PARAM_READWRITE));
+ g_object_class_install_property (gobject_class, PROP_PROXY_PW,
+ g_param_spec_string ("proxy-pw", "proxy-pw",
+ "HTTP proxy URI user password for authentication", "",
+ G_PARAM_READWRITE));
+ g_object_class_install_property (gobject_class, PROP_COOKIES,
+ g_param_spec_boxed ("cookies", "Cookies", "HTTP request cookies",
+ G_TYPE_STRV, G_PARAM_READWRITE));
+ g_object_class_install_property (gobject_class, PROP_IS_LIVE,
+ g_param_spec_boolean ("is-live", "is-live", "Act like a live source",
+ FALSE, G_PARAM_READWRITE));
/* icecast stuff */
g_object_class_install_property (gobject_class,
@@ -319,6 +340,10 @@ gst_soup_http_src_init (GstSoupHTTPSrc * src, GstSoupHTTPSrcClass * g_class)
src->location = NULL;
src->automatic_redirect = TRUE;
src->user_agent = g_strdup (DEFAULT_USER_AGENT);
+ src->user_id = NULL;
+ src->user_pw = NULL;
+ src->proxy_id = NULL;
+ src->proxy_pw = NULL;
src->cookies = NULL;
src->icy_caps = NULL;
src->iradio_mode = FALSE;
@@ -358,6 +383,14 @@ gst_soup_http_src_dispose (GObject * gobject)
soup_uri_free (src->proxy);
src->proxy = NULL;
}
+ g_free (src->user_id);
+ src->user_id = NULL;
+ g_free (src->user_pw);
+ src->user_pw = NULL;
+ g_free (src->proxy_id);
+ src->proxy_id = NULL;
+ g_free (src->proxy_pw);
+ src->proxy_pw = NULL;
g_strfreev (src->cookies);
g_free (src->iradio_name);
src->iradio_name = NULL;
@@ -435,6 +468,26 @@ gst_soup_http_src_set_property (GObject * object, guint prop_id,
case PROP_IS_LIVE:
gst_base_src_set_live (GST_BASE_SRC (src), g_value_get_boolean (value));
break;
+ case PROP_USER_ID:
+ if (src->user_id)
+ g_free (src->user_id);
+ src->user_id = g_value_dup_string (value);
+ break;
+ case PROP_USER_PW:
+ if (src->user_pw)
+ g_free (src->user_pw);
+ src->user_pw = g_value_dup_string (value);
+ break;
+ case PROP_PROXY_ID:
+ if (src->proxy_id)
+ g_free (src->proxy_id);
+ src->proxy_id = g_value_dup_string (value);
+ break;
+ case PROP_PROXY_PW:
+ if (src->proxy_pw)
+ g_free (src->proxy_pw);
+ src->proxy_pw = g_value_dup_string (value);
+ break;
}
done:
return;
@@ -487,6 +540,18 @@ gst_soup_http_src_get_property (GObject * object, guint prop_id,
case PROP_IRADIO_TITLE:
g_value_set_string (value, src->iradio_title);
break;
+ case PROP_USER_ID:
+ g_value_set_string (value, src->user_id);
+ break;
+ case PROP_USER_PW:
+ g_value_set_string (value, src->user_pw);
+ break;
+ case PROP_PROXY_ID:
+ g_value_set_string (value, src->proxy_id);
+ break;
+ case PROP_PROXY_PW:
+ g_value_set_string (value, src->proxy_pw);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -564,6 +629,20 @@ gst_soup_http_src_session_close (GstSoupHTTPSrc * src)
}
static void
+gst_soup_http_src_authenticate_cb (SoupSession * session, SoupMessage * msg,
+ SoupAuth * auth, gboolean retrying, GstSoupHTTPSrc * src)
+{
+ if (!retrying) {
+ /* First time authentication only, if we fail and are called again with retry true fall through */
+ if (msg->status_code == SOUP_STATUS_UNAUTHORIZED) {
+ soup_auth_authenticate (auth, src->user_id, src->user_pw);
+ } else if (msg->status_code == SOUP_STATUS_PROXY_AUTHENTICATION_REQUIRED) {
+ soup_auth_authenticate (auth, src->proxy_id, src->proxy_pw);
+ }
+ }
+}
+
+static void
gst_soup_http_src_got_headers_cb (SoupMessage * msg, GstSoupHTTPSrc * src)
{
const char *value;
@@ -1063,6 +1142,8 @@ gst_soup_http_src_start (GstBaseSrc * bsrc)
return FALSE;
}
+ g_signal_connect (src->session, "authenticate",
+ G_CALLBACK (gst_soup_http_src_authenticate_cb), src);
return TRUE;
}
diff --git a/ext/soup/gstsouphttpsrc.h b/ext/soup/gstsouphttpsrc.h
index 464da340..38d670b1 100644
--- a/ext/soup/gstsouphttpsrc.h
+++ b/ext/soup/gstsouphttpsrc.h
@@ -52,6 +52,10 @@ struct _GstSoupHTTPSrc {
gchar *user_agent; /* User-Agent HTTP header. */
gboolean automatic_redirect; /* Follow redirects. */
SoupURI *proxy; /* HTTP proxy URI. */
+ gchar *user_id; /* Authentication user id for location URI. */
+ gchar *user_pw; /* Authentication user password for location URI. */
+ gchar *proxy_id; /* Authentication user id for proxy URI. */
+ gchar *proxy_pw; /* Authentication user password for proxy URI. */
gchar **cookies; /* HTTP request cookies. */
GMainContext *context; /* I/O context. */
GMainLoop *loop; /* Event loop. */