Add a proper API to create memslices from the QUIC code.

Current API provides an (allocator, size) constructor.  However, this just creates a buffer with random data in it and no way to change it, since memslices are read-only.  Current code uses const_cast; this CL creates a proper API and updates all existing call sites to use it.

gfe-relnote: n/a (no functional change)
PiperOrigin-RevId: 287072774
Change-Id: Ie4dd2eae6db2ec91b087f5d41887ea3948ee411a
diff --git a/quic/masque/masque_compression_engine.cc b/quic/masque/masque_compression_engine.cc
index 804a8cf..dbc4580 100644
--- a/quic/masque/masque_compression_engine.cc
+++ b/quic/masque/masque_compression_engine.cc
@@ -6,6 +6,7 @@
 
 #include <cstdint>
 
+#include "net/third_party/quiche/src/quic/core/quic_buffer_allocator.h"
 #include "net/third_party/quiche/src/quic/core/quic_data_reader.h"
 #include "net/third_party/quiche/src/quic/core/quic_data_writer.h"
 #include "net/third_party/quiche/src/quic/core/quic_framer.h"
@@ -102,33 +103,32 @@
     uint8_t first_byte,
     bool long_header,
     QuicDataReader* reader,
-    QuicMemSlice* slice) {
-  QuicDataWriter writer(slice->length(), const_cast<char*>(slice->data()));
+    QuicDataWriter* writer) {
   if (validated) {
     QUIC_DVLOG(1) << "Compressing using validated flow_id " << flow_id;
-    if (!writer.WriteVarInt62(flow_id)) {
+    if (!writer->WriteVarInt62(flow_id)) {
       QUIC_BUG << "Failed to write flow_id";
       return false;
     }
   } else {
     QUIC_DVLOG(1) << "Compressing using unvalidated flow_id " << flow_id;
-    if (!writer.WriteVarInt62(kFlowId0)) {
+    if (!writer->WriteVarInt62(kFlowId0)) {
       QUIC_BUG << "Failed to write kFlowId0";
       return false;
     }
-    if (!writer.WriteVarInt62(flow_id)) {
+    if (!writer->WriteVarInt62(flow_id)) {
       QUIC_BUG << "Failed to write flow_id";
       return false;
     }
-    if (!writer.WriteLengthPrefixedConnectionId(client_connection_id)) {
+    if (!writer->WriteLengthPrefixedConnectionId(client_connection_id)) {
       QUIC_BUG << "Failed to write client_connection_id";
       return false;
     }
-    if (!writer.WriteLengthPrefixedConnectionId(server_connection_id)) {
+    if (!writer->WriteLengthPrefixedConnectionId(server_connection_id)) {
       QUIC_BUG << "Failed to write server_connection_id";
       return false;
     }
-    if (!writer.WriteUInt16(server_address.port())) {
+    if (!writer->WriteUInt16(server_address.port())) {
       QUIC_BUG << "Failed to write port";
       return false;
     }
@@ -153,16 +153,16 @@
       QUIC_BUG << "Unexpected server_address " << server_address;
       return false;
     }
-    if (!writer.WriteUInt8(address_id)) {
+    if (!writer->WriteUInt8(address_id)) {
       QUIC_BUG << "Failed to write address_id";
       return false;
     }
-    if (!writer.WriteStringPiece(peer_ip_bytes)) {
+    if (!writer->WriteStringPiece(peer_ip_bytes)) {
       QUIC_BUG << "Failed to write IP address";
       return false;
     }
   }
-  if (!writer.WriteUInt8(first_byte)) {
+  if (!writer->WriteUInt8(first_byte)) {
     QUIC_BUG << "Failed to write first_byte";
     return false;
   }
@@ -172,7 +172,7 @@
       QUIC_DLOG(ERROR) << "Failed to read version";
       return false;
     }
-    if (!writer.WriteUInt32(version_label)) {
+    if (!writer->WriteUInt32(version_label)) {
       QUIC_BUG << "Failed to write version";
       return false;
     }
@@ -214,7 +214,7 @@
     }
   }
   quiche::QuicheStringPiece packet_payload = reader->ReadRemainingPayload();
-  if (!writer.WriteStringPiece(packet_payload)) {
+  if (!writer->WriteStringPiece(packet_payload)) {
     QUIC_BUG << "Failed to write packet_payload";
     return false;
   }
@@ -276,17 +276,19 @@
                     sizeof(server_address.port()) + sizeof(uint8_t) +
                     server_address.host().ToPackedString().length();
   }
-  QuicMemSlice slice(
+  QuicUniqueBufferPtr buffer = MakeUniqueBuffer(
       masque_session_->connection()->helper()->GetStreamSendBufferAllocator(),
       slice_length);
+  QuicDataWriter writer(slice_length, buffer.get());
 
-  if (!WriteCompressedPacketToSlice(client_connection_id, server_connection_id,
-                                    server_address, destination_connection_id,
-                                    source_connection_id, flow_id, validated,
-                                    first_byte, long_header, &reader, &slice)) {
+  if (!WriteCompressedPacketToSlice(
+          client_connection_id, server_connection_id, server_address,
+          destination_connection_id, source_connection_id, flow_id, validated,
+          first_byte, long_header, &reader, &writer)) {
     return;
   }
 
+  QuicMemSlice slice(std::move(buffer), slice_length);
   MessageResult message_result =
       masque_session_->SendMessage(QuicMemSliceSpan(&slice));
 
diff --git a/quic/masque/masque_compression_engine.h b/quic/masque/masque_compression_engine.h
index 32ffc9d..95328df 100644
--- a/quic/masque/masque_compression_engine.h
+++ b/quic/masque/masque_compression_engine.h
@@ -104,7 +104,7 @@
                                     uint8_t first_byte,
                                     bool long_header,
                                     QuicDataReader* reader,
-                                    QuicMemSlice* slice);
+                                    QuicDataWriter* writer);
 
   // Parses compression context from flow ID 0 during decompression.
   bool ParseCompressionContext(QuicDataReader* reader,