Fix idle timeout negotiation

When clients configure the maximum idle timeout to a different value (as Chrome does), we need to use that maximum instead of the default maximum.

gfe-relnote: fix idle timeout negotiation, protected by disabled TLS flag
PiperOrigin-RevId: 268567456
Change-Id: I4db42fdcb73530a5049cf7b2953128b8b917b10f
diff --git a/quic/core/quic_config.cc b/quic/core/quic_config.cc
index c62a00a..425dbdf 100644
--- a/quic/core/quic_config.cc
+++ b/quic/core/quic_config.cc
@@ -900,9 +900,9 @@
   // An idle timeout of zero indicates it is disabled (in other words, it is
   // set to infinity). When the idle timeout is very high, we set it to our
   // preferred maximum and still probe that often.
-  if (idle_timeout_seconds > kMaximumIdleTimeoutSecs ||
+  if (idle_timeout_seconds > idle_network_timeout_seconds_.GetMax() ||
       idle_timeout_seconds == 0) {
-    idle_timeout_seconds = kMaximumIdleTimeoutSecs;
+    idle_timeout_seconds = idle_network_timeout_seconds_.GetMax();
   }
   QuicErrorCode error = idle_network_timeout_seconds_.ReceiveValue(
       idle_timeout_seconds, hello_type, error_details);
@@ -986,6 +986,7 @@
     }
   }
 
+  *error_details = "";
   return QUIC_NO_ERROR;
 }
 
diff --git a/quic/core/quic_config_test.cc b/quic/core/quic_config_test.cc
index 630e67a..5e3bb65 100644
--- a/quic/core/quic_config_test.cc
+++ b/quic/core/quic_config_test.cc
@@ -306,6 +306,22 @@
       kTBBR, Perspective::IS_SERVER));
 }
 
+TEST_P(QuicConfigTest, IncomingLargeIdleTimeoutTransportParameter) {
+  // Configure our default to 30s and max to 60s, then receive 120s from peer.
+  // Since the received value is above the max, we should then use the max.
+  config_.SetIdleNetworkTimeout(quic::QuicTime::Delta::FromSeconds(60),
+                                quic::QuicTime::Delta::FromSeconds(30));
+  TransportParameters params;
+  params.idle_timeout_milliseconds.set_value(120000);
+
+  std::string error_details = "foobar";
+  EXPECT_EQ(QUIC_NO_ERROR,
+            config_.ProcessTransportParameters(params, SERVER, &error_details));
+  EXPECT_EQ("", error_details);
+  EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(60),
+            config_.IdleNetworkTimeout());
+}
+
 }  // namespace
 }  // namespace test
 }  // namespace quic