From ccaf2333ca5b59a0525c8f51d8114ac304b4e85f Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sat, 11 Sep 2021 17:56:25 +0900 Subject: [PATCH] nghttpx: Enable websocket over h3 --- src/shrpx_downstream.cc | 6 ++++-- src/shrpx_downstream_test.cc | 5 +++++ src/shrpx_http3_upstream.cc | 6 ++++++ src/shrpx_http_downstream_connection.cc | 6 ++++-- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/shrpx_downstream.cc b/src/shrpx_downstream.cc index 7c822ba8..245e00b8 100644 --- a/src/shrpx_downstream.cc +++ b/src/shrpx_downstream.cc @@ -896,7 +896,8 @@ bool Downstream::get_non_final_response() const { } bool Downstream::supports_non_final_response() const { - return req_.http_major == 2 || (req_.http_major == 1 && req_.http_minor == 1); + return req_.http_major == 3 || req_.http_major == 2 || + (req_.http_major == 1 && req_.http_minor == 1); } bool Downstream::get_upgraded() const { return upgraded_; } @@ -947,7 +948,8 @@ bool Downstream::expect_response_trailer() const { // In HTTP/2, if final response HEADERS does not bear END_STREAM it // is possible trailer fields might come, regardless of request // method or status code. - return !resp_.headers_only && resp_.http_major == 2; + return !resp_.headers_only && + (resp_.http_major == 3 || resp_.http_major == 2); } namespace { diff --git a/src/shrpx_downstream_test.cc b/src/shrpx_downstream_test.cc index 98514437..6100b180 100644 --- a/src/shrpx_downstream_test.cc +++ b/src/shrpx_downstream_test.cc @@ -168,6 +168,11 @@ void test_downstream_supports_non_final_response(void) { Downstream d(nullptr, nullptr, 0); auto &req = d.request(); + req.http_major = 3; + req.http_minor = 0; + + CU_ASSERT(d.supports_non_final_response()); + req.http_major = 2; req.http_minor = 0; diff --git a/src/shrpx_http3_upstream.cc b/src/shrpx_http3_upstream.cc index 179c577b..c6e4d1ca 100644 --- a/src/shrpx_http3_upstream.cc +++ b/src/shrpx_http3_upstream.cc @@ -2312,10 +2312,16 @@ int Http3Upstream::setup_httpconn() { shrpx::http_reset_stream, }; + auto config = get_config(); + nghttp3_settings settings; nghttp3_settings_default(&settings); settings.qpack_max_table_capacity = 4_k; + if (!config->http2_proxy) { + settings.enable_connect_protocol = 1; + } + auto mem = nghttp3_mem_default(); rv = nghttp3_conn_server_new(&httpconn_, &callbacks, &settings, mem, this); diff --git a/src/shrpx_http_downstream_connection.cc b/src/shrpx_http_downstream_connection.cc index 95489032..6826eb5c 100644 --- a/src/shrpx_http_downstream_connection.cc +++ b/src/shrpx_http_downstream_connection.cc @@ -523,7 +523,9 @@ int HttpDownstreamConnection::push_request_headers() { (xffconf.strip_incoming ? http2::HDOP_STRIP_X_FORWARDED_FOR : 0) | (xfpconf.strip_incoming ? http2::HDOP_STRIP_X_FORWARDED_PROTO : 0) | (earlydataconf.strip_incoming ? http2::HDOP_STRIP_EARLY_DATA : 0) | - (req.http_major == 2 ? http2::HDOP_STRIP_SEC_WEBSOCKET_KEY : 0); + ((req.http_major == 3 || req.http_major == 2) + ? http2::HDOP_STRIP_SEC_WEBSOCKET_KEY + : 0); http2::build_http1_headers_from_headers(buf, req.fs.headers(), build_flags); @@ -543,7 +545,7 @@ int HttpDownstreamConnection::push_request_headers() { } if (req.connect_proto == ConnectProto::WEBSOCKET) { - if (req.http_major == 2) { + if (req.http_major == 3 || req.http_major == 2) { std::array nonce; if (RAND_bytes(nonce.data(), nonce.size()) != 1) { return -1;