*/
static int h2_process_pending_input(struct Curl_easy *data,
struct http_conn *httpc,
- CURLcode *err) {
+ CURLcode *err)
+{
ssize_t nread;
char *inbuf;
ssize_t rv;
return 0;
}
+/*
+ * Called from transfer.c:done_sending when we stop uploading.
+ */
+CURLcode Curl_http2_done_sending(struct connectdata *conn)
+{
+ CURLcode result = CURLE_OK;
+
+ if((conn->handler == &Curl_handler_http2_ssl) ||
+ (conn->handler == &Curl_handler_http2)) {
+ /* make sure this is only attempted for HTTP/2 transfers */
+
+ struct HTTP *stream = conn->data->req.protop;
+
+ if(stream->upload_left) {
+ /* If the stream still thinks there's data left to upload. */
+ struct http_conn *httpc = &conn->proto.httpc;
+ nghttp2_session *h2 = httpc->h2;
+
+ stream->upload_left = 0; /* DONE! */
+
+ /* resume sending here to trigger the callback to get called again so
+ that it can signal EOF to nghttp2 */
+ (void)nghttp2_session_resume_data(h2, stream->stream_id);
+
+ (void)h2_process_pending_input(conn->data, httpc, &result);
+ }
+ }
+ return result;
+}
+
+
static ssize_t http2_handle_stream_close(struct connectdata *conn,
struct Curl_easy *data,
- struct HTTP *stream, CURLcode *err) {
+ struct HTTP *stream, CURLcode *err)
+{
char *trailer_pos, *trailer_end;
CURLcode result;
struct http_conn *httpc = &conn->proto.httpc;
void Curl_http2_setup_conn(struct connectdata *conn);
void Curl_http2_setup_req(struct Curl_easy *data);
void Curl_http2_done(struct connectdata *conn, bool premature);
+CURLcode Curl_http2_done_sending(struct connectdata *conn);
#else /* USE_NGHTTP2 */
#define Curl_http2_init(x) CURLE_UNSUPPORTED_PROTOCOL
#define Curl_http2_send_request(x) CURLE_UNSUPPORTED_PROTOCOL
#define Curl_http2_init_state(x)
#define Curl_http2_init_userset(x)
#define Curl_http2_done(x,y)
+#define Curl_http2_done_sending(x)
#endif
#endif /* HEADER_CURL_HTTP2_H */
#include "multiif.h"
#include "connect.h"
#include "non-ascii.h"
+#include "http2.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
{
k->keepon &= ~KEEP_SEND; /* we're done writing */
+ Curl_http2_done_sending(conn);
+
if(conn->bits.rewindaftersend) {
CURLcode result = Curl_readrewind(conn);
if(result)