History

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.)

Martin Storsjö committed 12 years ago

Commit 8bf3bf61 parent da7d8391 file · +2 −1Browse files

Unified · Split

libavformat/http.c+2−1
@@ -699,7 +699,8 @@ static int http_buf_read(URLContext *h, uint8_t *buf, int size) · 698 unmodified lines
699 memcpy(buf, s->buf_ptr, len);699 memcpy(buf, s->buf_ptr, len);
700 s->buf_ptr += len;700 s->buf_ptr += len;
701 } else {701 } else {
702 if (!s->willclose && s->filesize >= 0 && s->off >= s->filesize)702 if ((!s->willclose || s->chunksize < 0) &&
703 s->filesize >= 0 && s->off >= s->filesize)
703 return AVERROR_EOF;704 return AVERROR_EOF;
704 len = ffurl_read(s->hd, buf, size);705 len = ffurl_read(s->hd, buf, size);
705 }706 }

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t