summaryrefslogtreecommitdiff
path: root/libavformat/http.c
diff options
context:
space:
mode:
authorAman Gupta <aman@tmm1.net>2017-11-13 11:34:50 -0800
committerAman Gupta <aman@tmm1.net>2017-11-14 07:36:51 -0800
commit91a565e20f0c220a6bc37e58c11cea4a3590149c (patch)
tree123b9fd961169d00ad249c4cd33470a12eadbab8 /libavformat/http.c
parent58cf31cee7a456057f337b3102a03206d833d5e8 (diff)
avformat/http: fix chunked response w/ multiple_requests=1
Currently if you use the multiple_requests=1 option and try to receive a chunked-encoded response, http_buf_read() will hang forever. After this patch, EOF is emulated once a 0-byte final chunk is received by setting a new flag. This flag is reset in ff_http_do_new_request(), which is used to make additional requests on the open socket. Reviewed-by: Ronald S. Bultje <rsbultje@gmail.com> Signed-off-by: Aman Gupta <aman@tmm1.net>
Diffstat (limited to 'libavformat/http.c')
-rw-r--r--libavformat/http.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/libavformat/http.c b/libavformat/http.c
index 29635eb546..056d5f6583 100644
--- a/libavformat/http.c
+++ b/libavformat/http.c
@@ -66,6 +66,7 @@ typedef struct HTTPContext {
int http_code;
/* Used if "Transfer-Encoding: chunked" otherwise -1. */
uint64_t chunksize;
+ int chunkend;
uint64_t off, end_off, filesize;
char *location;
HTTPAuthState auth_state;
@@ -305,6 +306,7 @@ int ff_http_do_new_request(URLContext *h, const char *uri)
AVDictionary *options = NULL;
int ret;
+ s->chunkend = 0;
s->off = 0;
s->icy_data_read = 0;
av_free(s->location);
@@ -1281,6 +1283,9 @@ static int http_buf_read(URLContext *h, uint8_t *buf, int size)
int len;
if (s->chunksize != UINT64_MAX) {
+ if (s->chunkend) {
+ return AVERROR_EOF;
+ }
if (!s->chunksize) {
char line[32];
int err;
@@ -1296,7 +1301,12 @@ static int http_buf_read(URLContext *h, uint8_t *buf, int size)
"Chunked encoding data size: %"PRIu64"\n",
s->chunksize);
- if (!s->chunksize) {
+ if (!s->chunksize && s->multiple_requests) {
+ http_get_line(s, line, sizeof(line)); // read empty chunk
+ s->chunkend = 1;
+ return 0;
+ }
+ else if (!s->chunksize) {
av_log(h, AV_LOG_DEBUG, "Last chunk received, closing conn\n");
ffurl_closep(&s->hd);
return 0;