diff options
author | Ronald S. Bultje <rsbultje@gmail.com> | 2016-12-05 10:18:10 -0500 |
---|---|---|
committer | Ronald S. Bultje <rsbultje@gmail.com> | 2016-12-05 16:20:58 -0500 |
commit | d3fc5c17de03ffa69d97a5dfabb54d38967daf2d (patch) | |
tree | 0dcec12695e5c2a1f80ea1132172c959143a69d9 | |
parent | 606b21353df7d08ea203193f3026281737c696a2 (diff) | |
download | ffmpeg-d3fc5c17de03ffa69d97a5dfabb54d38967daf2d.tar.gz |
http: move chunk handling from http_read_stream() to http_buf_read().
(cherry picked from commit 845bb401781ef04e342bd558df16a8dbf5f800f9)
-rw-r--r-- | libavformat/http.c | 57 |
1 files changed, 31 insertions, 26 deletions
diff --git a/libavformat/http.c b/libavformat/http.c index 04c4ed6e7b..cdcf4ccde6 100644 --- a/libavformat/http.c +++ b/libavformat/http.c @@ -1140,6 +1140,34 @@ static int http_buf_read(URLContext *h, uint8_t *buf, int size) { HTTPContext *s = h->priv_data; int len; + + if (s->chunksize != UINT64_MAX) { + if (!s->chunksize) { + char line[32]; + int err; + + do { + if ((err = http_get_line(s, line, sizeof(line))) < 0) + return err; + } while (!*line); /* skip CR LF from last chunk */ + + s->chunksize = strtoull(line, NULL, 16); + + av_log(h, AV_LOG_TRACE, + "Chunked encoding data size: %"PRIu64"'\n", + s->chunksize); + + if (!s->chunksize) + return 0; + else if (s->chunksize == UINT64_MAX) { + av_log(h, AV_LOG_ERROR, "Invalid chunk size %"PRIu64"\n", + s->chunksize); + return AVERROR(EINVAL); + } + } + size = FFMIN(size, s->chunksize); + } + /* read bytes from input buffer first */ len = s->buf_end - s->buf_ptr; if (len > 0) { @@ -1161,8 +1189,10 @@ static int http_buf_read(URLContext *h, uint8_t *buf, int size) } if (len > 0) { s->off += len; - if (s->chunksize > 0) + if (s->chunksize > 0) { + av_assert0(s->chunksize >= len); s->chunksize -= len; + } } return len; } @@ -1216,31 +1246,6 @@ static int http_read_stream(URLContext *h, uint8_t *buf, int size) return err; } - if (s->chunksize != UINT64_MAX) { - if (!s->chunksize) { - char line[32]; - - do { - if ((err = http_get_line(s, line, sizeof(line))) < 0) - return err; - } while (!*line); /* skip CR LF from last chunk */ - - s->chunksize = strtoull(line, NULL, 16); - - av_log(h, AV_LOG_TRACE, - "Chunked encoding data size: %"PRIu64"'\n", - s->chunksize); - - if (!s->chunksize) - return 0; - else if (s->chunksize == UINT64_MAX) { - av_log(h, AV_LOG_ERROR, "Invalid chunk size %"PRIu64"\n", - s->chunksize); - return AVERROR(EINVAL); - } - } - size = FFMIN(size, s->chunksize); - } #if CONFIG_ZLIB if (s->compressed) return http_buf_read_compressed(h, buf, size); |