mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-22 14:06:23 +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 *referer;
|
||||||
gchar *user_agent;
|
gchar *user_agent;
|
||||||
gchar **cookies;
|
GSList *cookies;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DownloadHelperTransfer
|
struct DownloadHelperTransfer
|
||||||
|
@ -654,7 +654,7 @@ downloadhelper_free (DownloadHelper * dh)
|
||||||
|
|
||||||
g_free (dh->referer);
|
g_free (dh->referer);
|
||||||
g_free (dh->user_agent);
|
g_free (dh->user_agent);
|
||||||
g_strfreev (dh->cookies);
|
_soup_cookies_free (dh->cookies);
|
||||||
|
|
||||||
g_free (dh);
|
g_free (dh);
|
||||||
}
|
}
|
||||||
|
@ -681,10 +681,25 @@ downloadhelper_set_user_agent (DownloadHelper * dh, const gchar * user_agent)
|
||||||
void
|
void
|
||||||
downloadhelper_set_cookies (DownloadHelper * dh, gchar ** cookies)
|
downloadhelper_set_cookies (DownloadHelper * dh, gchar ** cookies)
|
||||||
{
|
{
|
||||||
|
guint i;
|
||||||
g_mutex_lock (&dh->transfer_lock);
|
g_mutex_lock (&dh->transfer_lock);
|
||||||
g_strfreev (dh->cookies);
|
_soup_cookies_free (dh->cookies);
|
||||||
dh->cookies = 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_mutex_unlock (&dh->transfer_lock);
|
||||||
|
|
||||||
|
g_strfreev (cookies);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called with the transfer lock held */
|
/* Called with the transfer lock held */
|
||||||
|
@ -902,11 +917,7 @@ downloadhelper_submit_request (DownloadHelper * dh,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dh->cookies != NULL) {
|
if (dh->cookies != NULL) {
|
||||||
gchar **cookie;
|
_soup_cookies_to_request (dh->cookies, msg);
|
||||||
|
|
||||||
for (cookie = dh->cookies; *cookie != NULL; cookie++) {
|
|
||||||
_soup_message_headers_append (msg_headers, "Cookie", *cookie);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
transfer_task = transfer_task_new (dh, request, msg, blocking);
|
transfer_task = transfer_task_new (dh, request, msg, blocking);
|
||||||
|
|
|
@ -137,6 +137,10 @@ typedef struct _GstSoupVTable
|
||||||
GAsyncResult * result, GError ** error);
|
GAsyncResult * result, GError ** error);
|
||||||
GInputStream *(*_soup_session_send) (SoupSession * session, SoupMessage * msg,
|
GInputStream *(*_soup_session_send) (SoupSession * session, SoupMessage * msg,
|
||||||
GCancellable * cancellable, GError ** error);
|
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* */
|
/* *INDENT-ON* */
|
||||||
} GstSoupVTable;
|
} GstSoupVTable;
|
||||||
|
|
||||||
|
@ -291,6 +295,9 @@ gst_soup_load_library (void)
|
||||||
LOAD_SYMBOL (soup_session_get_type);
|
LOAD_SYMBOL (soup_session_get_type);
|
||||||
LOAD_SYMBOL (soup_session_send);
|
LOAD_SYMBOL (soup_session_send);
|
||||||
LOAD_SYMBOL (soup_session_send_finish);
|
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;
|
vtable->loaded = TRUE;
|
||||||
goto beach;
|
goto beach;
|
||||||
|
@ -937,3 +944,37 @@ gst_soup_session_cancel_message (SoupSession * session, SoupMessage * msg,
|
||||||
}
|
}
|
||||||
#endif
|
#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_async _ad2_soup_session_send_async
|
||||||
#define _soup_session_send_finish _ad2_soup_session_send_finish
|
#define _soup_session_send_finish _ad2_soup_session_send_finish
|
||||||
#define _soup_session_send _ad2_soup_session_send
|
#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
|
#define gst_soup_session_cancel_message ad2_gst_soup_session_cancel_message
|
||||||
#endif
|
#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);
|
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
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __GST_SOUP_LOADER_H__ */
|
#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_HEAD _SOUP_INTERN_METHOD(HEAD)
|
||||||
#define SOUP_METHOD_POST _SOUP_INTERN_METHOD(POST)
|
#define SOUP_METHOD_POST _SOUP_INTERN_METHOD(POST)
|
||||||
|
|
||||||
|
typedef struct _SoupCookie SoupCookie;
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __GST_SOUP_STUB_H__ */
|
#endif /* __GST_SOUP_STUB_H__ */
|
||||||
|
|
Loading…
Reference in a new issue