mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-27 04:42:39 +00: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;
|
HTTPAuthState auth_state;
|
||||||
int init;
|
int init;
|
||||||
unsigned char headers[BUFFER_SIZE];
|
unsigned char headers[BUFFER_SIZE];
|
||||||
|
int is_chunked;
|
||||||
} HTTPContext;
|
} HTTPContext;
|
||||||
|
|
||||||
static int http_connect(URLContext *h, const char *path, const char *hoststr,
|
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));
|
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 */
|
/* return non zero if error */
|
||||||
static int http_open_cnx(URLContext *h)
|
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;
|
h->priv_data = s;
|
||||||
s->filesize = -1;
|
s->filesize = -1;
|
||||||
s->chunksize = -1;
|
s->chunksize = -1;
|
||||||
|
s->is_chunked = 1;
|
||||||
s->off = 0;
|
s->off = 0;
|
||||||
s->init = 0;
|
s->init = 0;
|
||||||
s->hd = NULL;
|
s->hd = NULL;
|
||||||
@ -311,7 +318,7 @@ static int http_connect(URLContext *h, const char *path, const char *hoststr,
|
|||||||
"\r\n",
|
"\r\n",
|
||||||
post ? "POST" : "GET",
|
post ? "POST" : "GET",
|
||||||
path,
|
path,
|
||||||
post ? "Transfer-Encoding: chunked\r\n" : "",
|
post && s->is_chunked ? "Transfer-Encoding: chunked\r\n" : "",
|
||||||
headers,
|
headers,
|
||||||
authstr ? authstr : "");
|
authstr ? authstr : "");
|
||||||
|
|
||||||
@ -412,7 +419,7 @@ static int http_read(URLContext *h, uint8_t *buf, int size)
|
|||||||
/* used only when posting data */
|
/* used only when posting data */
|
||||||
static int http_write(URLContext *h, const uint8_t *buf, int size)
|
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;
|
int ret;
|
||||||
char crlf[] = "\r\n";
|
char crlf[] = "\r\n";
|
||||||
HTTPContext *s = h->priv_data;
|
HTTPContext *s = h->priv_data;
|
||||||
@ -432,11 +439,16 @@ static int http_write(URLContext *h, const uint8_t *buf, int size)
|
|||||||
* signal EOF */
|
* signal EOF */
|
||||||
if (size > 0) {
|
if (size > 0) {
|
||||||
/* upload data using chunked encoding */
|
/* upload data using chunked encoding */
|
||||||
|
if(s->is_chunked) {
|
||||||
snprintf(temp, sizeof(temp), "%x\r\n", size);
|
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 ||
|
if ((ret = url_write(s->hd, buf, size)) < 0)
|
||||||
(ret = url_write(s->hd, buf, size)) < 0 ||
|
return ret;
|
||||||
(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 ret;
|
||||||
}
|
}
|
||||||
return size;
|
return size;
|
||||||
|
@ -39,4 +39,12 @@
|
|||||||
*/
|
*/
|
||||||
void ff_http_set_headers(URLContext *h, const char *headers);
|
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 */
|
#endif /* AVFORMAT_HTTP_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user