Change TlsServerHandshaker::SetTransportParameters to return a SetTransportParametersResult instead of a boolean.

SetTransportParametersResult.success is what the function used to return. The newly returned information, quic_transport_params and early_data_context, are not used yet.

(Spin off from cl/346995830)

PiperOrigin-RevId: 347693477
Change-Id: I82559ca8306028541a2e036879feb07f7d1148f2
diff --git a/quic/core/tls_server_handshaker.cc b/quic/core/tls_server_handshaker.cc
index 0ae78a3..ad79bd9 100644
--- a/quic/core/tls_server_handshaker.cc
+++ b/quic/core/tls_server_handshaker.cc
@@ -350,7 +350,11 @@
   return true;
 }
 
-bool TlsServerHandshaker::SetTransportParameters() {
+TlsServerHandshaker::SetTransportParametersResult
+TlsServerHandshaker::SetTransportParameters() {
+  SetTransportParametersResult result;
+  DCHECK(!result.success);
+
   TransportParameters server_params;
   server_params.perspective = Perspective::IS_SERVER;
   server_params.supported_versions =
@@ -359,31 +363,38 @@
       CreateQuicVersionLabel(session()->connection()->version());
 
   if (!handshaker_delegate()->FillTransportParameters(&server_params)) {
-    return false;
+    return result;
   }
 
   // Notify QuicConnectionDebugVisitor.
   session()->connection()->OnTransportParametersSent(server_params);
 
-  std::vector<uint8_t> server_params_bytes;
-  if (!SerializeTransportParameters(session()->connection()->version(),
-                                    server_params, &server_params_bytes) ||
-      SSL_set_quic_transport_params(ssl(), server_params_bytes.data(),
-                                    server_params_bytes.size()) != 1) {
-    return false;
+  {  // Ensure |server_params_bytes| is not accessed out of the scope.
+    std::vector<uint8_t> server_params_bytes;
+    if (!SerializeTransportParameters(session()->connection()->version(),
+                                      server_params, &server_params_bytes) ||
+        SSL_set_quic_transport_params(ssl(), server_params_bytes.data(),
+                                      server_params_bytes.size()) != 1) {
+      return result;
+    }
+    result.quic_transport_params = std::move(server_params_bytes);
   }
+
   if (application_state_) {
     std::vector<uint8_t> early_data_context;
     if (!SerializeTransportParametersForTicket(
             server_params, *application_state_, &early_data_context)) {
       QUIC_BUG << "Failed to serialize Transport Parameters for ticket.";
-      return false;
+      result.early_data_context = std::vector<uint8_t>();
+      return result;
     }
     SSL_set_quic_early_data_context(ssl(), early_data_context.data(),
                                     early_data_context.size());
+    result.early_data_context = std::move(early_data_context);
     application_state_.reset(nullptr);
   }
-  return true;
+  result.success = true;
+  return result;
 }
 
 void TlsServerHandshaker::SetWriteSecret(
@@ -608,7 +619,7 @@
   OverrideQuicConfigDefaults(session()->config());
   session()->OnConfigNegotiated();
 
-  if (!SetTransportParameters()) {
+  if (!SetTransportParameters().success) {
     QUIC_LOG(ERROR) << "Failed to set transport parameters";
     return ssl_select_cert_error;
   }
@@ -672,7 +683,7 @@
   OverrideQuicConfigDefaults(session()->config());
   session()->OnConfigNegotiated();
 
-  if (!SetTransportParameters()) {
+  if (!SetTransportParameters().success) {
     QUIC_LOG(ERROR) << "Failed to set transport parameters";
     return SSL_TLSEXT_ERR_ALERT_FATAL;
   }
diff --git a/quic/core/tls_server_handshaker.h b/quic/core/tls_server_handshaker.h
index 23bbc1b..1c5eaa6 100644
--- a/quic/core/tls_server_handshaker.h
+++ b/quic/core/tls_server_handshaker.h
@@ -165,7 +165,16 @@
     TlsServerHandshaker* handshaker_;
   };
 
-  bool SetTransportParameters();
+  struct QUIC_NO_EXPORT SetTransportParametersResult {
+    bool success = false;
+    // Empty vector if QUIC transport params are not set successfully.
+    std::vector<uint8_t> quic_transport_params;
+    // absl::nullopt if there is no application state to begin with.
+    // Empty vector if application state is not set successfully.
+    absl::optional<std::vector<uint8_t>> early_data_context;
+  };
+
+  SetTransportParametersResult SetTransportParameters();
   bool ProcessTransportParameters(const SSL_CLIENT_HELLO* client_hello,
                                   std::string* error_details);