blob: 8a3c062ab3fd914af7f10eb24b02941b8ca46efc [file] [log] [blame]
From 5495e154c5ba05c7e254865e2ff6d1068f2dc6ca Mon Sep 17 00:00:00 2001
From: Philippe Normand <philn@igalia.com>
Date: Wed, 28 Oct 2015 12:00:09 +0100
Subject: [PATCH] souphttpsrc: cookie jar and context query support
Use a volatile Cookie jar to store cookies and handle the context
query so that session data can be shared with other elements (like
adaptivedemux).
https://bugzilla.gnome.org/show_bug.cgi?id=726314
---
ext/soup/gstsouphttpsrc.c | 41 +++++++++++++++++++++++++++++++++++++++--
ext/soup/gstsouphttpsrc.h | 1 +
2 files changed, 40 insertions(+), 2 deletions(-)
diff --git a/ext/soup/gstsouphttpsrc.c b/ext/soup/gstsouphttpsrc.c
index 52c1b8182..ac41692a5 100644
--- a/ext/soup/gstsouphttpsrc.c
+++ b/ext/soup/gstsouphttpsrc.c
@@ -481,6 +481,7 @@ gst_soup_http_src_init (GstSoupHTTPSrc * src)
src->cookies = NULL;
src->iradio_mode = DEFAULT_IRADIO_MODE;
src->session = NULL;
+ src->cookie_jar = NULL;
src->msg = NULL;
src->timeout = DEFAULT_TIMEOUT;
src->log_level = DEFAULT_SOUP_LOG_LEVEL;
@@ -942,6 +943,9 @@ gst_soup_http_src_session_open (GstSoupHTTPSrc * src)
soup_session_remove_feature_by_type (src->session,
SOUP_TYPE_CONTENT_DECODER);
+ src->cookie_jar = soup_cookie_jar_new ();
+ soup_session_add_feature (src->session,
+ SOUP_SESSION_FEATURE (src->cookie_jar));
return TRUE;
}
@@ -957,6 +961,11 @@ gst_soup_http_src_session_close (GstSoupHTTPSrc * src)
src->msg = NULL;
}
+ if (src->cookie_jar) {
+ g_object_unref (src->cookie_jar);
+ src->cookie_jar = NULL;
+ }
+
if (src->session) {
soup_session_abort (src->session);
g_object_unref (src->session);
@@ -1372,11 +1381,12 @@ gst_soup_http_src_build_message (GstSoupHTTPSrc * src, const gchar * method)
}
if (src->cookies) {
gchar **cookie;
+ SoupURI *uri = soup_uri_new (src->location);
for (cookie = src->cookies; *cookie != NULL; cookie++) {
- soup_message_headers_append (src->msg->request_headers, "Cookie",
- *cookie);
+ soup_cookie_jar_set_cookie (src->cookie_jar, uri, *cookie);
}
+ soup_uri_free (uri);
}
soup_message_set_flags (src->msg, SOUP_MESSAGE_OVERWRITE_CHUNKS |
@@ -1888,6 +1898,12 @@ gst_soup_http_src_query (GstBaseSrc * bsrc, GstQuery * query)
gboolean ret;
GstSchedulingFlags flags;
gint minsize, maxsize, align;
+ GstContext *context;
+ GstStructure *context_structure;
+ char *cookie;
+ const gchar *cookies[2];
+ const gchar *context_type;
+ SoupURI *uri;
switch (GST_QUERY_TYPE (query)) {
case GST_QUERY_URI:
@@ -1899,6 +1915,27 @@ gst_soup_http_src_query (GstBaseSrc * bsrc, GstQuery * query)
}
ret = TRUE;
break;
+ case GST_QUERY_CONTEXT:
+ if (gst_query_parse_context_type (query, &context_type)
+ && !g_strcmp0 (context_type, "http-headers")) {
+ uri = soup_uri_new (src->location);
+ cookie = soup_cookie_jar_get_cookies (src->cookie_jar, uri, TRUE);
+ context = gst_context_new ("http-headers", FALSE);
+ gst_context_make_writable (context);
+ context_structure = gst_context_writable_structure (context);
+ if (cookie != NULL) {
+ cookies[0] = cookie;
+ cookies[1] = NULL;
+ gst_structure_set (context_structure, "cookies", G_TYPE_STRV, cookies,
+ NULL);
+ g_free (cookie);
+ }
+ gst_query_set_context (query, context);
+ soup_uri_free (uri);
+ ret = TRUE;
+ break;
+ }
+
default:
ret = FALSE;
break;
diff --git a/ext/soup/gstsouphttpsrc.h b/ext/soup/gstsouphttpsrc.h
index f140f80c5..52b32c768 100644
--- a/ext/soup/gstsouphttpsrc.h
+++ b/ext/soup/gstsouphttpsrc.h
@@ -60,6 +60,7 @@ struct _GstSoupHTTPSrc {
gchar *proxy_pw; /* Authentication user password for proxy URI. */
gchar **cookies; /* HTTP request cookies. */
SoupSession *session; /* Async context. */
+ SoupCookieJar *cookie_jar; /* Volatile HTTP cookie storage */
SoupMessage *msg; /* Request message. */
gint retry_count; /* Number of retries since we received data */
gint max_retries; /* Maximum number of retries */
--
2.11.0