aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>2012-05-28 15:03:54 +0200
committerMartin Storsjö <martin@martin.st>2012-05-28 16:42:40 +0300
commite999b641df85c4e7fa89dde1c681ddd1d38b0090 (patch)
tree73ba099d5b1f6ebe7517aeca912de2592ce08c0b
parent3bdb438e6517ec342e93298de571688584050d68 (diff)
downloadffmpeg-e999b641df85c4e7fa89dde1c681ddd1d38b0090.tar.gz
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@martin.st>
-rw-r--r--libavformat/http.c25
-rw-r--r--libavformat/http.h10
2 files changed, 30 insertions, 5 deletions
diff --git a/libavformat/http.c b/libavformat/http.c
index 0a81a38da1..65c031e163 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 8dfb192364..3579ad745a 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 */