diff options
author | Fabian Frank <fabian@pagefault.de> | 2014-01-29 21:28:50 -0800 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2014-01-30 11:34:37 +0100 |
commit | dd011df9e1a31e66611f58758ee93f9a346b36a2 (patch) | |
tree | e9fdf81ac03a4216da09bac6cb4fd3c38a2cb9b8 | |
parent | 8e778887b54c059dc32e297caac7e49dfe2801cc (diff) |
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().
-rw-r--r-- | lib/http.c | 15 | ||||
-rw-r--r-- | 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; @@ -286,6 +290,31 @@ static nghttp2_settings_entry settings[] = { }; /* + * 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. */ CURLcode Curl_http2_request_upgrade(Curl_send_buffer *req, @@ -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, |