From 026840e35c7359c23741afe633bd3ab4b121c4ed Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Wed, 7 Aug 2019 14:17:48 +0200 Subject: CURLOPT_HTTP_VERSION: seting this to 3 forces HTTP/3 use directly Even though it cannot fall-back to a lower HTTP version automatically. The safer way to upgrade remains via CURLOPT_ALTSVC. CURLOPT_H3 no longer has any bits that do anything and might be removed before we remove the experimental label. Updated the curl tool accordingly to use "--http3". Closes #4197 --- docs/HTTP3.md | 10 +++++----- docs/cmdline-opts/Makefile.inc | 2 +- docs/cmdline-opts/http2.d | 1 + docs/cmdline-opts/http3-direct.d | 16 ---------------- docs/cmdline-opts/http3.d | 19 +++++++++++++++++++ docs/libcurl/opts/CURLINFO_HTTP_VERSION.3 | 9 +++++---- docs/libcurl/opts/CURLOPT_H3.3 | 6 +----- docs/libcurl/opts/CURLOPT_HTTP_VERSION.3 | 12 ++++++++++-- docs/libcurl/symbols-in-versions | 1 - include/curl/curl.h | 7 ++----- lib/http.c | 6 +++--- lib/setopt.c | 8 ++++++-- lib/urldata.h | 1 - src/tool_cfgable.h | 1 - src/tool_getparam.c | 8 ++++---- src/tool_help.c | 2 +- src/tool_operate.c | 3 --- 17 files changed, 58 insertions(+), 54 deletions(-) delete mode 100644 docs/cmdline-opts/http3-direct.d create mode 100644 docs/cmdline-opts/http3.d diff --git a/docs/HTTP3.md b/docs/HTTP3.md index aa1303397..092d4d3e4 100644 --- a/docs/HTTP3.md +++ b/docs/HTTP3.md @@ -45,7 +45,7 @@ you'll just get ld.so linker errors. ## Invoke from command line - curl --http3-direct https://nghttp2.org:8443/ + curl --http3 https://nghttp2.org:8443/ # quiche version @@ -79,7 +79,7 @@ Clone and build curl: Make an HTTP/3 request. - % src/curl --http3-direct https://cloudflare-quic.com/ - % src/curl --http3-direct https://facebook.com/ - % src/curl --http3-direct https://quic.aiortc.org:4433/ - % src/curl --http3-direct https://quic.rocks:4433/ + % src/curl --http3 https://cloudflare-quic.com/ + % src/curl --http3 https://facebook.com/ + % src/curl --http3 https://quic.aiortc.org:4433/ + % src/curl --http3 https://quic.rocks:4433/ diff --git a/docs/cmdline-opts/Makefile.inc b/docs/cmdline-opts/Makefile.inc index 1bdda9885..6b4387475 100644 --- a/docs/cmdline-opts/Makefile.inc +++ b/docs/cmdline-opts/Makefile.inc @@ -65,7 +65,7 @@ DPAGES = \ http1.0.d \ http1.1.d http2.d \ http2-prior-knowledge.d \ - http3-direct.d \ + http3.d \ ignore-content-length.d \ include.d \ insecure.d \ diff --git a/docs/cmdline-opts/http2.d b/docs/cmdline-opts/http2.d index 04cff00a4..cf8f2988e 100644 --- a/docs/cmdline-opts/http2.d +++ b/docs/cmdline-opts/http2.d @@ -6,5 +6,6 @@ Mutexed: http1.1 http1.0 http2-prior-knowledge Requires: HTTP/2 See-also: no-alpn Help: Use HTTP 2 +See-also: http1.1 http3 --- Tells curl to use HTTP version 2. diff --git a/docs/cmdline-opts/http3-direct.d b/docs/cmdline-opts/http3-direct.d deleted file mode 100644 index fb8c8cf28..000000000 --- a/docs/cmdline-opts/http3-direct.d +++ /dev/null @@ -1,16 +0,0 @@ -Long: http3-direct -Tags: Versions -Protocols: HTTP -Added: 7.66.0 -Mutexed: http1.1 http1.0 http2 http2-prior-knowledge -Requires: HTTP/3 -Help: Use HTTP v3 ---- - -WARNING: this option is experiemental. Do not use in production. - -Tells curl to use HTTP version 3 directly to the host and port number used in -the URL. A normal HTTP/3 transaction will be done to a host and then get -redirected via Alt-SVc, but this option allows a user to circumvent that when -you know that the target speaks HTTP/3 on the given host and port. - diff --git a/docs/cmdline-opts/http3.d b/docs/cmdline-opts/http3.d new file mode 100644 index 000000000..ca85e3a64 --- /dev/null +++ b/docs/cmdline-opts/http3.d @@ -0,0 +1,19 @@ +Long: http3 +Tags: Versions +Protocols: HTTP +Added: 7.66.0 +Mutexed: http1.1 http1.0 http2 http2-prior-knowledge +Requires: HTTP/3 +Help: Use HTTP v3 +See-also: http1.1 http2 +--- + +WARNING: this option is experiemental. Do not use in production. + +Tells curl to use HTTP version 3 directly to the host and port number used in +the URL. A normal HTTP/3 transaction will be done to a host and then get +redirected via Alt-SVc, but this option allows a user to circumvent that when +you know that the target speaks HTTP/3 on the given host and port. + +This option will make curl fail if a QUIC connection cannot be established, it +cannot fall back to a lower HTTP version on its own. diff --git a/docs/libcurl/opts/CURLINFO_HTTP_VERSION.3 b/docs/libcurl/opts/CURLINFO_HTTP_VERSION.3 index b0f43e549..7e8931812 100644 --- a/docs/libcurl/opts/CURLINFO_HTTP_VERSION.3 +++ b/docs/libcurl/opts/CURLINFO_HTTP_VERSION.3 @@ -5,7 +5,7 @@ .\" * | (__| |_| | _ <| |___ .\" * \___|\___/|_| \_\_____| .\" * -.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, , et al. +.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, , et al. .\" * .\" * This software is licensed as described in the file COPYING, which .\" * you should have received as part of this distribution. The terms @@ -28,9 +28,10 @@ CURLINFO_HTTP_VERSION \- get the http version used in the connection CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_HTTP_VERSION, long *p); .SH DESCRIPTION -Pass a pointer to a long to receive the version used in the last http connection. -The returned value will be CURL_HTTP_VERSION_1_0, CURL_HTTP_VERSION_1_1, or -CURL_HTTP_VERSION_2_0, or 0 if the version can't be determined. +Pass a pointer to a long to receive the version used in the last http +connection. The returned value will be CURL_HTTP_VERSION_1_0, +CURL_HTTP_VERSION_1_1, CURL_HTTP_VERSION_2_0, CURL_HTTP_VERSION_3 or 0 if the +version can't be determined. .SH PROTOCOLS HTTP .SH EXAMPLE diff --git a/docs/libcurl/opts/CURLOPT_H3.3 b/docs/libcurl/opts/CURLOPT_H3.3 index be521b6bf..3411073fd 100644 --- a/docs/libcurl/opts/CURLOPT_H3.3 +++ b/docs/libcurl/opts/CURLOPT_H3.3 @@ -35,10 +35,6 @@ production before the experimental label is removed. .SH DESCRIPTION This function accepts a long \fIbitmask\fP with a set of flags set that controls the HTTP/3 behavior for this transfer. -.IP "CURLH3_DIRECT" -If this bit is set in \fIbitmask\fP, the host name and port number given in -the URL will be used to connect to directly with QUIC and the port number then -being a UDP port number. .SH DEFAULT 0 .SH PROTOCOLS @@ -49,7 +45,7 @@ CURL *curl = curl_easy_init(); if(curl) { CURLcode ret; curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/"); - curl_easy_setopt(curl, CURLOPT_H3, (long)CURLH3_DIRECT); + curl_easy_setopt(curl, CURLOPT_H3, (long)0); ret = curl_easy_perform(curl); } .fi diff --git a/docs/libcurl/opts/CURLOPT_HTTP_VERSION.3 b/docs/libcurl/opts/CURLOPT_HTTP_VERSION.3 index 741dfaa6c..564c0dc16 100644 --- a/docs/libcurl/opts/CURLOPT_HTTP_VERSION.3 +++ b/docs/libcurl/opts/CURLOPT_HTTP_VERSION.3 @@ -5,7 +5,7 @@ .\" * | (__| |_| | _ <| |___ .\" * \___|\___/|_| \_\_____| .\" * -.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, , et al. +.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, , et al. .\" * .\" * This software is licensed as described in the file COPYING, which .\" * you should have received as part of this distribution. The terms @@ -57,6 +57,14 @@ Issue non-TLS HTTP requests using HTTP/2 without HTTP/1.1 Upgrade. It requires prior knowledge that the server supports HTTP/2 straight away. HTTPS requests will still do HTTP/2 the standard way with negotiated protocol version in the TLS handshake. (Added in 7.49.0) +.IP CURL_HTTP_VERSION_3 +(Added in 7.66.0) Setting this value will make libcurl attempt to use HTTP/3 +directly to server given in the URL. Note that this cannot gracefully +downgrade to earlier HTTP version if the server doesn't support HTTP/3. + +For more reliably upgrading into HTTP/3, set the prefered version to something +lower and let the server announce its HTTP/3 support via Alt-Svc:. See +\fICURLOPT_ALTSVC(3)\fP. .SH DEFAULT Since curl 7.62.0: CURL_HTTP_VERSION_2TLS @@ -82,4 +90,4 @@ Along with HTTP Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not. .SH "SEE ALSO" .BR CURLOPT_SSLVERSION "(3), " CURLOPT_HTTP200ALIASES "(3), " -.BR CURLOPT_HTTP09_ALLOWED "(3), " +.BR CURLOPT_HTTP09_ALLOWED "(3), " CURLOPT_H3 "(3), " CURLOPT_ALTSVC "(3) " diff --git a/docs/libcurl/symbols-in-versions b/docs/libcurl/symbols-in-versions index 79243e25b..9a4cec2b0 100644 --- a/docs/libcurl/symbols-in-versions +++ b/docs/libcurl/symbols-in-versions @@ -209,7 +209,6 @@ CURLFTP_CREATE_DIR_RETRY 7.19.4 CURLGSSAPI_DELEGATION_FLAG 7.22.0 CURLGSSAPI_DELEGATION_NONE 7.22.0 CURLGSSAPI_DELEGATION_POLICY_FLAG 7.22.0 -CURLH3_DIRECT 7.66.0 CURLHEADER_SEPARATE 7.37.0 CURLHEADER_UNIFIED 7.37.0 CURLINFO_ACTIVESOCKET 7.45.0 diff --git a/include/curl/curl.h b/include/curl/curl.h index 9b9ec80c0..14703fd17 100644 --- a/include/curl/curl.h +++ b/include/curl/curl.h @@ -921,8 +921,6 @@ typedef enum { #define CURLPROTO_ALL (~0) /* enable everything */ /* bitmask defines for CURLOPT_H3 */ -#define CURLH3_DIRECT (1<<0) /* go QUIC + HTTP/3 directly to the given host + - port */ /* long may be 32 or 64 bits, but we should never depend on anything else but 32 */ @@ -1985,9 +1983,8 @@ enum { 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_3 = 30, /* This cannot be set with CURLOPT_HTTP_VERSION, - use CURLOPT_H3 and/or CURLOPT_ALTSVC to enable - HTTP/3 */ + CURL_HTTP_VERSION_3 = 30, /* Makes use of explicit HTTP/3 without fallback. + Use CURLOPT_ALTSVC to enable HTTP/3 upgrade */ CURL_HTTP_VERSION_LAST /* *ILLEGAL* http version */ }; diff --git a/lib/http.c b/lib/http.c index cfa7093b2..546c34aad 100644 --- a/lib/http.c +++ b/lib/http.c @@ -169,10 +169,10 @@ static CURLcode http_setup_conn(struct connectdata *conn) Curl_mime_initpart(&http->form, conn->data); data->req.protop = http; - if(data->set.h3opts & CURLH3_DIRECT) { + if(data->set.httpversion == CURL_HTTP_VERSION_3) { if(conn->handler->flags & PROTOPT_SSL) - /* Only go h3-direct on HTTPS URLs. It needs a UDP socket and does the - QUIC dance. */ + /* Only go HTTP/3 directly on HTTPS URLs. It needs a UDP socket and does + the QUIC dance. */ conn->transport = TRNSPRT_QUIC; else { failf(data, "HTTP/3 requested for non-HTTPS URL"); diff --git a/lib/setopt.c b/lib/setopt.c index 91251bd7b..1ad721131 100644 --- a/lib/setopt.c +++ b/lib/setopt.c @@ -809,6 +809,11 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param) arg = va_arg(param, long); if(arg < CURL_HTTP_VERSION_NONE) return CURLE_BAD_FUNCTION_ARGUMENT; +#ifdef ENABLE_QUIC + if(arg == CURL_HTTP_VERSION_3) + ; + else +#endif #ifndef USE_NGHTTP2 if(arg >= CURL_HTTP_VERSION_2) return CURLE_UNSUPPORTED_PROTOCOL; @@ -2752,8 +2757,7 @@ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param) #endif case CURLOPT_H3: #ifdef ENABLE_QUIC - arg = va_arg(param, long); - data->set.h3opts = arg; + /* not use anymore */ #else return CURLE_NOT_BUILT_IN; #endif diff --git a/lib/urldata.h b/lib/urldata.h index fec3f755a..395664d04 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -1680,7 +1680,6 @@ struct UserDefined { CURLU *uh; /* URL handle for the current parsed URL */ void *trailer_data; /* pointer to pass to trailer data callback */ curl_trailer_callback trailer_callback; /* trailing data callback */ - long h3opts; /* the CURLOPT_H3 bitmask */ bit is_fread_set:1; /* has read callback been set to non-NULL? */ bit is_fwrite_set:1; /* has write callback been set to non-NULL? */ bit free_referer:1; /* set TRUE if 'referer' points to a string we diff --git a/src/tool_cfgable.h b/src/tool_cfgable.h index f6248c20b..ff80f8eb8 100644 --- a/src/tool_cfgable.h +++ b/src/tool_cfgable.h @@ -259,7 +259,6 @@ struct OperationConfig { 0 is valid. default: CURL_HET_DEFAULT. */ bool haproxy_protocol; /* whether to send HAProxy protocol v1 */ bool disallow_username_in_url; /* disallow usernames in URLs */ - bool h3direct; /* go HTTP/3 directly */ struct GlobalConfig *global; struct OperationConfig *prev; struct OperationConfig *next; /* Always last in the struct */ diff --git a/src/tool_getparam.c b/src/tool_getparam.c index 952e602ed..2c1868383 100644 --- a/src/tool_getparam.c +++ b/src/tool_getparam.c @@ -201,7 +201,7 @@ static const struct LongShort aliases[]= { {"01", "http1.1", ARG_NONE}, {"02", "http2", ARG_NONE}, {"03", "http2-prior-knowledge", ARG_NONE}, - {"04", "http3-direct", ARG_NONE}, + {"04", "http3", ARG_NONE}, {"09", "http0.9", ARG_BOOL}, {"1", "tlsv1", ARG_NONE}, {"10", "tlsv1.0", ARG_NONE}, @@ -1198,9 +1198,9 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */ /* HTTP version 2.0 over clean TCP*/ config->httpversion = CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE; break; - case '4': /* --http3-direct */ - /* HTTP version 3 over QUIC - at once */ - config->h3direct = toggle; + case '4': /* --http3 */ + /* HTTP version 3 go over QUIC - at once */ + config->httpversion = CURL_HTTP_VERSION_3; break; case '9': /* Allow HTTP/0.9 responses! */ diff --git a/src/tool_help.c b/src/tool_help.c index 86bd692d9..cb0afef56 100644 --- a/src/tool_help.c +++ b/src/tool_help.c @@ -191,7 +191,7 @@ static const struct helptxt helptext[] = { "Use HTTP 2"}, {" --http2-prior-knowledge", "Use HTTP 2 without HTTP/1.1 Upgrade"}, - {" --http3-direct", + {" --http3", "Use HTTP v3"}, {" --ignore-content-length", "Ignore the size of the remote resource"}, diff --git a/src/tool_operate.c b/src/tool_operate.c index 01ee20061..c9189bdee 100644 --- a/src/tool_operate.c +++ b/src/tool_operate.c @@ -1132,9 +1132,6 @@ static CURLcode create_transfers(struct GlobalConfig *global, if(config->tcp_fastopen) my_setopt(curl, CURLOPT_TCP_FASTOPEN, 1L); - if(config->h3direct) - my_setopt(curl, CURLOPT_H3, CURLH3_DIRECT); - /* where to store */ my_setopt(curl, CURLOPT_WRITEDATA, per); my_setopt(curl, CURLOPT_INTERLEAVEDATA, per); -- cgit v1.2.3