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));