Skip to content
Permalink
Browse files

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
  • Loading branch information...
bagder committed Jun 24, 2019
1 parent d331227 commit 265f7f42f678db4157e7d6f7f987aba01e71cfeb
Showing with 15 additions and 6 deletions.
  1. +3 −1 lib/http.c
  2. +5 −1 lib/http2.c
  3. +4 −4 lib/transfer.c
  4. +3 −0 lib/transfer.h
@@ -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;
}
@@ -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;
@@ -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;
}
@@ -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,

0 comments on commit 265f7f4

Please sign in to comment.
You can’t perform that action at this time.