Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CURLOPT_HTTP_VERSION: seting this to 3 forces HTTP/3 use directly #4197

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
10 changes: 5 additions & 5 deletions docs/HTTP3.md
Expand Up @@ -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

Expand Down Expand Up @@ -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/
2 changes: 1 addition & 1 deletion docs/cmdline-opts/Makefile.inc
Expand Up @@ -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 \
Expand Down
1 change: 1 addition & 0 deletions docs/cmdline-opts/http2.d
Expand Up @@ -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.
Expand All @@ -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.
9 changes: 5 additions & 4 deletions docs/libcurl/opts/CURLINFO_HTTP_VERSION.3
Expand Up @@ -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
Expand All @@ -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
Expand Down
6 changes: 1 addition & 5 deletions docs/libcurl/opts/CURLOPT_H3.3
Expand Up @@ -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
Expand All @@ -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
Expand Down
12 changes: 10 additions & 2 deletions docs/libcurl/opts/CURLOPT_HTTP_VERSION.3
Expand Up @@ -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
Expand Down Expand Up @@ -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

Expand All @@ -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) "
1 change: 0 additions & 1 deletion docs/libcurl/symbols-in-versions
Expand Up @@ -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
Expand Down
7 changes: 2 additions & 5 deletions include/curl/curl.h
Expand Up @@ -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 */
Expand Down Expand Up @@ -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 */
};

Expand Down
6 changes: 3 additions & 3 deletions lib/http.c
Expand Up @@ -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");
Expand Down
8 changes: 6 additions & 2 deletions lib/setopt.c
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
1 change: 0 additions & 1 deletion lib/urldata.h
Expand Up @@ -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
Expand Down
1 change: 0 additions & 1 deletion src/tool_cfgable.h
Expand Up @@ -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 */
Expand Down
8 changes: 4 additions & 4 deletions src/tool_getparam.c
Expand Up @@ -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},
Expand Down Expand Up @@ -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! */
Expand Down
2 changes: 1 addition & 1 deletion src/tool_help.c
Expand Up @@ -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"},
Expand Down
3 changes: 0 additions & 3 deletions src/tool_operate.c
Expand Up @@ -1120,9 +1120,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);
Expand Down