[FFmpeg-cvslog] http: Add support for reusing the http socket for subsequent requests

Samuel Pitoiset git at videolan.org
Wed May 30 01:51:52 CEST 2012


ffmpeg | branch: master | Samuel Pitoiset <samuel.pitoiset at gmail.com> | Mon May 28 15:03:54 2012 +0200| [e999b641df85c4e7fa89dde1c681ddd1d38b0090] | committer: Martin Storsjö

http: Add support for reusing the http socket for subsequent requests

Introduce ff_http_do_new_request(), a new function which sends a new
HTTP request, reusing the existing connection to the server.

Signed-off-by: Martin Storsjö <martin at martin.st>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=e999b641df85c4e7fa89dde1c681ddd1d38b0090
---

 libavformat/http.c |   25 ++++++++++++++++++++-----
 libavformat/http.h |   10 ++++++++++
 2 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/libavformat/http.c b/libavformat/http.c
index 0a81a38..65c031e 100644
--- a/libavformat/http.c
+++ b/libavformat/http.c
@@ -139,12 +139,16 @@ static int http_open_cnx(URLContext *h)
     }
 
     ff_url_join(buf, sizeof(buf), lower_proto, NULL, hostname, port, NULL);
-    err = ffurl_open(&hd, buf, AVIO_FLAG_READ_WRITE,
-                     &h->interrupt_callback, NULL);
-    if (err < 0)
-        goto fail;
 
-    s->hd = hd;
+    if (!s->hd) {
+        err = ffurl_open(&hd, buf, AVIO_FLAG_READ_WRITE,
+                         &h->interrupt_callback, NULL);
+        if (err < 0)
+            goto fail;
+
+        s->hd = hd;
+    }
+
     cur_auth_type = s->auth_state.auth_type;
     cur_proxy_auth_type = s->auth_state.auth_type;
     if (http_connect(h, path, local_path, hoststr, auth, proxyauth, &location_changed) < 0)
@@ -187,6 +191,16 @@ static int http_open_cnx(URLContext *h)
     return AVERROR(EIO);
 }
 
+int ff_http_do_new_request(URLContext *h, const char *uri)
+{
+    HTTPContext *s = h->priv_data;
+
+    s->off = 0;
+    av_strlcpy(s->location, uri, sizeof(s->location));
+
+    return http_open_cnx(h);
+}
+
 static int http_open(URLContext *h, const char *uri, int flags)
 {
     HTTPContext *s = h->priv_data;
@@ -430,6 +444,7 @@ static int http_connect(URLContext *h, const char *path, const char *local_path,
     s->filesize = -1;
     s->willclose = 0;
     s->end_chunked_post = 0;
+    s->end_header = 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
diff --git a/libavformat/http.h b/libavformat/http.h
index 8dfb192..3579ad7 100644
--- a/libavformat/http.h
+++ b/libavformat/http.h
@@ -35,4 +35,14 @@
  */
 void ff_http_init_auth_state(URLContext *dest, const URLContext *src);
 
+/**
+ * Send a new HTTP request, reusing the old connection.
+ *
+ * @param h pointer to the ressource
+ * @param uri uri used to perform the request
+ * @return a negative value if an error condition occured, 0
+ * otherwise
+ */
+int ff_http_do_new_request(URLContext *h, const char *uri);
+
 #endif /* AVFORMAT_HTTP_H */



More information about the ffmpeg-cvslog mailing list