Append to output instead of overwriting it in http2::HuffmanEncode(). No functional change. PiperOrigin-RevId: 336085818 Change-Id: I84b8474b06df799cb6ae43d8a4f90a3b51c37e92
diff --git a/http2/hpack/huffman/hpack_huffman_encoder.cc b/http2/hpack/huffman/hpack_huffman_encoder.cc index a5eeaf9..ce6009a 100644 --- a/http2/hpack/huffman/hpack_huffman_encoder.cc +++ b/http2/hpack/huffman/hpack_huffman_encoder.cc
@@ -21,8 +21,7 @@ size_t encoded_size, std::string* huffman) { DCHECK(huffman != nullptr); - huffman->clear(); // Note that this doesn't release memory. - huffman->reserve(encoded_size); + huffman->reserve(huffman->size() + encoded_size); uint64_t bit_buffer = 0; // High-bit is next bit to output. Not clear if that // is more performant than having the low-bit be the // last to be output.
diff --git a/http2/hpack/huffman/hpack_huffman_encoder.h b/http2/hpack/huffman/hpack_huffman_encoder.h index a6597db..c3ac1f6 100644 --- a/http2/hpack/huffman/hpack_huffman_encoder.h +++ b/http2/hpack/huffman/hpack_huffman_encoder.h
@@ -22,9 +22,8 @@ // Encode the plain text string |plain| with the Huffman encoding defined in the // HPACK RFC, 7541. |encoded_size| is used to pre-allocate storage and it -// should be the value returned by HuffmanSize(). |*huffman| does not have to -// be empty, it is cleared at the beginning of this function. This allows -// reusing the same string object across multiple invocations. +// should be the value returned by HuffmanSize(). Appends the result to +// |*huffman|. QUICHE_EXPORT_PRIVATE void HuffmanEncode(quiche::QuicheStringPiece plain, size_t encoded_size, std::string* huffman);
diff --git a/http2/hpack/huffman/hpack_huffman_encoder_test.cc b/http2/hpack/huffman/hpack_huffman_encoder_test.cc index a5ad105..9e7f7bb 100644 --- a/http2/hpack/huffman/hpack_huffman_encoder_test.cc +++ b/http2/hpack/huffman/hpack_huffman_encoder_test.cc
@@ -115,6 +115,7 @@ } } +// Test that encoding appends to output without overwriting it. TEST_P(HuffmanEncoderTest, AppendToOutput) { size_t encoded_size = HuffmanSize("foo"); std::string buffer; @@ -123,14 +124,7 @@ encoded_size = HuffmanSize("bar"); Encode("bar", encoded_size, &buffer); - - if (use_fast_encoder_) { - // HuffmanEncodeFast() appends to output allowing callers to eliminate copy. - EXPECT_EQ(Http2HexDecode("94e78c767f"), buffer); - } else { - // HuffmanEncode() clears output before encoding. - EXPECT_EQ(Http2HexDecode("8c767f"), buffer); - } + EXPECT_EQ(Http2HexDecode("94e78c767f"), buffer); } } // namespace
diff --git a/quic/core/qpack/qpack_instruction_encoder.cc b/quic/core/qpack/qpack_instruction_encoder.cc index 6a15db8..e7f5f4f 100644 --- a/quic/core/qpack/qpack_instruction_encoder.cc +++ b/quic/core/qpack/qpack_instruction_encoder.cc
@@ -141,6 +141,7 @@ DCHECK_EQ(0, byte_ & (1 << field_->param)); byte_ |= (1 << field_->param); + huffman_encoded_string_.clear(); http2::HuffmanEncode(string_to_write_, encoded_size, &huffman_encoded_string_); string_to_write_ = huffman_encoded_string_;