http2: send HEADER & DATA together if possible

Closes #11420
This commit is contained in:
Pontakorn Prasertsuk 2023-07-11 16:00:29 +08:00 committed by Daniel Stenberg
parent 9946410861
commit c9ec851211
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2
2 changed files with 20 additions and 8 deletions

View File

@ -2667,11 +2667,7 @@ CURLcode Curl_http_bodysend(struct Curl_easy *data, struct connectdata *conn,
#ifndef USE_HYPER
/* With Hyper the body is always passed on separately */
if(data->set.postfields) {
/* In HTTP2, we send request body in DATA frame regardless of
its size. */
if(conn->httpversion < 20 &&
!data->state.expect100header &&
if(!data->state.expect100header &&
(http->postsize < MAX_INITIAL_POST_SIZE)) {
/* if we don't use expect: 100 AND
postsize is less than MAX_INITIAL_POST_SIZE

View File

@ -1893,7 +1893,8 @@ static ssize_t h2_submit(struct stream_ctx **pstream,
struct h1_req_parser h1;
struct dynhds h2_headers;
nghttp2_nv *nva = NULL;
size_t nheader, i;
const void *body = NULL;
size_t nheader, bodylen, i;
nghttp2_data_provider data_prd;
int32_t stream_id;
nghttp2_priority_spec pri_spec;
@ -2011,6 +2012,20 @@ static ssize_t h2_submit(struct stream_ctx **pstream,
}
}
body = (const char *)buf + nwritten;
bodylen = len - nwritten;
if(bodylen) {
/* We have request body to send in DATA frame */
ssize_t n = Curl_bufq_write(&stream->sendbuf, body, bodylen, err);
if(n < 0) {
*err = CURLE_SEND_ERROR;
nwritten = -1;
goto out;
}
nwritten += n;
}
out:
DEBUGF(LOG_CF(data, cf, "[h2sid=%d] submit -> %zd, %d",
stream? stream->id : -1, nwritten, *err));
@ -2060,8 +2075,9 @@ static ssize_t cf_h2_send(struct Curl_cfilter *cf, struct Curl_easy *data,
stream->upload_blocked_len = 0;
}
else {
/* If stream_id != -1, we have dispatched request HEADERS, and now
are going to send or sending request body in DATA frame */
/* If stream_id != -1, we have dispatched request HEADERS and
* optionally request body, and now are going to send or sending
* more request body in DATA frame */
nwritten = Curl_bufq_write(&stream->sendbuf, buf, len, err);
if(nwritten < 0) {
if(*err != CURLE_AGAIN)