summaryrefslogtreecommitdiff
path: root/libavformat/http.c
diff options
context:
space:
mode:
authorJosh Allmann <joshua.allmann@gmail.com>2010-06-08 11:48:03 +0000
committerMartin Storsjö <martin@martin.st>2010-06-08 11:48:03 +0000
commitf2b9b19fad68ce42a016d3ad681a8c92bf11cbe8 (patch)
tree31e36c985fbcd739ca0b3393ef104cff4e8c23f4 /libavformat/http.c
parentb995a6a84f84db79c8d40800d96911a355eb2646 (diff)
Add support for disabling chunked transfer encoding for the http protocol
Patch by Josh Allmann, josh dot allmann at gmail Originally committed as revision 23531 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/http.c')
-rw-r--r--libavformat/http.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/libavformat/http.c b/libavformat/http.c
index 815ffffded..afc61116e9 100644
--- a/libavformat/http.c
+++ b/libavformat/http.c
@@ -48,6 +48,7 @@ typedef struct {
HTTPAuthState auth_state;
int init;
unsigned char headers[BUFFER_SIZE];
+ int is_chunked;
} HTTPContext;
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));
}
+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 */
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;
s->filesize = -1;
s->chunksize = -1;
+ s->is_chunked = 1;
s->off = 0;
s->init = 0;
s->hd = NULL;
@@ -311,7 +318,7 @@ static int http_connect(URLContext *h, const char *path, const char *hoststr,
"\r\n",
post ? "POST" : "GET",
path,
- post ? "Transfer-Encoding: chunked\r\n" : "",
+ post && s->is_chunked ? "Transfer-Encoding: chunked\r\n" : "",
headers,
authstr ? authstr : "");
@@ -412,7 +419,7 @@ static int http_read(URLContext *h, uint8_t *buf, int size)
/* used only when posting data */
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;
char crlf[] = "\r\n";
HTTPContext *s = h->priv_data;
@@ -432,11 +439,16 @@ static int http_write(URLContext *h, const uint8_t *buf, int size)
* signal EOF */
if (size > 0) {
/* upload data using chunked encoding */
+ if(s->is_chunked) {
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 ||
- (ret = url_write(s->hd, buf, size)) < 0 ||
- (ret = url_write(s->hd, crlf, sizeof(crlf) - 1)) < 0)
+ if (s->is_chunked && (ret = url_write(s->hd, crlf, sizeof(crlf) - 1)) < 0)
return ret;
}
return size;