|
|
@ -48,6 +48,7 @@ typedef struct { |
|
|
|
HTTPAuthState auth_state; |
|
|
|
HTTPAuthState auth_state; |
|
|
|
int init; |
|
|
|
int init; |
|
|
|
unsigned char headers[BUFFER_SIZE]; |
|
|
|
unsigned char headers[BUFFER_SIZE]; |
|
|
|
|
|
|
|
int is_chunked; |
|
|
|
} 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,11 @@ void ff_http_set_headers(URLContext *h, const char *headers) |
|
|
|
av_strlcpy(s->headers, headers, sizeof(s->headers)); |
|
|
|
av_strlcpy(s->headers, headers, sizeof(s->headers)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void ff_http_set_chunked_transfer_encoding(URLContext *h, int is_chunked) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
((HTTPContext*)h->priv_data)->is_chunked = is_chunked; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* return non zero if error */ |
|
|
|
/* return non zero if error */ |
|
|
|
static int http_open_cnx(URLContext *h) |
|
|
|
static int http_open_cnx(URLContext *h) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -148,6 +154,7 @@ static int http_open(URLContext *h, const char *uri, int flags) |
|
|
|
h->priv_data = s; |
|
|
|
h->priv_data = s; |
|
|
|
s->filesize = -1; |
|
|
|
s->filesize = -1; |
|
|
|
s->chunksize = -1; |
|
|
|
s->chunksize = -1; |
|
|
|
|
|
|
|
s->is_chunked = 1; |
|
|
|
s->off = 0; |
|
|
|
s->off = 0; |
|
|
|
s->init = 0; |
|
|
|
s->init = 0; |
|
|
|
s->hd = NULL; |
|
|
|
s->hd = NULL; |
|
|
@ -311,7 +318,7 @@ static int http_connect(URLContext *h, const char *path, const char *hoststr, |
|
|
|
"\r\n", |
|
|
|
"\r\n", |
|
|
|
post ? "POST" : "GET", |
|
|
|
post ? "POST" : "GET", |
|
|
|
path, |
|
|
|
path, |
|
|
|
post ? "Transfer-Encoding: chunked\r\n" : "", |
|
|
|
post && s->is_chunked ? "Transfer-Encoding: chunked\r\n" : "", |
|
|
|
headers, |
|
|
|
headers, |
|
|
|
authstr ? authstr : ""); |
|
|
|
authstr ? authstr : ""); |
|
|
|
|
|
|
|
|
|
|
@ -412,7 +419,7 @@ static int http_read(URLContext *h, uint8_t *buf, int size) |
|
|
|
/* used only when posting data */ |
|
|
|
/* used only when posting data */ |
|
|
|
static int http_write(URLContext *h, const uint8_t *buf, int size) |
|
|
|
static int http_write(URLContext *h, const uint8_t *buf, int size) |
|
|
|
{ |
|
|
|
{ |
|
|
|
char temp[11]; /* 32-bit hex + CRLF + nul */ |
|
|
|
char temp[11] = ""; /* 32-bit hex + CRLF + nul */ |
|
|
|
int ret; |
|
|
|
int ret; |
|
|
|
char crlf[] = "\r\n"; |
|
|
|
char crlf[] = "\r\n"; |
|
|
|
HTTPContext *s = h->priv_data; |
|
|
|
HTTPContext *s = h->priv_data; |
|
|
@ -432,11 +439,16 @@ static int http_write(URLContext *h, const uint8_t *buf, int size) |
|
|
|
* signal EOF */ |
|
|
|
* signal EOF */ |
|
|
|
if (size > 0) { |
|
|
|
if (size > 0) { |
|
|
|
/* upload data using chunked encoding */ |
|
|
|
/* upload data using chunked encoding */ |
|
|
|
|
|
|
|
if(s->is_chunked) { |
|
|
|
snprintf(temp, sizeof(temp), "%x\r\n", size); |
|
|
|
snprintf(temp, sizeof(temp), "%x\r\n", size); |
|
|
|
|
|
|
|
if ((ret = url_write(s->hd, temp, strlen(temp))) < 0) |
|
|
|
|
|
|
|
return ret; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ((ret = url_write(s->hd, buf, size)) < 0) |
|
|
|
|
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
|
|
if ((ret = url_write(s->hd, temp, strlen(temp))) < 0 || |
|
|
|
if (s->is_chunked && (ret = url_write(s->hd, crlf, sizeof(crlf) - 1)) < 0) |
|
|
|
(ret = url_write(s->hd, buf, size)) < 0 || |
|
|
|
|
|
|
|
(ret = url_write(s->hd, crlf, sizeof(crlf) - 1)) < 0) |
|
|
|
|
|
|
|
return ret; |
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
return size; |
|
|
|
return size; |
|
|
|