Skip to content
Permalink
Browse files

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
  • Loading branch information...
bagder committed Aug 7, 2019
1 parent 3170768 commit 026840e35c7359c23741afe633bd3ab4b121c4ed
@@ -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);

0 comments on commit 026840e

Please sign in to comment.
You can’t perform that action at this time.