Print non-printable QUIC tags as hex.

This is particularly useful when displaying IETF QUIC draft versions that contain 0xff.

gfe-relnote: Print non-printable QUIC tags as hex. Protected by gfe2_reloadable_flag_quic_print_tag_hex.
PiperOrigin-RevId: 243859884
Change-Id: I8d48edc219ecd6329acf89d4f627cfbd6bf54f74
diff --git a/quic/core/quic_tag.cc b/quic/core/quic_tag.cc
index a85f546..109803d 100644
--- a/quic/core/quic_tag.cc
+++ b/quic/core/quic_tag.cc
@@ -8,6 +8,8 @@
 #include <string>
 
 #include "net/third_party/quiche/src/quic/platform/api/quic_arraysize.h"
+#include "net/third_party/quiche/src/quic/platform/api/quic_flag_utils.h"
+#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
 #include "net/third_party/quiche/src/quic/platform/api/quic_text_utils.h"
 
 namespace quic {
@@ -34,6 +36,9 @@
 }
 
 std::string QuicTagToString(QuicTag tag) {
+  if (GetQuicReloadableFlag(quic_print_tag_hex) && tag == 0) {
+    return "0";
+  }
   char chars[sizeof tag];
   bool ascii = true;
   const QuicTag orig_tag = tag;
@@ -55,7 +60,14 @@
     return std::string(chars, sizeof(chars));
   }
 
-  return QuicTextUtils::Uint64ToString(orig_tag);
+  if (!GetQuicReloadableFlag(quic_print_tag_hex)) {
+    return QuicTextUtils::Uint64ToString(orig_tag);
+  }
+
+  QUIC_RELOADABLE_FLAG_COUNT(quic_print_tag_hex);
+
+  return QuicTextUtils::HexEncode(reinterpret_cast<const char*>(&orig_tag),
+                                  sizeof(orig_tag));
 }
 
 uint32_t MakeQuicTag(char a, char b, char c, char d) {
diff --git a/quic/core/quic_tag_test.cc b/quic/core/quic_tag_test.cc
index 88e636a..20af4ee 100644
--- a/quic/core/quic_tag_test.cc
+++ b/quic/core/quic_tag_test.cc
@@ -5,6 +5,7 @@
 #include "net/third_party/quiche/src/quic/core/quic_tag.h"
 
 #include "net/third_party/quiche/src/quic/core/crypto/crypto_protocol.h"
+#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
 #include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
 
 namespace quic {
@@ -18,9 +19,12 @@
   EXPECT_EQ("SNO ", QuicTagToString(kServerNonceTag));
   EXPECT_EQ("CRT ", QuicTagToString(kCertificateTag));
   EXPECT_EQ("CHLO", QuicTagToString(MakeQuicTag('C', 'H', 'L', 'O')));
-  // A tag that contains a non-printing character will be printed as a decimal
-  // number.
-  EXPECT_EQ("525092931", QuicTagToString(MakeQuicTag('C', 'H', 'L', '\x1f')));
+  if (!GetQuicReloadableFlag(quic_print_tag_hex)) {
+    EXPECT_EQ("525092931", QuicTagToString(MakeQuicTag('C', 'H', 'L', '\x1f')));
+    return;
+  }
+  // A tag that contains a non-printing character will be printed as hex.
+  EXPECT_EQ("43484c1f", QuicTagToString(MakeQuicTag('C', 'H', 'L', '\x1f')));
 }
 
 TEST_F(QuicTagTest, MakeQuicTag) {
diff --git a/quic/core/quic_versions.cc b/quic/core/quic_versions.cc
index ef2657c..4f1b29c 100644
--- a/quic/core/quic_versions.cc
+++ b/quic/core/quic_versions.cc
@@ -408,6 +408,7 @@
   SetQuicReloadableFlag(quic_use_uber_loss_algorithm, true);
   SetQuicReloadableFlag(quic_use_uber_received_packet_manager, true);
   SetQuicReloadableFlag(quic_validate_packet_number_post_decryption, true);
+  SetQuicReloadableFlag(quic_print_tag_hex, true);
   SetQuicRestartFlag(quic_enable_accept_random_ipn, true);
 }