# HG changeset patch # User mstorsjo # Date 1275997683 0 # Node ID 117b1826ce8e28e341de4639b3f9e2794ab47d6b # Parent 5ad38b8596b23d582b4478c0a70a9105c39f35f3 Add support for disabling chunked transfer encoding for the http protocol Patch by Josh Allmann, josh dot allmann at gmail diff -r 5ad38b8596b2 -r 117b1826ce8e http.c --- a/http.c Tue Jun 08 11:18:22 2010 +0000 +++ b/http.c Tue Jun 08 11:48:03 2010 +0000 @@ -48,6 +48,7 @@ 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 @@ 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 @@ 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 @@ "\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 @@ /* 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 @@ * 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, temp, strlen(temp))) < 0 || - (ret = url_write(s->hd, buf, size)) < 0 || - (ret = url_write(s->hd, crlf, sizeof(crlf) - 1)) < 0) + if ((ret = url_write(s->hd, buf, size)) < 0) + return ret; + + if (s->is_chunked && (ret = url_write(s->hd, crlf, sizeof(crlf) - 1)) < 0) return ret; } return size; diff -r 5ad38b8596b2 -r 117b1826ce8e http.h --- a/http.h Tue Jun 08 11:18:22 2010 +0000 +++ b/http.h Tue Jun 08 11:48:03 2010 +0000 @@ -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 */