msh3: add support for request payload

Closes #10136
This commit is contained in:
Nick Banks 2022-12-27 16:02:56 +00:00 committed by Daniel Stenberg
parent f39472ea9f
commit ae98b85020
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2
6 changed files with 40 additions and 8 deletions

View File

@ -118,6 +118,7 @@ static header_instruction inspect_header(const char *name, size_t namelen,
CURLcode Curl_pseudo_headers(struct Curl_easy *data,
const char *mem, /* the request */
const size_t len /* size of request */,
size_t* hdrlen /* opt size of headers read */,
struct h2h3req **hp)
{
struct connectdata *conn = data->conn;
@ -291,6 +292,12 @@ CURLcode Curl_pseudo_headers(struct Curl_easy *data,
}
}
if(hdrlen) {
/* Skip trailing CRLF */
end += 4;
*hdrlen = end - mem;
}
hreq->entries = nheader;
*hp = hreq;

View File

@ -51,6 +51,7 @@ struct h2h3req {
CURLcode Curl_pseudo_headers(struct Curl_easy *data,
const char *request,
const size_t len,
size_t* hdrlen /* optional */,
struct h2h3req **hp);
/*

View File

@ -1942,7 +1942,7 @@ static ssize_t http2_send(struct Curl_easy *data, int sockindex,
return len;
}
result = Curl_pseudo_headers(data, mem, len, &hreq);
result = Curl_pseudo_headers(data, mem, len, NULL, &hreq);
if(result) {
*err = result;
return -1;

View File

@ -403,6 +403,8 @@ static ssize_t msh3_stream_send(struct Curl_easy *data,
struct HTTP *stream = data->req.p.http;
struct quicsocket *qs = conn->quic;
struct h2h3req *hreq;
size_t hdrlen = 0;
size_t sentlen = 0;
(void)sockindex;
/* Sizes must match for cast below to work" */
@ -411,15 +413,21 @@ static ssize_t msh3_stream_send(struct Curl_easy *data,
H3BUGF(infof(data, "msh3_stream_send %zu", len));
if(!stream->req) {
*curlcode = Curl_pseudo_headers(data, mem, len, &hreq);
/* The first send on the request contains the headers and possibly some
data. Parse out the headers and create the request, then if there is
any data left over go ahead and send it too. */
*curlcode = Curl_pseudo_headers(data, mem, len, &hdrlen, &hreq);
if(*curlcode) {
failf(data, "Curl_pseudo_headers failed");
return -1;
}
H3BUGF(infof(data, "starting request with %zu headers", hreq->entries));
stream->req = MsH3RequestOpen(qs->conn, &msh3_request_if, stream,
(MSH3_HEADER*)hreq->header, hreq->entries,
MSH3_REQUEST_FLAG_FIN);
(MSH3_HEADER*)hreq->header, hreq->entries,
hdrlen == len ? MSH3_REQUEST_FLAG_FIN :
MSH3_REQUEST_FLAG_NONE);
Curl_pseudo_free(hreq);
if(!stream->req) {
failf(data, "request open failed");
@ -431,8 +439,24 @@ static ssize_t msh3_stream_send(struct Curl_easy *data,
}
H3BUGF(infof(data, "send %zd body bytes on request %p", len,
(void *)stream->req));
*curlcode = CURLE_SEND_ERROR;
return -1;
if(len > 0xFFFFFFFF) {
/* msh3 doesn't support size_t sends currently. */
*curlcode = CURLE_SEND_ERROR;
return -1;
}
/* TODO - Need an explicit signal to know when to FIN. */
if(!MsH3RequestSend(stream->req, MSH3_REQUEST_FLAG_FIN, mem, (uint32_t)len,
stream)) {
*curlcode = CURLE_SEND_ERROR;
return -1;
}
/* TODO - msh3/msquic will hold onto this memory until the send complete
event. How do we make sure curl doesn't free it until then? */
sentlen += len;
*curlcode = CURLE_OK;
return sentlen;
}
static ssize_t msh3_stream_recv(struct Curl_easy *data,

View File

@ -1526,7 +1526,7 @@ static CURLcode http_request(struct Curl_easy *data, const void *mem,
stream->h3req = TRUE; /* senf off! */
Curl_dyn_init(&stream->overflow, CURL_MAX_READ_SIZE);
result = Curl_pseudo_headers(data, mem, len, &hreq);
result = Curl_pseudo_headers(data, mem, len, NULL, &hreq);
if(result)
goto fail;
nheader = hreq->entries;

View File

@ -765,7 +765,7 @@ static CURLcode http_request(struct Curl_easy *data, const void *mem,
stream->h3req = TRUE; /* senf off! */
result = Curl_pseudo_headers(data, mem, len, &hreq);
result = Curl_pseudo_headers(data, mem, len, NULL, &hreq);
if(result)
goto fail;
nheader = hreq->entries;