Skip to content

Commit

Permalink
http2: send HEADER & DATA together if possible
Browse files Browse the repository at this point in the history
Closes #11420
  • Loading branch information
peppapighs authored and bagder committed Jul 11, 2023
1 parent 9946410 commit c9ec851
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 8 deletions.
6 changes: 1 addition & 5 deletions lib/http.c
Expand Up @@ -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
Expand Down
22 changes: 19 additions & 3 deletions lib/http2.c
Expand Up @@ -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;
Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit c9ec851

Please sign in to comment.