http2: switch into http2 mode if NPN indicates
authorFabian Frank <fabian@pagefault.de>
Thu, 30 Jan 2014 05:28:50 +0000 (21:28 -0800)
committerDaniel Stenberg <daniel@haxx.se>
Thu, 30 Jan 2014 10:34:37 +0000 (11:34 +0100)
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
lib/http2.c

index fe602b9..063e1fa 100644 (file)
@@ -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) {
index 8cb49b7..126a812 100644 (file)
@@ -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,