]> granicus.if.org Git - curl/commitdiff
http: a stream hash for h2 multiplexing
authorDaniel Stenberg <daniel@haxx.se>
Tue, 28 Apr 2015 11:10:04 +0000 (13:10 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 18 May 2015 06:57:17 +0000 (08:57 +0200)
lib/http2.c

index 9e9d86a9b8b022067ffeef7a9404105552e1b5ae..21096015745fe6edfe88fb9807926dbee12b1579 100644 (file)
@@ -564,6 +564,11 @@ static nghttp2_settings_entry settings[] = {
 
 #define H2_BUFSIZE 4096
 
+static void freestreamentry(void *freethis)
+{
+  (void)freethis;
+}
+
 /*
  * Initialize nghttp2 for a Curl connection
  */
@@ -625,9 +630,11 @@ CURLcode Curl_http2_init(struct connectdata *conn)
     }
 
     rc = Curl_hash_init(&conn->proto.httpc.streamsh, 7, Curl_hash_str,
-                        Curl_str_key_compare, NULL);
-    if(rc)
+                        Curl_str_key_compare, freestreamentry);
+    if(rc) {
+      failf(conn->data, "Couldn't init stream hash!");
       return CURLE_OUT_OF_MEMORY; /* most likely at least */
+    }
   }
   return CURLE_OK;
 }
@@ -965,9 +972,18 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
     return -1;
   }
 
-  infof(conn->data, "Using Stream ID: %x\n", stream_id);
+  infof(conn->data, "Using Stream ID: %x (easy handle %p)\n",
+        stream_id, conn->data);
   stream->stream_id = stream_id;
 
+  /* put the SessionHandle in the hash with the stream_id as key */
+  if(!Curl_hash_add(&httpc->streamsh, &stream->stream_id, sizeof(stream_id),
+                    conn->data)) {
+    failf(conn->data, "Couldn't add stream to hash!");
+    *err = CURLE_OUT_OF_MEMORY;
+    return -1;
+  }
+
   rv = nghttp2_session_send(httpc->h2);
 
   if(rv != 0) {