[SCM] libav/experimental: http: Stop reading after receiving the whole file for non-chunked transfers

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sat Aug 30 15:49:44 UTC 2014


The following commit has been merged in the experimental branch:
commit 8bf3bf69ad7333bf0c45f4d2797fc2c61bc8922f
Author: Martin Storsjö <martin at martin.st>
Date:   Mon Aug 11 10:18:28 2014 +0300

    http: Stop reading after receiving the whole file for non-chunked transfers
    
    Previously this logic was only used if the server didn't
    respond with Connection: close, but use it even for that case,
    if the server response is non-chunked.
    
    Originally the http code has relied on Connection: close to close
    the socket when the file/stream is received - the http protocol
    code just kept reading from the socket until the socket was closed.
    In f240ed18 we added a check for the file size, because some
    http servers didn't respond with Connection: close (and wouldn't
    close the socket) even though we requested it, which meant that the
    http protocol blocked for a long time at the end of files, waiting
    for a socket level timeout.
    
    When reading over tls, trying to read at the end of the connection,
    when the peer has closed the connection, can produce spurious (but
    harmless) warnings. Therefore always voluntarily stop reading when
    the specified file size has been received, if not using a chunked
    transfer encoding. (For chunked transfers, we already return 0
    as soon as we get the chunk header indicating end of stream.)
    
    Signed-off-by: Martin Storsjö <martin at martin.st>

diff --git a/libavformat/http.c b/libavformat/http.c
index ee7dbb3..b2e07b4 100644
--- a/libavformat/http.c
+++ b/libavformat/http.c
@@ -699,7 +699,8 @@ static int http_buf_read(URLContext *h, uint8_t *buf, int size)
         memcpy(buf, s->buf_ptr, len);
         s->buf_ptr += len;
     } else {
-        if (!s->willclose && s->filesize >= 0 && s->off >= s->filesize)
+        if ((!s->willclose || s->chunksize < 0) &&
+            s->filesize >= 0 && s->off >= s->filesize)
             return AVERROR_EOF;
         len = ffurl_read(s->hd, buf, size);
     }

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list