Add trace messages for QuicCryptoServerConfig::ProcessClientHelloContext.

This allows us to tell if a gQUIC connection trace is 0RTT or not.

PiperOrigin-RevId: 432245164
diff --git a/quic/core/crypto/quic_crypto_server_config.cc b/quic/core/crypto/quic_crypto_server_config.cc
index ee0ed33..ec4c038 100644
--- a/quic/core/crypto/quic_crypto_server_config.cc
+++ b/quic/core/crypto/quic_crypto_server_config.cc
@@ -12,6 +12,7 @@
 
 #include "absl/base/attributes.h"
 #include "absl/strings/escaping.h"
+#include "absl/strings/str_format.h"
 #include "absl/strings/string_view.h"
 #include "absl/types/optional.h"
 #include "third_party/boringssl/src/include/openssl/sha.h"
@@ -37,6 +38,7 @@
 #include "quic/core/proto/crypto_server_config_proto.h"
 #include "quic/core/proto/source_address_token_proto.h"
 #include "quic/core/quic_clock.h"
+#include "quic/core/quic_connection_context.h"
 #include "quic/core/quic_packets.h"
 #include "quic/core/quic_socket_address_coder.h"
 #include "quic/core/quic_types.h"
@@ -116,6 +118,40 @@
   return false;
 }
 
+std::string FormatCryptoHandshakeMessageForTrace(
+    const CryptoHandshakeMessage* message) {
+  if (message == nullptr) {
+    return "<null message>";
+  }
+
+  std::string s = QuicTagToString(message->tag());
+
+  // Append the reasons for REJ.
+  if (const auto it = message->tag_value_map().find(kRREJ);
+      it != message->tag_value_map().end()) {
+    const std::string& value = it->second;
+    // The value is a vector of uint32_t(s).
+    if (value.size() % sizeof(uint32_t) == 0) {
+      absl::StrAppend(&s, " RREJ:[");
+      // Append comma-separated list of reasons to |s|.
+      for (size_t j = 0; j < value.size(); j += sizeof(uint32_t)) {
+        uint32_t reason;
+        memcpy(&reason, value.data() + j, sizeof(reason));
+        if (j > 0) {
+          absl::StrAppend(&s, ",");
+        }
+        absl::StrAppend(&s, CryptoUtils::HandshakeFailureReasonToString(
+                                static_cast<HandshakeFailureReason>(reason)));
+      }
+      absl::StrAppend(&s, "]");
+    } else {
+      absl::StrAppendFormat(&s, " RREJ:[unexpected length:%u]", value.size());
+    }
+  }
+
+  return s;
+}
+
 }  // namespace
 
 // static
@@ -217,6 +253,8 @@
 void QuicCryptoServerConfig::ProcessClientHelloContext::Fail(
     QuicErrorCode error,
     const std::string& error_details) {
+  QUIC_TRACEPRINTF("ProcessClientHello failed: error=%s, details=%s",
+                   QuicErrorCodeToString(error), error_details);
   done_cb_->Run(error, error_details, nullptr, nullptr, nullptr);
   done_cb_ = nullptr;
 }
@@ -225,6 +263,9 @@
     std::unique_ptr<CryptoHandshakeMessage> message,
     std::unique_ptr<DiversificationNonce> diversification_nonce,
     std::unique_ptr<ProofSource::Details> proof_source_details) {
+  QUIC_TRACEPRINTF("ProcessClientHello succeeded: %s",
+                   FormatCryptoHandshakeMessageForTrace(message.get()));
+
   done_cb_->Run(QUIC_NO_ERROR, std::string(), std::move(message),
                 std::move(diversification_nonce),
                 std::move(proof_source_details));