1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-22 08:08:50 -05:00

HTTP: partial start at fixing up hash-lookups on http2 frame receival

This commit is contained in:
Daniel Stenberg 2015-04-28 20:39:47 +02:00
parent 77f1029ecd
commit 5fe71975e4
2 changed files with 10 additions and 11 deletions

View File

@ -155,6 +155,11 @@ struct HTTP {
/* for HTTP/2 we store stream-local data here */ /* for HTTP/2 we store stream-local data here */
int32_t stream_id; /* stream we are interested in */ 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 */ typedef int (*sending)(void); /* Curl_send */
@ -173,11 +178,6 @@ struct http_conn {
recving recv_underlying; /* underlying recv Curl_recv callback */ recving recv_underlying; /* underlying recv Curl_recv callback */
bool closed; /* TRUE on HTTP2 stream close */ bool closed; /* TRUE on HTTP2 stream close */
uint32_t error_code; /* HTTP/2 error code */ 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 const uint8_t *data; /* pointer to data chunk, received in
on_data_chunk */ on_data_chunk */
size_t datalen; /* the number of bytes left in data */ size_t datalen; /* the number of bytes left in data */

View File

@ -84,9 +84,6 @@ static CURLcode http2_disconnect(struct connectdata *conn,
nghttp2_session_del(c->h2); nghttp2_session_del(c->h2);
Curl_safefree(c->header_recvbuf->buffer);
Curl_safefree(c->header_recvbuf);
Curl_safefree(c->inbuf); Curl_safefree(c->inbuf);
DEBUGF(infof(conn->data, "HTTP/2 DISCONNECT done\n")); DEBUGF(infof(conn->data, "HTTP/2 DISCONNECT done\n"));
@ -167,7 +164,7 @@ static ssize_t send_callback(nghttp2_session *h2,
(void)flags; (void)flags;
written = ((Curl_send*)c->send_underlying)(conn, FIRSTSOCKET, written = ((Curl_send*)c->send_underlying)(conn, FIRSTSOCKET,
data, length, &result); data, length, &result);
if(result == CURLE_AGAIN) { if(result == CURLE_AGAIN) {
return NGHTTP2_ERR_WOULDBLOCK; return NGHTTP2_ERR_WOULDBLOCK;
@ -249,6 +246,9 @@ static int on_frame_recv(nghttp2_session *session, const nghttp2_frame *frame,
c->status_code = -1; 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); Curl_add_buffer(c->header_recvbuf, "\r\n", 2);
left = c->header_recvbuf->size_used - c->nread_header_recvbuf; 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); nghttp2_session_callbacks_set_on_header_callback(callbacks, on_header);
/* The nghttp2 session is not yet setup, do it */ /* The nghttp2 session is not yet setup, do it */
rc = nghttp2_session_client_new(&conn->proto.httpc.h2, rc = nghttp2_session_client_new(&conn->proto.httpc.h2, callbacks, conn);
callbacks, conn);
nghttp2_session_callbacks_del(callbacks); nghttp2_session_callbacks_del(callbacks);