1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-22 08:08:50 -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:
Daniel Stenberg 2016-09-15 14:01:06 +02:00
parent d93215621f
commit d4c5a91722

View File

@ -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;
} }