Allows "classic" CONNECT request headers even when the extended connection option has been set.
PiperOrigin-RevId: 450736697
diff --git a/quiche/http2/adapter/header_validator.cc b/quiche/http2/adapter/header_validator.cc
index 972b0c6..67d543a 100644
--- a/quiche/http2/adapter/header_validator.cc
+++ b/quiche/http2/adapter/header_validator.cc
@@ -96,14 +96,15 @@
static const std::vector<std::string>* kExtendedConnectHeaders =
new std::vector<std::string>(
{":authority", ":method", ":path", ":protocol", ":scheme"});
- return pseudo_headers == *kExtendedConnectHeaders;
- } else {
- // See RFC 7540 Section 8.3.
- static const std::vector<std::string>* kConnectHeaders =
- new std::vector<std::string>({":authority", ":method"});
- return authority.has_value() && !authority.value().empty() &&
- pseudo_headers == *kConnectHeaders;
+ if (pseudo_headers == *kExtendedConnectHeaders) {
+ return true;
+ }
}
+ // See RFC 7540 Section 8.3.
+ static const std::vector<std::string>* kConnectHeaders =
+ new std::vector<std::string>({":authority", ":method"});
+ return authority.has_value() && !authority.value().empty() &&
+ pseudo_headers == *kConnectHeaders;
}
if (path.empty()) {
diff --git a/quiche/http2/adapter/header_validator_test.cc b/quiche/http2/adapter/header_validator_test.cc
index fc3e207..6e446f2 100644
--- a/quiche/http2/adapter/header_validator_test.cc
+++ b/quiche/http2/adapter/header_validator_test.cc
@@ -303,6 +303,15 @@
EXPECT_EQ(HeaderValidator::HEADER_OK,
v.ValidateSingleHeader(":method", "CONNECT"));
EXPECT_TRUE(v.FinishHeaderBlock(HeaderType::REQUEST));
+
+ v.SetAllowExtendedConnect();
+ // "Classic" CONNECT headers should still be accepted.
+ v.StartHeaderBlock();
+ EXPECT_EQ(HeaderValidator::HEADER_OK,
+ v.ValidateSingleHeader(":authority", "athena.dialup.mit.edu:23"));
+ EXPECT_EQ(HeaderValidator::HEADER_OK,
+ v.ValidateSingleHeader(":method", "CONNECT"));
+ EXPECT_TRUE(v.FinishHeaderBlock(HeaderType::REQUEST));
}
TEST(HeaderValidatorTest, WebsocketPseudoHeaders) {