Commit 91a565e2 authored by Aman Gupta's avatar Aman Gupta

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: 's avatarRonald S. Bultje <rsbultje@gmail.com>
Signed-off-by: 's avatarAman Gupta <aman@tmm1.net>
parent 58cf31ce
...@@ -66,6 +66,7 @@ typedef struct HTTPContext { ...@@ -66,6 +66,7 @@ typedef struct HTTPContext {
int http_code; int http_code;
/* Used if "Transfer-Encoding: chunked" otherwise -1. */ /* Used if "Transfer-Encoding: chunked" otherwise -1. */
uint64_t chunksize; uint64_t chunksize;
int chunkend;
uint64_t off, end_off, filesize; uint64_t off, end_off, filesize;
char *location; char *location;
HTTPAuthState auth_state; HTTPAuthState auth_state;
...@@ -305,6 +306,7 @@ int ff_http_do_new_request(URLContext *h, const char *uri) ...@@ -305,6 +306,7 @@ int ff_http_do_new_request(URLContext *h, const char *uri)
AVDictionary *options = NULL; AVDictionary *options = NULL;
int ret; int ret;
s->chunkend = 0;
s->off = 0; s->off = 0;
s->icy_data_read = 0; s->icy_data_read = 0;
av_free(s->location); av_free(s->location);
...@@ -1281,6 +1283,9 @@ static int http_buf_read(URLContext *h, uint8_t *buf, int size) ...@@ -1281,6 +1283,9 @@ static int http_buf_read(URLContext *h, uint8_t *buf, int size)
int len; int len;
if (s->chunksize != UINT64_MAX) { if (s->chunksize != UINT64_MAX) {
if (s->chunkend) {
return AVERROR_EOF;
}
if (!s->chunksize) { if (!s->chunksize) {
char line[32]; char line[32];
int err; int err;
...@@ -1296,7 +1301,12 @@ static int http_buf_read(URLContext *h, uint8_t *buf, int size) ...@@ -1296,7 +1301,12 @@ static int http_buf_read(URLContext *h, uint8_t *buf, int size)
"Chunked encoding data size: %"PRIu64"\n", "Chunked encoding data size: %"PRIu64"\n",
s->chunksize); 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"); av_log(h, AV_LOG_DEBUG, "Last chunk received, closing conn\n");
ffurl_closep(&s->hd); ffurl_closep(&s->hd);
return 0; return 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment