http: Add support for reusing the http socket for subsequent requests
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Mon, 28 May 2012 13:03:54 +0000 (15:03 +0200)
committerMartin Storsjö <martin@martin.st>
Mon, 28 May 2012 13:42:40 +0000 (16:42 +0300)
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@martin.st>
libavformat/http.c
libavformat/http.h

index 0a81a38..65c031e 100644 (file)
@@ -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
index 8dfb192..3579ad7 100644 (file)
  */
 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 */