mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
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
This commit is contained in:
parent
b995a6a84f
commit
f2b9b19fad
@ -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;
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user