diff options
author | Samuel Pitoiset <samuel.pitoiset@gmail.com> | 2012-05-28 15:03:54 +0200 |
---|---|---|
committer | Martin Storsjö <martin@martin.st> | 2012-05-28 16:42:40 +0300 |
commit | e999b641df85c4e7fa89dde1c681ddd1d38b0090 (patch) | |
tree | 73ba099d5b1f6ebe7517aeca912de2592ce08c0b | |
parent | 3bdb438e6517ec342e93298de571688584050d68 (diff) | |
download | ffmpeg-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.c | 25 | ||||
-rw-r--r-- | libavformat/http.h | 10 |
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 */ |