From f2b9b19fad68ce42a016d3ad681a8c92bf11cbe8 Mon Sep 17 00:00:00 2001 From: Josh Allmann Date: Tue, 8 Jun 2010 11:48:03 +0000 Subject: [PATCH] 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 --- libavformat/http.c | 22 +++++++++++++++++----- libavformat/http.h | 8 ++++++++ 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, 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 --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 */