| 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 |
| |