aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDiego Bes <dbesprosvan@ahoffeld-pc.tango.corp>2016-03-18 15:25:56 -0700
committerDaniel Stenberg <daniel@haxx.se>2016-03-31 22:23:11 +0200
commit324a97ecf82e5e415c3c9fb4df093053c1efedf1 (patch)
treeff166eca2ab220199c1cb8d46575d6a37f0e61ac
parente683182918bafbe40d4525e51f6d360bfba14bfa (diff)
http2: support "prior knowledge", no upgrade from HTTP/1.1
Supports HTTP/2 over clear TCP - Optimize switching to HTTP/2 by removing calls to init and setup before switching. Switching will eventually call setup and setup calls init. - Supports new version to “force” the use of HTTP/2 over clean TCP - Add common line parameter “--http2-prior-knowledge” to the Curl command line tool.
-rw-r--r--docs/HTTP2.md3
-rw-r--r--docs/curl.15
-rw-r--r--docs/libcurl/symbols-in-versions1
-rw-r--r--include/curl/curl.h2
-rw-r--r--lib/http.c20
-rw-r--r--src/tool_getparam.c5
-rw-r--r--src/tool_help.c1
7 files changed, 29 insertions, 8 deletions
diff --git a/docs/HTTP2.md b/docs/HTTP2.md
index 81b3d5e21..5294ab5fa 100644
--- a/docs/HTTP2.md
+++ b/docs/HTTP2.md
@@ -96,6 +96,9 @@ curl tool
curl offers the `--http2` command line option to enable use of HTTP/2.
+curl offers the `--http2-prior-knowledge` command line option to enable use of
+HTTP/2 without HTTP/1.1 Upgrade.
+
Since 7.47.0, the curl tool enables HTTP/2 by default for HTTPS connections.
HTTP Alternative Services
diff --git a/docs/curl.1 b/docs/curl.1
index 0b0f4d29d..4a61b6554 100644
--- a/docs/curl.1
+++ b/docs/curl.1
@@ -150,6 +150,11 @@ version. (Added in 7.33.0)
.IP "--http2"
(HTTP) Tells curl to issue its requests using HTTP 2. This requires that the
underlying libcurl was built to support it. (Added in 7.33.0)
+.IP "--http2-prior-knowledge"
+(HTTP) Tells curl to issue its requests using HTTP 2 without HTTP/1.1 Upgrade.
+This requires prior knowledge that the server supports HTTP 2.
+This requires that the underlying libcurl was built to support it.
+(Added in 7.49.0)
.IP "--no-npn"
Disable the NPN TLS extension. NPN is enabled by default if libcurl was built
with an SSL library that supports NPN. NPN is used by a libcurl that supports
diff --git a/docs/libcurl/symbols-in-versions b/docs/libcurl/symbols-in-versions
index daf1809ab..2e4f15f39 100644
--- a/docs/libcurl/symbols-in-versions
+++ b/docs/libcurl/symbols-in-versions
@@ -695,6 +695,7 @@ CURL_HTTP_VERSION_1_1 7.9.1
CURL_HTTP_VERSION_2 7.43.0
CURL_HTTP_VERSION_2_0 7.33.0
CURL_HTTP_VERSION_2TLS 7.47.0
+CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE 7.49.0
CURL_HTTP_VERSION_NONE 7.9.1
CURL_IPRESOLVE_V4 7.10.8
CURL_IPRESOLVE_V6 7.10.8
diff --git a/include/curl/curl.h b/include/curl/curl.h
index e0d5c0f4e..96ea1f2a0 100644
--- a/include/curl/curl.h
+++ b/include/curl/curl.h
@@ -1727,6 +1727,8 @@ enum {
CURL_HTTP_VERSION_1_1, /* please use HTTP 1.1 in the request */
CURL_HTTP_VERSION_2_0, /* please use HTTP 2 in the request */
CURL_HTTP_VERSION_2TLS, /* use version 2 for HTTPS, version 1.1 for HTTP */
+ CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE, /* please use HTTP 2 without HTTP/1.1
+ Upgrade */
CURL_HTTP_VERSION_LAST /* *ILLEGAL* http version */
};
diff --git a/lib/http.c b/lib/http.c
index 94a1e936e..f261b3deb 100644
--- a/lib/http.c
+++ b/lib/http.c
@@ -1792,13 +1792,6 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
switch(conn->negnpn) {
case CURL_HTTP_VERSION_2:
conn->httpversion = 20; /* we know we're on HTTP/2 now */
- result = Curl_http2_init(conn);
- if(result)
- return result;
-
- result = Curl_http2_setup(conn);
- if(result)
- return result;
result = Curl_http2_switched(conn, NULL, 0);
if(result)
@@ -1808,7 +1801,18 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
/* continue with HTTP/1.1 when explicitly requested */
break;
default:
- /* and as fallback */
+ /* Check if user wants to use HTTP/2 with clear TCP*/
+#ifdef USE_NGHTTP2
+ if(conn->data->set.httpversion ==
+ CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE) {
+ DEBUGF(infof(data, "HTTP/2 over clean TCP\n"));
+ conn->httpversion = 20;
+
+ result = Curl_http2_switched(conn, NULL, 0);
+ if(result)
+ return result;
+ }
+#endif
break;
}
}
diff --git a/src/tool_getparam.c b/src/tool_getparam.c
index 61f50464b..9bb1b0c5f 100644
--- a/src/tool_getparam.c
+++ b/src/tool_getparam.c
@@ -184,6 +184,7 @@ static const struct LongShort aliases[]= {
{"0", "http1.0", FALSE},
{"01", "http1.1", FALSE},
{"02", "http2", FALSE},
+ {"03", "http2-prior-knowledge", FALSE},
{"1", "tlsv1", FALSE},
{"10", "tlsv1.0", FALSE},
{"11", "tlsv1.1", FALSE},
@@ -1036,6 +1037,10 @@ ParameterError getparameter(char *flag, /* f or -long-flag */
/* HTTP version 2.0 */
config->httpversion = CURL_HTTP_VERSION_2_0;
break;
+ case '3':
+ /* HTTP version 2.0 over clean TCP*/
+ config->httpversion = CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE;
+ break;
}
break;
case '1': /* --tlsv1* options */
diff --git a/src/tool_help.c b/src/tool_help.c
index a1a6fb493..42159f4d9 100644
--- a/src/tool_help.c
+++ b/src/tool_help.c
@@ -111,6 +111,7 @@ static const char *const helptext[] = {
" -0, --http1.0 Use HTTP 1.0 (H)",
" --http1.1 Use HTTP 1.1 (H)",
" --http2 Use HTTP 2 (H)",
+ " --http2-prior-knowledge Use HTTP 2 without HTTP/1.1 Upgrade (H)",
" --ignore-content-length Ignore the HTTP Content-Length header",
" -i, --include Include protocol headers in the output (H/F)",
" -k, --insecure Allow connections to SSL sites without certs (H)",