aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabian Frank <fabian@pagefault.de>2014-01-29 21:28:50 -0800
committerDaniel Stenberg <daniel@haxx.se>2014-01-30 11:34:37 +0100
commitdd011df9e1a31e66611f58758ee93f9a346b36a2 (patch)
treee9fdf81ac03a4216da09bac6cb4fd3c38a2cb9b8
parent8e778887b54c059dc32e297caac7e49dfe2801cc (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.c15
-rw-r--r--lib/http2.c43
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,