http2: call done_sending on end of upload

To make sure a HTTP/2 stream registers the end of stream.

Bug #4043 made me find this problem but this fix doesn't correct the
reported issue.

Closes #4068
This commit is contained in:
Daniel Stenberg 2019-06-24 11:21:26 +02:00
parent d331227cf0
commit 265f7f42f6
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2
4 changed files with 15 additions and 6 deletions

View File

@ -3511,8 +3511,10 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
else {
infof(data, "HTTP error before end of send, stop sending\n");
streamclose(conn, "Stop sending data before everything sent");
result = Curl_done_sending(conn, k);
if(result)
return result;
k->upload_done = TRUE;
k->keepon &= ~KEEP_SEND; /* don't send */
if(data->state.expect100header)
k->exp100 = EXP100_FAILED;
}

View File

@ -1880,7 +1880,11 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
are going to send or sending request body in DATA frame */
stream->upload_mem = mem;
stream->upload_len = len;
nghttp2_session_resume_data(h2, stream->stream_id);
rv = nghttp2_session_resume_data(h2, stream->stream_id);
if(nghttp2_is_fatal(rv)) {
*err = CURLE_SEND_ERROR;
return -1;
}
rv = h2_session_send(conn->data, h2);
if(nghttp2_is_fatal(rv)) {
*err = CURLE_SEND_ERROR;

View File

@ -937,8 +937,8 @@ static CURLcode readwrite_data(struct Curl_easy *data,
return CURLE_OK;
}
static CURLcode done_sending(struct connectdata *conn,
struct SingleRequest *k)
CURLcode Curl_done_sending(struct connectdata *conn,
struct SingleRequest *k)
{
k->keepon &= ~KEEP_SEND; /* we're done writing */
@ -1046,7 +1046,7 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
break;
}
if(nread <= 0) {
result = done_sending(conn, k);
result = Curl_done_sending(conn, k);
if(result)
return result;
break;
@ -1164,7 +1164,7 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
k->upload_present = 0; /* no more bytes left */
if(k->upload_done) {
result = done_sending(conn, k);
result = Curl_done_sending(conn, k);
if(result)
return result;
}

View File

@ -57,6 +57,9 @@ CURLcode Curl_retry_request(struct connectdata *conn, char **url);
bool Curl_meets_timecondition(struct Curl_easy *data, time_t timeofdoc);
CURLcode Curl_get_upload_buffer(struct Curl_easy *data);
CURLcode Curl_done_sending(struct connectdata *conn,
struct SingleRequest *k);
/* This sets up a forthcoming transfer */
void
Curl_setup_transfer (struct Curl_easy *data,