From 5fe71975e428f41f10bc367b1753ed7ebc4e5205 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Tue, 28 Apr 2015 20:39:47 +0200 Subject: [PATCH] HTTP: partial start at fixing up hash-lookups on http2 frame receival --- lib/http.h | 10 +++++----- lib/http2.c | 11 +++++------ 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/lib/http.h b/lib/http.h index 1fa85f76b..b53b963fa 100644 --- a/lib/http.h +++ b/lib/http.h @@ -155,6 +155,11 @@ struct HTTP { /* for HTTP/2 we store stream-local data here */ int32_t stream_id; /* stream we are interested in */ + + /* We store non-final and final response headers here, per-stream */ + Curl_send_buffer *header_recvbuf; + size_t nread_header_recvbuf; /* number of bytes in header_recvbuf fed into + upper layer */ }; typedef int (*sending)(void); /* Curl_send */ @@ -173,11 +178,6 @@ struct http_conn { recving recv_underlying; /* underlying recv Curl_recv callback */ bool closed; /* TRUE on HTTP2 stream close */ uint32_t error_code; /* HTTP/2 error code */ - Curl_send_buffer *header_recvbuf; /* store response headers. We - store non-final and final - response headers into it. */ - size_t nread_header_recvbuf; /* number of bytes in header_recvbuf - fed into upper layer */ const uint8_t *data; /* pointer to data chunk, received in on_data_chunk */ size_t datalen; /* the number of bytes left in data */ diff --git a/lib/http2.c b/lib/http2.c index 210960157..6d25efc98 100644 --- a/lib/http2.c +++ b/lib/http2.c @@ -84,9 +84,6 @@ static CURLcode http2_disconnect(struct connectdata *conn, nghttp2_session_del(c->h2); - Curl_safefree(c->header_recvbuf->buffer); - Curl_safefree(c->header_recvbuf); - Curl_safefree(c->inbuf); DEBUGF(infof(conn->data, "HTTP/2 DISCONNECT done\n")); @@ -167,7 +164,7 @@ static ssize_t send_callback(nghttp2_session *h2, (void)flags; written = ((Curl_send*)c->send_underlying)(conn, FIRSTSOCKET, - data, length, &result); + data, length, &result); if(result == CURLE_AGAIN) { return NGHTTP2_ERR_WOULDBLOCK; @@ -249,6 +246,9 @@ static int on_frame_recv(nghttp2_session *session, const nghttp2_frame *frame, c->status_code = -1; + /* get the stream from the hash based on Stream ID */ + rv = Curl_hash_pick() + Curl_add_buffer(c->header_recvbuf, "\r\n", 2); left = c->header_recvbuf->size_used - c->nread_header_recvbuf; @@ -619,8 +619,7 @@ CURLcode Curl_http2_init(struct connectdata *conn) nghttp2_session_callbacks_set_on_header_callback(callbacks, on_header); /* The nghttp2 session is not yet setup, do it */ - rc = nghttp2_session_client_new(&conn->proto.httpc.h2, - callbacks, conn); + rc = nghttp2_session_client_new(&conn->proto.httpc.h2, callbacks, conn); nghttp2_session_callbacks_del(callbacks);