Fix bug in QpackEncoder when cookie crumbling is disabled.
Without this fix, encoded cookies will be truncated.

Protected by gfe2_reloadable_flag_disable_cookie_crumbling_for_hyperloop2.

PiperOrigin-RevId: 661483679
diff --git a/quiche/quic/core/qpack/qpack_encoder.cc b/quiche/quic/core/qpack/qpack_encoder.cc
index c373a00..7b7bf23 100644
--- a/quiche/quic/core/qpack/qpack_encoder.cc
+++ b/quiche/quic/core/qpack/qpack_encoder.cc
@@ -118,7 +118,7 @@
   bool blocked_stream_limit_exhausted = false;
 
   for (const auto& header :
-       ValueSplittingHeaderList(&header_list, CookieCrumbling::kEnabled)) {
+       ValueSplittingHeaderList(&header_list, cookie_crumbling_)) {
     // These strings are owned by |header_list|.
     absl::string_view name = header.first;
     absl::string_view value = header.second;
diff --git a/quiche/quic/core/qpack/qpack_encoder_test.cc b/quiche/quic/core/qpack/qpack_encoder_test.cc
index 75b1194..c4f88d8 100644
--- a/quiche/quic/core/qpack/qpack_encoder_test.cc
+++ b/quiche/quic/core/qpack/qpack_encoder_test.cc
@@ -1144,6 +1144,85 @@
   EXPECT_EQ(insert_entries.size(), encoder_stream_sent_byte_count_);
 }
 
+TEST_P(QpackEncoderTest, CookieCrumblingDisabledNoDynamicTable) {
+  QpackEncoder encoder(&decoder_stream_error_delegate_, huffman_encoding_,
+                       CookieCrumbling::kDisabled);
+
+  EXPECT_CALL(encoder_stream_sender_delegate_, NumBytesBuffered())
+      .WillRepeatedly(Return(0));
+
+  quiche::HttpHeaderBlock header_list;
+  header_list["cookie"] = "foo; bar";
+
+  std::string expected_output;
+  if (HuffmanEnabled()) {
+    ASSERT_TRUE(absl::HexStringToBytes(
+        "0000"             // prefix
+        "55"               // name of static entry 5
+        "8694e7fb5231d9",  // with literal value "foo; bar"
+        &expected_output));
+  } else {
+    ASSERT_TRUE(absl::HexStringToBytes(
+        "0000"                 // prefix
+        "55"                   // name of static entry 5
+        "08666f6f3b20626172",  // with literal value "foo; bar"
+        &expected_output));
+  }
+  EXPECT_EQ(expected_output,
+            encoder.EncodeHeaderList(/* stream_id = */ 1, header_list,
+                                     &encoder_stream_sent_byte_count_));
+
+  EXPECT_EQ(0u, encoder_stream_sent_byte_count_);
+}
+
+TEST_P(QpackEncoderTest, CookieCrumblingDisabledDynamicTable) {
+  QpackEncoder encoder(&decoder_stream_error_delegate_, huffman_encoding_,
+                       CookieCrumbling::kDisabled);
+  encoder.SetMaximumBlockedStreams(1);
+  encoder.set_qpack_stream_sender_delegate(&encoder_stream_sender_delegate_);
+
+  EXPECT_CALL(encoder_stream_sender_delegate_, NumBytesBuffered())
+      .WillRepeatedly(Return(0));
+  encoder.SetMaximumBlockedStreams(1);
+  encoder.SetMaximumDynamicTableCapacity(4096);
+  encoder.SetDynamicTableCapacity(4096);
+
+  quiche::HttpHeaderBlock header_list;
+  header_list["cookie"] = "foo; bar";
+
+  // Set Dynamic Table Capacity instruction.
+  std::string set_dyanamic_table_capacity;
+  ASSERT_TRUE(absl::HexStringToBytes("3fe11f", &set_dyanamic_table_capacity));
+
+  // Insert entries into the dynamic table.
+  std::string insert_entries;
+  if (HuffmanEnabled()) {
+    ASSERT_TRUE(absl::HexStringToBytes(
+        "c5"               // insert with name reference, static index 5
+        "8694e7fb5231d9",  // with literal value "foo; bar"
+        &insert_entries));
+  } else {
+    ASSERT_TRUE(absl::HexStringToBytes(
+        "c5"                   // insert with name reference, static index 5
+        "08666f6f3b20626172",  // with literal value "foo; bar"
+        &insert_entries));
+  }
+  EXPECT_CALL(encoder_stream_sender_delegate_,
+              WriteStreamData(Eq(
+                  absl::StrCat(set_dyanamic_table_capacity, insert_entries))));
+
+  std::string expected_output;
+  ASSERT_TRUE(
+      absl::HexStringToBytes("0200"  // prefix
+                             "80",   // dynamic entry with relative index 0
+                             &expected_output));
+  EXPECT_EQ(expected_output,
+            encoder.EncodeHeaderList(/* stream_id = */ 1, header_list,
+                                     &encoder_stream_sent_byte_count_));
+
+  EXPECT_EQ(insert_entries.size(), encoder_stream_sent_byte_count_);
+}
+
 }  // namespace
 }  // namespace test
 }  // namespace quic