http2: switch into http2 mode if NPN indicates

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().
This commit is contained in:
Fabian Frank 2014-01-29 21:28:50 -08:00 committed by Daniel Stenberg
parent 8e778887b5
commit dd011df9e1
2 changed files with 47 additions and 11 deletions

View 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) {

View 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;
@ -285,6 +289,31 @@ static nghttp2_settings_entry settings[] = {
{ NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE, NGHTTP2_INITIAL_WINDOW_SIZE },
};
/*
* 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.
*/
@ -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,