diff options
author | Daniel Stenberg <daniel@haxx.se> | 2013-09-18 22:43:13 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2014-01-29 10:24:05 +0100 |
commit | 53940f883450d1976105677adda41696e5094602 (patch) | |
tree | e1f34d2502c216717decf301a9282c213812555d | |
parent | 8d3608f2ad29bb65ce0926a45b46ff29902c279f (diff) |
http2: switch recv/send functions to http2 ones after 101
-rw-r--r-- | lib/http.h | 3 | ||||
-rw-r--r-- | lib/http2.c | 38 |
2 files changed, 40 insertions, 1 deletions
diff --git a/lib/http.h b/lib/http.h index 82a7b5008..8d3f9d0d0 100644 --- a/lib/http.h +++ b/lib/http.h @@ -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 diff --git a/lib/http2.c b/lib/http2.c index f15cb1700..b6b01cb7e 100644 --- a/lib/http2.c +++ b/lib/http2.c @@ -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"); } |