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
This commit is contained in:
Родитель
317076876a
Коммит
026840e35c
|
@ -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/
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
Long: http3-direct
|
||||
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.
|
||||
|
@ -14,3 +15,5 @@ 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.
|
|
@ -5,7 +5,7 @@
|
|||
.\" * | (__| |_| | _ <| |___
|
||||
.\" * \___|\___/|_| \_\_____|
|
||||
.\" *
|
||||
.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
.\" * Copyright (C) 1998 - 2019, 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
|
||||
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
.\" * | (__| |_| | _ <| |___
|
||||
.\" * \___|\___/|_| \_\_____|
|
||||
.\" *
|
||||
.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
.\" * Copyright (C) 1998 - 2019, 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
|
||||
|
@ -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) "
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
};
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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! */
|
||||
|
|
|
@ -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"},
|
||||
|
|
|
@ -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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче