aboutsummaryrefslogtreecommitdiff
path: root/lib/http2.c
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2016-08-28 16:44:03 +0200
committerDaniel Stenberg <daniel@haxx.se>2016-08-28 17:59:34 +0200
commitc3e906e9cd0f17be5ffc13ca258b87049da8d544 (patch)
treee71f56baf48cc40fafe0c93bff7f767d19027f39 /lib/http2.c
parent3533def3d556e09f178e52e37b89fe8015b907f9 (diff)
http2: handle closed streams when uploading
Fixes #986
Diffstat (limited to 'lib/http2.c')
-rw-r--r--lib/http2.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/lib/http2.c b/lib/http2.c
index e51e72ab4..6fc7cfa28 100644
--- a/lib/http2.c
+++ b/lib/http2.c
@@ -151,6 +151,7 @@ void Curl_http2_setup_req(struct Curl_easy *data)
http->pauselen = 0;
http->error_code = NGHTTP2_NO_ERROR;
http->closed = FALSE;
+ http->close_handled = FALSE;
http->mem = data->state.buffer;
http->len = BUFSIZE;
http->memlen = 0;
@@ -1256,6 +1257,8 @@ static ssize_t http2_handle_stream_close(struct connectdata *conn,
}
}
+ stream->close_handled = TRUE;
+
DEBUGF(infof(data, "http2_recv returns 0, http2_handle_stream_close\n"));
return 0;
}
@@ -1562,6 +1565,14 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
DEBUGF(infof(conn->data, "http2_send len=%zu\n", len));
if(stream->stream_id != -1) {
+ if(stream->close_handled) {
+ infof(conn->data, "stream %d closed\n", stream->stream_id);
+ *err = CURLE_HTTP2;
+ return -1;
+ }
+ else if(stream->closed) {
+ return http2_handle_stream_close(conn, conn->data, stream, err);
+ }
/* If stream_id != -1, we have dispatched request HEADERS, and now
are going to send or sending request body in DATA frame */
stream->upload_mem = mem;