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/6198>
This commit is contained in:
Olivier Crête 2023-12-06 11:24:35 -06:00 committed by Nirbheek Chauhan
parent 30738b09c1
commit b4003f4449
4 changed files with 71 additions and 9 deletions

View file

@ -49,7 +49,7 @@ struct DownloadHelper
gchar *referer;
gchar *user_agent;
gchar **cookies;
GSList *cookies;
};
struct DownloadHelperTransfer
@ -651,7 +651,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);
}
@ -678,10 +678,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 */
@ -899,11 +914,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);

View file

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

View file

@ -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__ */

View file

@ -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__ */