]> granicus.if.org Git - curl/commitdiff
http2: switch recv/send functions to http2 ones after 101
authorDaniel Stenberg <daniel@haxx.se>
Wed, 18 Sep 2013 20:43:13 +0000 (22:43 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Wed, 29 Jan 2014 09:24:05 +0000 (10:24 +0100)
lib/http.h
lib/http2.c

index 82a7b50089f7feeda098f5fb6546bba82bed8fb9..8d3f9d0d0fad2f4b935146fef9a7329f7c1f1a83 100644 (file)
@@ -152,6 +152,9 @@ struct HTTP {
 struct http_conn {
 #ifdef USE_NGHTTP2
   nghttp2_session *h2;
+  char *mem;     /* points to a buffer in memory to store or read from */
+  size_t size;   /* size of the buffer 'mem' points to */
+  ssize_t nread; /* how much data that was sent/recv by the HTTP2 engine */
 #else
   int unused; /* prevent a compiler warning */
 #endif
index f15cb1700bc33f3c5e63e198f3dd232370393743..b6b01cb7ede55ff8de78bf98bdac3540dabe91a1 100644 (file)
@@ -111,7 +111,7 @@ static ssize_t recv_callback(nghttp2_session *h2,
 {
   struct connectdata *conn = (struct connectdata *)userp;
   ssize_t nread;
-  CURLcode rc = Curl_read(conn, conn->sock[0], (char *)buf, length, &nread);
+  CURLcode rc = Curl_read_plain(conn->sock[0], (char *)buf, length, &nread);
   (void)h2;
   (void)flags;
 
@@ -208,10 +208,46 @@ CURLcode Curl_http2_request(Curl_send_buffer *req,
   return result;
 }
 
+/*
+ * If the read would block (EWOULDBLOCK) we return -1. Otherwise we return
+ * a regular CURLcode value.
+ */
+static ssize_t http2_recv(struct connectdata *conn, int sockindex,
+                          char *mem, size_t len, CURLcode *err)
+{
+  int rc;
+  (void)sockindex; /* we always do HTTP2 on sockindex 0 */
+
+  conn->proto.httpc.mem = mem;
+  conn->proto.httpc.size = len;
+
+  rc = nghttp2_session_recv(conn->proto.httpc.h2);
+
+  if(rc < 0) {
+    *err = CURLE_RECV_ERROR;
+  }
+  return 0;
+}
+
+/* return number of received (decrypted) bytes */
+static ssize_t http2_send(struct connectdata *conn, int sockindex,
+                          const void *mem, size_t len, CURLcode *err)
+{
+  /* TODO: proper implementation */
+  (void)conn;
+  (void)sockindex;
+  (void)mem;
+  (void)len;
+  (void)err;
+  return 0;
+}
+
 void Curl_http2_switched(struct connectdata *conn)
 {
   /* we are switched! */
   conn->handler = &Curl_handler_http2;
+  conn->recv[FIRSTSOCKET] = http2_recv;
+  conn->send[FIRSTSOCKET] = http2_send;
   infof(conn->data, "We have switched to HTTP2\n");
 }