Add a new method ParseQuicVersionLabelString() for parsing string-ified QUIC version labels (but not other formats). PiperOrigin-RevId: 427339522
diff --git a/quic/core/quic_versions.cc b/quic/core/quic_versions.cc index c457dbf..9dd0cc9 100644 --- a/quic/core/quic_versions.cc +++ b/quic/core/quic_versions.cc
@@ -457,6 +457,18 @@ return QuicTagToString(quiche::QuicheEndian::HostToNet32(version_label)); } +ParsedQuicVersion ParseQuicVersionLabelString( + absl::string_view version_label_string) { + const ParsedQuicVersionVector supported_versions = AllSupportedVersions(); + for (const ParsedQuicVersion& version : supported_versions) { + if (version_label_string == + QuicVersionLabelToString(CreateQuicVersionLabel(version))) { + return version; + } + } + return UnsupportedQuicVersion(); +} + std::string QuicVersionLabelVectorToString( const QuicVersionLabelVector& version_labels, const std::string& separator, size_t skip_after_nth_version) {
diff --git a/quic/core/quic_versions.h b/quic/core/quic_versions.h index c6e2406..4e16fef 100644 --- a/quic/core/quic_versions.h +++ b/quic/core/quic_versions.h
@@ -490,6 +490,15 @@ QUIC_EXPORT_PRIVATE std::string QuicVersionLabelToString( QuicVersionLabel version_label); +// Helper function which translates from a QuicVersionLabel string to a +// ParsedQuicVersion. The version label string must be of the form returned +// by QuicVersionLabelToString, for example, "00000001" or "Q046", but not +// "51303433" (the hex encoding of the Q064 version label). Returns +// the ParsedQuicVersion which matches the label or UnsupportedQuicVersion() +// otherwise. +QUIC_EXPORT_PRIVATE ParsedQuicVersion +ParseQuicVersionLabelString(absl::string_view version_label_string); + // Returns |separator|-separated list of string representations of // QuicVersionLabel values in the supplied |version_labels| vector. The values // after the (0-based) |skip_after_nth_version|'th are skipped.
diff --git a/quic/core/quic_versions_test.cc b/quic/core/quic_versions_test.cc index 5e8e97b..4dcad1c 100644 --- a/quic/core/quic_versions_test.cc +++ b/quic/core/quic_versions_test.cc
@@ -274,6 +274,34 @@ EXPECT_EQ("Q035,T038,ff000007", os.str()); } +TEST(QuicVersionsTest, ParseQuicVersionLabelString) { + static_assert(SupportedVersions().size() == 5u, + "Supported versions out of sync"); + // Explicitly test known QUIC version label strings. + EXPECT_EQ(ParsedQuicVersion::Q043(), ParseQuicVersionLabelString("Q043")); + EXPECT_EQ(ParsedQuicVersion::Q046(), ParseQuicVersionLabelString("Q046")); + EXPECT_EQ(ParsedQuicVersion::Q050(), ParseQuicVersionLabelString("Q050")); + EXPECT_EQ(ParsedQuicVersion::Draft29(), + ParseQuicVersionLabelString("ff00001d")); + EXPECT_EQ(ParsedQuicVersion::RFCv1(), + ParseQuicVersionLabelString("00000001")); + + // Sanity check that a variety of other serialization formats are ignored. + EXPECT_EQ(UnsupportedQuicVersion(), ParseQuicVersionLabelString("1")); + EXPECT_EQ(UnsupportedQuicVersion(), ParseQuicVersionLabelString("46")); + EXPECT_EQ(UnsupportedQuicVersion(), + ParseQuicVersionLabelString("QUIC_VERSION_46")); + EXPECT_EQ(UnsupportedQuicVersion(), ParseQuicVersionLabelString("h3")); + EXPECT_EQ(UnsupportedQuicVersion(), ParseQuicVersionLabelString("h3-29")); + + // Test round-trips between QuicVersionLabelToString and + // ParseQuicVersionLabelString. + for (const ParsedQuicVersion& version : AllSupportedVersions()) { + EXPECT_EQ(version, ParseQuicVersionLabelString(QuicVersionLabelToString( + CreateQuicVersionLabel(version)))); + } +} + TEST(QuicVersionsTest, QuicVersionToString) { EXPECT_EQ("QUIC_VERSION_UNSUPPORTED", QuicVersionToString(QUIC_VERSION_UNSUPPORTED));