aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRoman Arutyunyan <arut@nginx.com>2020-03-23 19:26:24 +0300
committerRoman Arutyunyan <arut@nginx.com>2020-03-23 19:26:24 +0300
commitede2656c6016d240b804bbcb28b6ecd391cca5de (patch)
tree783048d995eafb3c419bbfae690507b6641a73cb /src
parent77a4c2d17221d355e1e520cdff8fd41aec0bf3ed (diff)
downloadnginx-ede2656c6016d240b804bbcb28b6ecd391cca5de.tar.gz
nginx-ede2656c6016d240b804bbcb28b6ecd391cca5de.zip
Support for HTTP/3 ALPN.
This is required by Chrome.
Diffstat (limited to 'src')
-rw-r--r--src/event/ngx_event_quic.h4
-rw-r--r--src/event/ngx_event_quic_transport.c14
-rw-r--r--src/http/modules/ngx_http_ssl_module.c12
-rw-r--r--src/http/v3/ngx_http_v3.h3
4 files changed, 22 insertions, 11 deletions
diff --git a/src/event/ngx_event_quic.h b/src/event/ngx_event_quic.h
index 5079e0491..c174bfe44 100644
--- a/src/event/ngx_event_quic.h
+++ b/src/event/ngx_event_quic.h
@@ -11,8 +11,8 @@
#include <ngx_event_openssl.h>
-#define quic_version 0xff000018 /* draft-24 (ngtcp2) */
-//#define quic_version 0xff00001b /* draft-27 (FFN 76) */
+#define NGX_QUIC_DRAFT_VERSION 24
+#define NGX_QUIC_VERSION (0xff000000 + NGX_QUIC_DRAFT_VERSION)
#define NGX_QUIC_MAX_SHORT_HEADER 25
#define NGX_QUIC_MAX_LONG_HEADER 346
diff --git a/src/event/ngx_event_quic_transport.c b/src/event/ngx_event_quic_transport.c
index e15a267b3..90177963f 100644
--- a/src/event/ngx_event_quic_transport.c
+++ b/src/event/ngx_event_quic_transport.c
@@ -56,7 +56,7 @@ static u_char *ngx_quic_parse_int_multi(u_char *pos, u_char *end, ...);
static void ngx_quic_build_int(u_char **pos, uint64_t value);
static u_char *ngx_quic_read_uint8(u_char *pos, u_char *end, uint8_t *value);
-/*static*/ u_char *ngx_quic_read_uint16(u_char *pos, u_char *end, uint16_t *value); // usage depends on quic_version
+/*static*/ u_char *ngx_quic_read_uint16(u_char *pos, u_char *end, uint16_t *value); // usage depends on NGX_QUIC_VERSION
static u_char *ngx_quic_read_uint32(u_char *pos, u_char *end, uint32_t *value);
static u_char *ngx_quic_read_bytes(u_char *pos, u_char *end, size_t len,
u_char **out);
@@ -295,7 +295,7 @@ ngx_quic_parse_long_header(ngx_quic_header_t *pkt)
ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
"quic flags:%xi version:%xD", pkt->flags, pkt->version);
- if (pkt->version != quic_version) {
+ if (pkt->version != NGX_QUIC_VERSION) {
ngx_log_error(NGX_LOG_ERR, pkt->log, 0,
"unsupported quic version: 0x%xi", pkt->version);
return NGX_ERROR;
@@ -349,7 +349,7 @@ ngx_quic_create_long_header(ngx_quic_header_t *pkt, ngx_str_t *out,
*p++ = pkt->flags;
- p = ngx_quic_write_uint32(p, quic_version);
+ p = ngx_quic_write_uint32(p, NGX_QUIC_VERSION);
*p++ = pkt->scid.len;
p = ngx_cpymem(p, pkt->scid.data, pkt->scid.len);
@@ -1327,7 +1327,7 @@ ngx_quic_parse_transport_params(u_char *p, u_char *end, ngx_quic_tp_t *tp,
{
ngx_int_t rc;
-#if (quic_version < 0xff00001b)
+#if (NGX_QUIC_DRAFT_VERSION < 27)
uint16_t id, len, tp_len;
@@ -1493,7 +1493,7 @@ ngx_quic_create_transport_params(u_char *pos, u_char *end, ngx_quic_tp_t *tp)
u_char *p;
size_t len;
-#if (quic_version < 0xff00001b)
+#if (NGX_QUIC_DRAFT_VERSION < 27)
/* older drafts with static transport parameters encoding */
@@ -1548,13 +1548,13 @@ ngx_quic_create_transport_params(u_char *pos, u_char *end, ngx_quic_tp_t *tp)
tp->initial_max_stream_data_uni);
if (pos == NULL) {
-#if (quic_version < 0xff00001b)
+#if (NGX_QUIC_DRAFT_VERSION < 27)
len += 2;
#endif
return len;
}
-#if (quic_version < 0xff00001b)
+#if (NGX_QUIC_DRAFT_VERSION < 27)
/* TLS extension length */
p = ngx_quic_write_uint16(p, len);
#endif
diff --git a/src/http/modules/ngx_http_ssl_module.c b/src/http/modules/ngx_http_ssl_module.c
index 4b480a006..a48d3b924 100644
--- a/src/http/modules/ngx_http_ssl_module.c
+++ b/src/http/modules/ngx_http_ssl_module.c
@@ -371,7 +371,7 @@ ngx_http_ssl_alpn_select(ngx_ssl_conn_t *ssl_conn, const unsigned char **out,
#if (NGX_DEBUG)
unsigned int i;
#endif
-#if (NGX_HTTP_V2)
+#if (NGX_HTTP_V2 || NGX_HTTP_V3)
ngx_http_connection_t *hc;
#endif
#if (NGX_HTTP_V2 || NGX_DEBUG)
@@ -388,9 +388,11 @@ ngx_http_ssl_alpn_select(ngx_ssl_conn_t *ssl_conn, const unsigned char **out,
}
#endif
-#if (NGX_HTTP_V2)
+#if (NGX_HTTP_V2 || NGX_HTTP_V3)
hc = c->data;
+#endif
+#if (NGX_HTTP_V2)
if (hc->addr_conf->http2) {
srv =
(unsigned char *) NGX_HTTP_V2_ALPN_ADVERTISE NGX_HTTP_NPN_ADVERTISE;
@@ -398,6 +400,12 @@ ngx_http_ssl_alpn_select(ngx_ssl_conn_t *ssl_conn, const unsigned char **out,
} else
#endif
+#if (NGX_HTTP_V3)
+ if (hc->addr_conf->http3) {
+ srv = (unsigned char *) NGX_HTTP_V3_ALPN_ADVERTISE;
+ srvlen = sizeof(NGX_HTTP_V3_ALPN_ADVERTISE) - 1;
+ } else
+#endif
{
srv = (unsigned char *) NGX_HTTP_NPN_ADVERTISE;
srvlen = sizeof(NGX_HTTP_NPN_ADVERTISE) - 1;
diff --git a/src/http/v3/ngx_http_v3.h b/src/http/v3/ngx_http_v3.h
index 2c63f544e..81e57dc36 100644
--- a/src/http/v3/ngx_http_v3.h
+++ b/src/http/v3/ngx_http_v3.h
@@ -17,6 +17,9 @@
#define NGX_HTTP_V3_STREAM 0x48335354 /* "H3ST" */
+#define NGX_HTTP_V3_ALPN(s) NGX_HTTP_V3_ALPN_DRAFT(s)
+#define NGX_HTTP_V3_ALPN_DRAFT(s) "\x05h3-" #s
+#define NGX_HTTP_V3_ALPN_ADVERTISE NGX_HTTP_V3_ALPN(NGX_QUIC_DRAFT_VERSION)
#define NGX_HTTP_V3_VARLEN_INT_LEN 4
#define NGX_HTTP_V3_PREFIX_INT_LEN 11