From dd011df9e1a31e66611f58758ee93f9a346b36a2 Mon Sep 17 00:00:00 2001 From: Fabian Frank Date: Wed, 29 Jan 2014 21:28:50 -0800 Subject: http2: switch into http2 mode if NPN indicates Check the NPN result before preparing an HTTP request and switch into HTTP/2.0 mode if necessary. This is a work in progress, the actual code to prepare and send the request using nghttp2 is still missing from Curl_http2_send_request(). --- lib/http.c | 15 +++++++++++++++ lib/http2.c | 43 ++++++++++++++++++++++++++++++++----------- 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/lib/http.c b/lib/http.c index fe602b9de..063e1fa51 100644 --- a/lib/http.c +++ b/lib/http.c @@ -1668,6 +1668,21 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) the rest of the request in the PERFORM phase. */ *done = TRUE; + switch (conn->negnpn) { + case NPN_HTTP2_DRAFT09: + infof(data, "http, we have to use HTTP-draft-09/2\n"); + Curl_http2_init(conn); + Curl_http2_switched(conn); + Curl_http2_send_request(conn); + break; + case NPN_HTTP1_1: + /* continue with HTTP/1.1 when explicitly requested */ + break; + default: + /* and as fallback */ + break; + } + http = data->req.protop; if(!data->state.this_is_a_follow) { diff --git a/lib/http2.c b/lib/http2.c index 8cb49b77e..126a81288 100644 --- a/lib/http2.c +++ b/lib/http2.c @@ -115,8 +115,12 @@ static ssize_t recv_callback(nghttp2_session *h2, { struct connectdata *conn = (struct connectdata *)userp; ssize_t nread; - CURLcode rc = Curl_read_plain(conn->sock[FIRSTSOCKET], (char *)buf, length, - &nread); + CURLcode rc; + + infof(conn->data, "recv_callback() was called with length %d\n", length); + + rc = Curl_read_plain(conn->sock[FIRSTSOCKET], (char *)buf, length, + &nread); (void)h2; (void)flags; @@ -285,6 +289,31 @@ static nghttp2_settings_entry settings[] = { { NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE, NGHTTP2_INITIAL_WINDOW_SIZE }, }; +/* + * Initialize nghttp2 for a Curl connection + */ +CURLcode Curl_http2_init(struct connectdata *conn) { + if(!conn->proto.httpc.h2) { + /* The nghttp2 session is not yet setup, do it */ + int rc = nghttp2_session_client_new(&conn->proto.httpc.h2, + &callbacks, conn); + if(rc) { + failf(conn->data, "Couldn't initialize nghttp2!"); + return CURLE_OUT_OF_MEMORY; /* most likely at least */ + } + } + return CURLE_OK; +} + +/* + * Send a request using http2 + */ +CURLcode Curl_http2_send_request(struct connectdata *conn) +{ + (void)conn; + return CURLE_OK; +} + /* * Append headers to ask for a HTTP1.1 to HTTP2 upgrade. */ @@ -298,15 +327,7 @@ CURLcode Curl_http2_request_upgrade(Curl_send_buffer *req, size_t blen; struct SingleRequest *k = &conn->data->req; - if(!conn->proto.httpc.h2) { - /* The nghttp2 session is not yet setup, do it */ - int rc = nghttp2_session_client_new(&conn->proto.httpc.h2, - &callbacks, conn); - if(rc) { - failf(conn->data, "Couldn't initialize nghttp2!"); - return CURLE_OUT_OF_MEMORY; /* most likely at least */ - } - } + Curl_http2_init(conn); /* As long as we have a fixed set of settings, we don't have to dynamically * figure out the base64 strings since it'll always be the same. However, -- cgit v1.2.3