Commit c9a75694 authored by mstorsjo's avatar mstorsjo

Add support for disabling chunked transfer encoding for the http protocol

Patch by Josh Allmann, josh dot allmann at gmail


git-svn-id: file:///var/local/repositories/ffmpeg/trunk@23531 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent 38f9bb82
...@@ -48,6 +48,7 @@ typedef struct { ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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;
......
...@@ -39,4 +39,12 @@ ...@@ -39,4 +39,12 @@
*/ */
void ff_http_set_headers(URLContext *h, const char *headers); void ff_http_set_headers(URLContext *h, const char *headers);
/**
* Enables or disables chunked transfer encoding. (default is enabled)
*
* @param h URL context for this HTTP connection
* @param is_chunked 0 to disable chunking, nonzero otherwise.
*/
void ff_http_set_chunked_transfer_encoding(URLContext *h, int is_chunked);
#endif /* AVFORMAT_HTTP_H */ #endif /* AVFORMAT_HTTP_H */
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