Module: libav
Branch: master
Commit: e999b641df85c4e7fa89dde1c681ddd1d38b0090

Author:    Samuel Pitoiset <samuel.pitoi...@gmail.com>
Committer: Martin Storsjö <mar...@martin.st>
Date:      Mon May 28 15:03:54 2012 +0200

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ö <mar...@martin.st>

---

 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 */

_______________________________________________
libav-commits mailing list
libav-commits@libav.org
https://lists.libav.org/mailman/listinfo/libav-commits

Reply via email to