From 770dd105044d00263da041f509a08b316296a78e Mon Sep 17 00:00:00 2001 From: Lucas de Andrade Date: Fri, 25 Sep 2015 12:11:52 -0300 Subject: [PATCH] avformat/hls: Update Cookies response with Setcookie Context cookies must be updated when a playlist response return Setcookie header. Signed-off-by: wm4 --- libavformat/hls.c | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/libavformat/hls.c b/libavformat/hls.c index adaa33aa10..f17fd45608 100644 --- a/libavformat/hls.c +++ b/libavformat/hls.c @@ -525,6 +525,14 @@ static int url_connect(struct playlist *pls, AVDictionary *opts, AVDictionary *o return ret; } +static void update_options(char **dest, const char *name, void *src) +{ + av_freep(dest); + av_opt_get(src, name, 0, (uint8_t**)dest); + if (*dest && !strlen(*dest)) + av_freep(dest); +} + static int open_url(HLSContext *c, URLContext **uc, const char *url, AVDictionary *opts) { AVDictionary *tmp = NULL; @@ -534,6 +542,12 @@ static int open_url(HLSContext *c, URLContext **uc, const char *url, AVDictionar av_dict_copy(&tmp, opts, 0); ret = ffurl_open(uc, url, AVIO_FLAG_READ, c->interrupt_callback, &tmp); + if( ret >= 0) { + // update cookies on http response with setcookies. + URLContext *u = *uc; + update_options(&c->cookies, "cookies", u->priv_data); + av_dict_set(&opts, "cookies", c->cookies, 0); + } av_dict_free(&tmp); @@ -958,18 +972,9 @@ static void intercept_id3(struct playlist *pls, uint8_t *buf, pls->is_id3_timestamped = (pls->id3_mpegts_timestamp != AV_NOPTS_VALUE); } -static void update_options(char **dest, const char *name, void *src) -{ - av_freep(dest); - av_opt_get(src, name, 0, (uint8_t**)dest); - if (*dest && !strlen(*dest)) - av_freep(dest); -} - static int open_input(HLSContext *c, struct playlist *pls) { AVDictionary *opts = NULL; - AVDictionary *opts2 = NULL; int ret; struct segment *seg = pls->segments[pls->cur_seq_no - pls->start_seq_no]; @@ -979,9 +984,6 @@ static int open_input(HLSContext *c, struct playlist *pls) av_dict_set(&opts, "headers", c->headers, 0); av_dict_set(&opts, "seekable", "0", 0); - // Same opts for key request (ffurl_open mutilates the opts so it cannot be used twice) - av_dict_copy(&opts2, opts, 0); - if (seg->size >= 0) { /* try to restrict the HTTP request to the part we want * (if this is in fact a HTTP request) */ @@ -999,14 +1001,12 @@ static int open_input(HLSContext *c, struct playlist *pls) char iv[33], key[33], url[MAX_URL_SIZE]; if (strcmp(seg->key, pls->key_url)) { URLContext *uc; - if (open_url(pls->parent->priv_data, &uc, seg->key, opts2) == 0) { + if (open_url(pls->parent->priv_data, &uc, seg->key, opts) == 0) { if (ffurl_read_complete(uc, pls->key, sizeof(pls->key)) != sizeof(pls->key)) { av_log(NULL, AV_LOG_ERROR, "Unable to read key file %s\n", seg->key); } - update_options(&c->cookies, "cookies", uc->priv_data); - av_dict_set(&opts, "cookies", c->cookies, 0); ffurl_close(uc); } else { av_log(NULL, AV_LOG_ERROR, "Unable to open key file %s\n", @@ -1055,7 +1055,6 @@ static int open_input(HLSContext *c, struct playlist *pls) cleanup: av_dict_free(&opts); - av_dict_free(&opts2); pls->cur_seg_offset = 0; return ret; }