summaryrefslogtreecommitdiff
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
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
-rw-r--r--libavformat/http.c22
-rw-r--r--libavformat/http.h8
2 files changed, 25 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;
diff --git a/libavformat/http.h b/libavformat/http.h
index 6f0566d7d8..5cd1629a19 100644
--- a/libavformat/http.h
+++ b/libavformat/http.h
@@ -39,4 +39,12 @@
*/
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 */