mirror of
https://github.com/moparisthebest/curl
synced 2024-12-21 23:58:49 -05:00
http: accept "Transfer-Encoding: chunked" for HTTP/2 as well
... but don't send the actual header over the wire as it isn't accepted. Chunked uploading is still triggered using this method. Fixes #1013 Fixes #662
This commit is contained in:
parent
d93215621f
commit
d4c5a91722
64
lib/http.c
64
lib/http.c
@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@ -1648,6 +1648,10 @@ CURLcode Curl_add_custom_headers(struct connectdata *conn,
|
|||||||
Connection: */
|
Connection: */
|
||||||
checkprefix("Connection", headers->data))
|
checkprefix("Connection", headers->data))
|
||||||
;
|
;
|
||||||
|
else if((conn->httpversion == 20) &&
|
||||||
|
checkprefix("Transfer-Encoding:", headers->data))
|
||||||
|
/* HTTP/2 doesn't support chunked requests */
|
||||||
|
;
|
||||||
else {
|
else {
|
||||||
CURLcode result = Curl_add_bufferf(req_buffer, "%s\r\n",
|
CURLcode result = Curl_add_bufferf(req_buffer, "%s\r\n",
|
||||||
headers->data);
|
headers->data);
|
||||||
@ -1934,40 +1938,35 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(conn->httpversion == 20)
|
ptr = Curl_checkheaders(conn, "Transfer-Encoding:");
|
||||||
/* In HTTP2 forbids Transfer-Encoding: chunked */
|
if(ptr) {
|
||||||
ptr = NULL;
|
/* Some kind of TE is requested, check if 'chunked' is chosen */
|
||||||
|
data->req.upload_chunky =
|
||||||
|
Curl_compareheader(ptr, "Transfer-Encoding:", "chunked");
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
ptr = Curl_checkheaders(conn, "Transfer-Encoding:");
|
if((conn->handler->protocol&PROTO_FAMILY_HTTP) &&
|
||||||
if(ptr) {
|
data->set.upload &&
|
||||||
/* Some kind of TE is requested, check if 'chunked' is chosen */
|
(data->state.infilesize == -1)) {
|
||||||
data->req.upload_chunky =
|
if(conn->bits.authneg)
|
||||||
Curl_compareheader(ptr, "Transfer-Encoding:", "chunked");
|
/* don't enable chunked during auth neg */
|
||||||
}
|
;
|
||||||
else {
|
else if(use_http_1_1plus(data, conn)) {
|
||||||
if((conn->handler->protocol&PROTO_FAMILY_HTTP) &&
|
/* HTTP, upload, unknown file size and not HTTP 1.0 */
|
||||||
data->set.upload &&
|
data->req.upload_chunky = TRUE;
|
||||||
(data->state.infilesize == -1)) {
|
|
||||||
if(conn->bits.authneg)
|
|
||||||
/* don't enable chunked during auth neg */
|
|
||||||
;
|
|
||||||
else if(use_http_1_1plus(data, conn)) {
|
|
||||||
/* HTTP, upload, unknown file size and not HTTP 1.0 */
|
|
||||||
data->req.upload_chunky = TRUE;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
failf(data, "Chunky upload is not supported by HTTP 1.0");
|
|
||||||
return CURLE_UPLOAD_FAILED;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* else, no chunky upload */
|
failf(data, "Chunky upload is not supported by HTTP 1.0");
|
||||||
data->req.upload_chunky = FALSE;
|
return CURLE_UPLOAD_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(data->req.upload_chunky)
|
|
||||||
te = "Transfer-Encoding: chunked\r\n";
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
/* else, no chunky upload */
|
||||||
|
data->req.upload_chunky = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(data->req.upload_chunky)
|
||||||
|
te = "Transfer-Encoding: chunked\r\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
Curl_safefree(conn->allocptr.host);
|
Curl_safefree(conn->allocptr.host);
|
||||||
@ -2761,6 +2760,11 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if((conn->httpversion == 20) && data->req.upload_chunky)
|
||||||
|
/* upload_chunky was set above to set up the request in a chunky fashion,
|
||||||
|
but is disabled here again to avoid that the chunked encoded version is
|
||||||
|
actually used when sending the request body over h2 */
|
||||||
|
data->req.upload_chunky = FALSE;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user