Commit c3e906e9 authored by Tatsuhiro Tsujikawa's avatar Tatsuhiro Tsujikawa Committed by Daniel Stenberg
Browse files

http2: handle closed streams when uploading

Fixes #986
parent 3533def3
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -168,6 +168,7 @@ struct HTTP {
  const uint8_t *pausedata; /* pointer to data received in on_data_chunk */
  size_t pauselen; /* the number of bytes left in data */
  bool closed; /* TRUE on HTTP2 stream close */
  bool close_handled; /* TRUE if stream closure is handled by libcurl */
  uint32_t error_code; /* HTTP/2 error code */

  char *mem;     /* points to a buffer in memory to store received data */
+11 −0
Original line number Diff line number Diff line
@@ -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;