summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2014-01-30 14:26:00 +0100
committerDaniel Stenberg <daniel@haxx.se>2014-01-30 14:26:00 +0100
commita878cb305650ccd25f205cbbdc44bb01e722a25d (patch)
tree77ff9281476421cacfdc86a19395ff95c5be7426 /lib
parent0e113070579535c08ef734b319df08cdfbefbba6 (diff)
downloadcurl-a878cb305650ccd25f205cbbdc44bb01e722a25d.tar.gz
http2: do the POST Upgrade dance properly
Diffstat (limited to 'lib')
-rw-r--r--lib/http.h5
-rw-r--r--lib/http2.c15
-rw-r--r--lib/http2.h2
3 files changed, 16 insertions, 6 deletions
diff --git a/lib/http.h b/lib/http.h
index 8d3f9d0d0..228e375eb 100644
--- a/lib/http.h
+++ b/lib/http.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -151,7 +151,10 @@ struct HTTP {
struct http_conn {
#ifdef USE_NGHTTP2
+#define H2_BINSETTINGS_LEN 80
nghttp2_session *h2;
+ uint8_t binsettings[H2_BINSETTINGS_LEN];
+ size_t binlen; /* length of the binsettings data */
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 */
diff --git a/lib/http2.c b/lib/http2.c
index 126a81288..a5b01e35d 100644
--- a/lib/http2.c
+++ b/lib/http2.c
@@ -320,12 +320,12 @@ CURLcode Curl_http2_send_request(struct connectdata *conn)
CURLcode Curl_http2_request_upgrade(Curl_send_buffer *req,
struct connectdata *conn)
{
- uint8_t binsettings[80];
CURLcode result;
ssize_t binlen;
char *base64;
size_t blen;
struct SingleRequest *k = &conn->data->req;
+ uint8_t *binsettings = conn->proto.httpc.binsettings;
Curl_http2_init(conn);
@@ -335,14 +335,14 @@ CURLcode Curl_http2_request_upgrade(Curl_send_buffer *req,
*/
/* this returns number of bytes it wrote */
- binlen = nghttp2_pack_settings_payload(binsettings,
- sizeof(binsettings),
+ binlen = nghttp2_pack_settings_payload(binsettings, H2_BINSETTINGS_LEN,
settings,
sizeof(settings)/sizeof(settings[0]));
if(!binlen) {
failf(conn->data, "nghttp2 unexpectedly failed on pack_settings_payload");
return CURLE_FAILED_INIT;
}
+ conn->proto.httpc.binlen = binlen;
result = Curl_base64_encode(conn->data, (const char *)binsettings, binlen,
&base64, &blen);
@@ -397,13 +397,20 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
return 0;
}
-void Curl_http2_switched(struct connectdata *conn)
+int Curl_http2_switched(struct connectdata *conn)
{
+ int rc;
+ struct http_conn *httpc = &conn->proto.httpc;
/* 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");
+
+ /* send the SETTINGS frame (again) */
+ rc = nghttp2_session_upgrade(httpc->h2, httpc->binsettings, httpc->binlen,
+ conn);
+ return rc;
}
#endif
diff --git a/lib/http2.h b/lib/http2.h
index c6a5c41dc..ef994b7ba 100644
--- a/lib/http2.h
+++ b/lib/http2.h
@@ -36,7 +36,7 @@ CURLcode Curl_http2_init(struct connectdata *conn);
CURLcode Curl_http2_send_request(struct connectdata *conn);
CURLcode Curl_http2_request_upgrade(Curl_send_buffer *req,
struct connectdata *conn);
-void Curl_http2_switched(struct connectdata *conn);
+int Curl_http2_switched(struct connectdata *conn);
#else /* USE_NGHTTP2 */
#define Curl_http2_init(x)
#define Curl_http2_send_request(x)