mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-02-09 14:14:39 +02:00
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>
This commit is contained in:
parent
58cf31cee7
commit
91a565e20f
@ -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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
"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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user