Commit 0f3254b8 authored by Josh Allmann's avatar Josh Allmann Committed by Martin Storsjö

Modify the behaviour of http_open to implicitly delay connection establishment

The connection is made on the first http_read, http_write or http_seek.

Patch by Josh Allmann, joshua dot allmann at gmail

Originally committed as revision 23525 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 8190f62f
...@@ -45,6 +45,7 @@ typedef struct { ...@@ -45,6 +45,7 @@ typedef struct {
int64_t off, filesize; int64_t off, filesize;
char location[URL_SIZE]; char location[URL_SIZE];
HTTPAuthState auth_state; HTTPAuthState auth_state;
int init;
} HTTPContext; } HTTPContext;
static int http_connect(URLContext *h, const char *path, const char *hoststr, static int http_connect(URLContext *h, const char *path, const char *hoststr,
...@@ -65,6 +66,7 @@ static int http_open_cnx(URLContext *h) ...@@ -65,6 +66,7 @@ static int http_open_cnx(URLContext *h)
HTTPContext *s = h->priv_data; HTTPContext *s = h->priv_data;
URLContext *hd = NULL; URLContext *hd = NULL;
s->init = 1;
proxy_path = getenv("http_proxy"); proxy_path = getenv("http_proxy");
use_proxy = (proxy_path != NULL) && !getenv("no_proxy") && use_proxy = (proxy_path != NULL) && !getenv("no_proxy") &&
av_strstart(proxy_path, "http://", NULL); av_strstart(proxy_path, "http://", NULL);
...@@ -123,7 +125,6 @@ static int http_open_cnx(URLContext *h) ...@@ -123,7 +125,6 @@ static int http_open_cnx(URLContext *h)
static int http_open(URLContext *h, const char *uri, int flags) static int http_open(URLContext *h, const char *uri, int flags)
{ {
HTTPContext *s; HTTPContext *s;
int ret;
h->is_streamed = 1; h->is_streamed = 1;
...@@ -135,13 +136,11 @@ static int http_open(URLContext *h, const char *uri, int flags) ...@@ -135,13 +136,11 @@ static int http_open(URLContext *h, const char *uri, int flags)
s->filesize = -1; s->filesize = -1;
s->chunksize = -1; s->chunksize = -1;
s->off = 0; s->off = 0;
s->init = 0;
memset(&s->auth_state, 0, sizeof(s->auth_state)); memset(&s->auth_state, 0, sizeof(s->auth_state));
av_strlcpy(s->location, uri, URL_SIZE); av_strlcpy(s->location, uri, URL_SIZE);
ret = http_open_cnx(h); return 0;
if (ret != 0)
av_free (s);
return ret;
} }
static int http_getc(HTTPContext *s) static int http_getc(HTTPContext *s)
{ {
...@@ -322,6 +321,17 @@ static int http_read(URLContext *h, uint8_t *buf, int size) ...@@ -322,6 +321,17 @@ static int http_read(URLContext *h, uint8_t *buf, int size)
HTTPContext *s = h->priv_data; HTTPContext *s = h->priv_data;
int len; int len;
if (!s->init) {
int ret = http_open_cnx(h);
if (ret != 0)
return ret;
}
/* A size of zero can be used to force
* initializaton of the connection. */
if (!size)
return 0;
if (s->chunksize >= 0) { if (s->chunksize >= 0) {
if (!s->chunksize) { if (!s->chunksize) {
char line[32]; char line[32];
...@@ -369,6 +379,12 @@ static int http_write(URLContext *h, const uint8_t *buf, int size) ...@@ -369,6 +379,12 @@ static int http_write(URLContext *h, const uint8_t *buf, int size)
char crlf[] = "\r\n"; char crlf[] = "\r\n";
HTTPContext *s = h->priv_data; HTTPContext *s = h->priv_data;
if (!s->init) {
int ret = http_open_cnx(h);
if (ret != 0)
return ret;
}
if (s->chunksize == -1) { if (s->chunksize == -1) {
/* headers are sent without any special encoding */ /* headers are sent without any special encoding */
return url_write(s->hd, buf, size); return url_write(s->hd, buf, size);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment