Change Settings frame's setting id from 2 byte integer to variable length
integer.

gfe-relnote: n/a --under version 99, which is not turned on.
PiperOrigin-RevId: 244771758
Change-Id: I0e1b329ff0696255f5ca0c10087bf39090b81e76
diff --git a/quic/core/http/http_encoder.cc b/quic/core/http/http_encoder.cc
index 9de1571..01f9c10 100644
--- a/quic/core/http/http_encoder.cc
+++ b/quic/core/http/http_encoder.cc
@@ -48,8 +48,6 @@
 static const size_t kPriorityWeightLength = 1;
 // Length of a priority frame's first byte.
 static const size_t kPriorityFirstByteLength = 1;
-// Length of a key in the map of a settings frame.
-static const size_t kSettingsMapKeyLength = 2;
 
 }  // namespace
 
@@ -71,6 +69,8 @@
   if (WriteFrameHeader(payload_length, HttpFrameType::DATA, &writer)) {
     return header_length;
   }
+  QUIC_DLOG(ERROR)
+      << "Http encoder failed when attempting to serialize data frame header.";
   return 0;
 }
 
@@ -89,6 +89,9 @@
   if (WriteFrameHeader(payload_length, HttpFrameType::HEADERS, &writer)) {
     return header_length;
   }
+  QUIC_DLOG(ERROR)
+      << "Http encoder failed when attempting to serialize headers "
+         "frame header.";
   return 0;
 }
 
@@ -107,6 +110,8 @@
   QuicDataWriter writer(total_length, output->get());
 
   if (!WriteFrameHeader(payload_length, HttpFrameType::PRIORITY, &writer)) {
+    QUIC_DLOG(ERROR) << "Http encoder failed when attempting to serialize "
+                        "priority frame header.";
     return 0;
   }
 
@@ -124,6 +129,8 @@
       writer.WriteUInt8(priority.weight)) {
     return total_length;
   }
+  QUIC_DLOG(ERROR) << "Http encoder failed when attempting to serialize "
+                      "priority frame payload.";
   return 0;
 }
 
@@ -142,16 +149,18 @@
       writer.WriteVarInt62(cancel_push.push_id)) {
     return total_length;
   }
+  QUIC_DLOG(ERROR)
+      << "Http encoder failed when attempting to serialize cancel push frame.";
   return 0;
 }
 
 QuicByteCount HttpEncoder::SerializeSettingsFrame(
     const SettingsFrame& settings,
     std::unique_ptr<char[]>* output) {
-  // Calculate the key sizes.
-  QuicByteCount payload_length = settings.values.size() * kSettingsMapKeyLength;
-  // Calculate the value sizes.
+  QuicByteCount payload_length = 0;
+  // Calculate the payload length.
   for (auto it = settings.values.begin(); it != settings.values.end(); ++it) {
+    payload_length += QuicDataWriter::GetVarInt62Len(it->first);
     payload_length += QuicDataWriter::GetVarInt62Len(it->second);
   }
 
@@ -162,11 +171,15 @@
   QuicDataWriter writer(total_length, output->get());
 
   if (!WriteFrameHeader(payload_length, HttpFrameType::SETTINGS, &writer)) {
+    QUIC_DLOG(ERROR) << "Http encoder failed when attempting to serialize "
+                        "settings frame header.";
     return 0;
   }
 
   for (auto it = settings.values.begin(); it != settings.values.end(); ++it) {
-    if (!writer.WriteUInt16(it->first) || !writer.WriteVarInt62(it->second)) {
+    if (!writer.WriteVarInt62(it->first) || !writer.WriteVarInt62(it->second)) {
+      QUIC_DLOG(ERROR) << "Http encoder failed when attempting to serialize "
+                          "settings frame payload.";
       return 0;
     }
   }
@@ -194,6 +207,8 @@
       writer.WriteVarInt62(push_promise.push_id)) {
     return total_length;
   }
+  QUIC_DLOG(ERROR)
+      << "Http encoder failed when attempting to serialize push promise frame.";
   return 0;
 }
 
@@ -212,6 +227,8 @@
       writer.WriteVarInt62(goaway.stream_id)) {
     return total_length;
   }
+  QUIC_DLOG(ERROR)
+      << "Http encoder failed when attempting to serialize goaway frame.";
   return 0;
 }
 
@@ -230,6 +247,8 @@
       writer.WriteVarInt62(max_push_id.push_id)) {
     return total_length;
   }
+  QUIC_DLOG(ERROR)
+      << "Http encoder failed when attempting to serialize max push id frame.";
   return 0;
 }
 
@@ -249,6 +268,8 @@
       writer.WriteVarInt62(duplicate_push.push_id)) {
     return total_length;
   }
+  QUIC_DLOG(ERROR) << "Http encoder failed when attempting to serialize "
+                      "duplicate push frame.";
   return 0;
 }