mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-21 13:36:39 +00:00
adaptivedemux2: Parse cookies in downloadhelper
We need to parse any cookie headers, otherwise we end up sending back attributes likes "Secure" and "httponly" which break some servers. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5776>
This commit is contained in:
parent
155224de96
commit
e8d7604a6a
4 changed files with 71 additions and 9 deletions
|
@ -49,7 +49,7 @@ struct DownloadHelper
|
|||
|
||||
gchar *referer;
|
||||
gchar *user_agent;
|
||||
gchar **cookies;
|
||||
GSList *cookies;
|
||||
};
|
||||
|
||||
struct DownloadHelperTransfer
|
||||
|
@ -654,7 +654,7 @@ downloadhelper_free (DownloadHelper * dh)
|
|||
|
||||
g_free (dh->referer);
|
||||
g_free (dh->user_agent);
|
||||
g_strfreev (dh->cookies);
|
||||
_soup_cookies_free (dh->cookies);
|
||||
|
||||
g_free (dh);
|
||||
}
|
||||
|
@ -681,10 +681,25 @@ downloadhelper_set_user_agent (DownloadHelper * dh, const gchar * user_agent)
|
|||
void
|
||||
downloadhelper_set_cookies (DownloadHelper * dh, gchar ** cookies)
|
||||
{
|
||||
guint i;
|
||||
g_mutex_lock (&dh->transfer_lock);
|
||||
g_strfreev (dh->cookies);
|
||||
dh->cookies = cookies;
|
||||
_soup_cookies_free (dh->cookies);
|
||||
dh->cookies = NULL;
|
||||
|
||||
for (i = 0; cookies[i]; i++) {
|
||||
SoupCookie *cookie = _soup_cookie_parse (cookies[i]);
|
||||
|
||||
if (cookie == NULL) {
|
||||
GST_WARNING ("Couldn't parse cookie, ignoring: %s", cookies[i]);
|
||||
continue;
|
||||
}
|
||||
|
||||
dh->cookies = g_slist_append (dh->cookies, cookie);
|
||||
}
|
||||
|
||||
g_mutex_unlock (&dh->transfer_lock);
|
||||
|
||||
g_strfreev (cookies);
|
||||
}
|
||||
|
||||
/* Called with the transfer lock held */
|
||||
|
@ -902,11 +917,7 @@ downloadhelper_submit_request (DownloadHelper * dh,
|
|||
}
|
||||
|
||||
if (dh->cookies != NULL) {
|
||||
gchar **cookie;
|
||||
|
||||
for (cookie = dh->cookies; *cookie != NULL; cookie++) {
|
||||
_soup_message_headers_append (msg_headers, "Cookie", *cookie);
|
||||
}
|
||||
_soup_cookies_to_request (dh->cookies, msg);
|
||||
}
|
||||
|
||||
transfer_task = transfer_task_new (dh, request, msg, blocking);
|
||||
|
|
|
@ -137,6 +137,10 @@ typedef struct _GstSoupVTable
|
|||
GAsyncResult * result, GError ** error);
|
||||
GInputStream *(*_soup_session_send) (SoupSession * session, SoupMessage * msg,
|
||||
GCancellable * cancellable, GError ** error);
|
||||
SoupCookie* (*_soup_cookie_parse) (const char* header, GUri* origin);
|
||||
void (*_soup_cookies_to_request) (GSList* cookies, SoupMessage* msg);
|
||||
void (*_soup_cookies_free) (GSList *cookies);
|
||||
|
||||
/* *INDENT-ON* */
|
||||
} GstSoupVTable;
|
||||
|
||||
|
@ -291,6 +295,9 @@ gst_soup_load_library (void)
|
|||
LOAD_SYMBOL (soup_session_get_type);
|
||||
LOAD_SYMBOL (soup_session_send);
|
||||
LOAD_SYMBOL (soup_session_send_finish);
|
||||
LOAD_SYMBOL (soup_cookie_parse);
|
||||
LOAD_SYMBOL (soup_cookies_to_request);
|
||||
LOAD_SYMBOL (soup_cookies_free);
|
||||
|
||||
vtable->loaded = TRUE;
|
||||
goto beach;
|
||||
|
@ -937,3 +944,37 @@ gst_soup_session_cancel_message (SoupSession * session, SoupMessage * msg,
|
|||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
SoupCookie *
|
||||
_soup_cookie_parse (const char *header)
|
||||
{
|
||||
#ifdef STATIC_SOUP
|
||||
return soup_cookie_parse (header, NULL);
|
||||
#else
|
||||
g_assert (gst_soup_vtable._soup_cookie_parse != NULL);
|
||||
return gst_soup_vtable._soup_cookie_parse (header, NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_soup_cookies_to_request (GSList * cookies, SoupMessage * msg)
|
||||
{
|
||||
#ifdef STATIC_SOUP
|
||||
soup_cookies_to_request (cookies, msg);
|
||||
#else
|
||||
g_assert (gst_soup_vtable._soup_cookies_to_request != NULL);
|
||||
gst_soup_vtable._soup_cookies_to_request (cookies, msg);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
_soup_cookies_free (GSList * cookies)
|
||||
{
|
||||
#ifdef STATIC_SOUP
|
||||
soup_cookies_free (cookies);
|
||||
#else
|
||||
g_assert (gst_soup_vtable._soup_cookies_free != NULL);
|
||||
gst_soup_vtable._soup_cookies_free (cookies);
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -66,6 +66,9 @@
|
|||
#define _soup_session_send_async _ad2_soup_session_send_async
|
||||
#define _soup_session_send_finish _ad2_soup_session_send_finish
|
||||
#define _soup_session_send _ad2_soup_session_send
|
||||
#define _soup_cookie_parse _ad2_soup_cookie_parse
|
||||
#define _soup_cookies_to_request _ad2_soup_cookies_to_request
|
||||
#define _soup_cookies_free _ad2_soup_cookies_free
|
||||
#define gst_soup_session_cancel_message ad2_gst_soup_session_cancel_message
|
||||
#endif
|
||||
|
||||
|
@ -167,6 +170,11 @@ GInputStream *_soup_session_send (SoupSession *session, SoupMessage *msg,
|
|||
|
||||
void gst_soup_session_cancel_message (SoupSession *session, SoupMessage *msg, GCancellable *cancellable);
|
||||
|
||||
SoupCookie *_soup_cookie_parse (const char *header);
|
||||
void _soup_cookies_to_request (GSList *cookies, SoupMessage *msg);
|
||||
void _soup_cookies_free (GSList *cookies);
|
||||
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GST_SOUP_LOADER_H__ */
|
||||
|
|
|
@ -209,6 +209,8 @@ static gpointer _SOUP_METHOD_POST;
|
|||
#define SOUP_METHOD_HEAD _SOUP_INTERN_METHOD(HEAD)
|
||||
#define SOUP_METHOD_POST _SOUP_INTERN_METHOD(POST)
|
||||
|
||||
typedef struct _SoupCookie SoupCookie;
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GST_SOUP_STUB_H__ */
|
||||
|
|
Loading…
Reference in a new issue