From: Pontakorn Prasertsuk Date: Tue, 11 Jul 2023 08:00:29 +0000 (+0800) Subject: http2: send HEADER & DATA together if possible X-Git-Tag: curl-8_2_0~24 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c9ec85121110d7cbbbed2990024222c8f5b8afe5;p=thirdparty%2Fcurl.git http2: send HEADER & DATA together if possible Closes #11420 --- diff --git a/lib/http.c b/lib/http.c index bc09f26312..f851bcd4a3 100644 --- a/lib/http.c +++ b/lib/http.c @@ -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 diff --git a/lib/http2.c b/lib/http2.c index c6275459a9..2d4bbce41c 100644 --- a/lib/http2.c +++ b/lib/http2.c @@ -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)