[SCM] libav/experimental: http: Return EOF at the end of the content even if the connection isn't closed

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Jun 30 17:13:51 UTC 2013


The following commit has been merged in the experimental branch:
commit f240ed18efd80abc6df0bdce13cf0ca708f283ae
Author: Martin Storsjö <martin at martin.st>
Date:   Mon Aug 9 08:14:48 2010 +0000

    http: Return EOF at the end of the content even if the connection isn't closed
    
    We do request Connection: close, but some servers ignore it.
    
    Originally committed as revision 24746 to svn://svn.ffmpeg.org/ffmpeg/trunk

diff --git a/libavformat/http.c b/libavformat/http.c
index eae780c..75bfd3a 100644
--- a/libavformat/http.c
+++ b/libavformat/http.c
@@ -49,6 +49,7 @@ typedef struct {
     char location[URL_SIZE];
     HTTPAuthState auth_state;
     unsigned char headers[BUFFER_SIZE];
+    int willclose;          /**< Set if the server correctly handles Connection: close and will close the connection after feeding us the content. */
 } HTTPContext;
 
 #define OFFSET(x) offsetof(HTTPContext, x)
@@ -267,6 +268,9 @@ static int process_line(URLContext *h, char *line, int line_count,
             ff_http_auth_handle_header(&s->auth_state, tag, p);
         } else if (!strcmp (tag, "Authentication-Info")) {
             ff_http_auth_handle_header(&s->auth_state, tag, p);
+        } else if (!strcmp (tag, "Connection")) {
+            if (!strcmp(p, "close"))
+                s->willclose = 1;
         }
     }
     return 1;
@@ -337,6 +341,7 @@ static int http_connect(URLContext *h, const char *path, const char *hoststr,
     s->line_count = 0;
     s->off = 0;
     s->filesize = -1;
+    s->willclose = 0;
     if (post) {
         /* Pretend that it did work. We didn't read any header yet, since
          * we've still to send the POST data, but the code calling this
@@ -399,6 +404,8 @@ static int http_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)
+            return AVERROR_EOF;
         len = url_read(s->hd, buf, size);
     }
     if (len > 0) {

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list