Use faster Huffman encoding for HPACK.

Protected by FLAGS_gfe2_reloadable_flag_spdy_use_fast_huffman_encoder.

PiperOrigin-RevId: 335922459
Change-Id: Ie45cd16554d8bd7dfd3f63f8e25aadf465561e79
diff --git a/spdy/core/hpack/hpack_encoder.cc b/spdy/core/hpack/hpack_encoder.cc
index 64d0005..566f4ee 100644
--- a/spdy/core/hpack/hpack_encoder.cc
+++ b/spdy/core/hpack/hpack_encoder.cc
@@ -8,6 +8,7 @@
 #include <limits>
 #include <utility>
 
+#include "net/third_party/quiche/src/http2/hpack/huffman/hpack_huffman_encoder.h"
 #include "net/third_party/quiche/src/spdy/core/hpack/hpack_constants.h"
 #include "net/third_party/quiche/src/spdy/core/hpack/hpack_header_table.h"
 #include "net/third_party/quiche/src/spdy/core/hpack/hpack_huffman_table.h"
@@ -84,7 +85,9 @@
       listener_(NoOpListener),
       should_index_(DefaultPolicy),
       enable_compression_(true),
-      should_emit_table_size_(false) {}
+      should_emit_table_size_(false),
+      use_fast_huffman_encoder_(
+          GetSpdyReloadableFlag(http2_use_fast_huffman_encoder)) {}
 
 HpackEncoder::~HpackEncoder() = default;
 
@@ -199,13 +202,21 @@
 
 void HpackEncoder::EmitString(quiche::QuicheStringPiece str) {
   size_t encoded_size =
-      enable_compression_ ? huffman_table_.EncodedSize(str) : str.size();
+      enable_compression_
+          ? (use_fast_huffman_encoder_ ? http2::HuffmanSize(str)
+                                       : huffman_table_.EncodedSize(str))
+          : str.size();
   if (encoded_size < str.size()) {
     SPDY_DVLOG(2) << "Emitted Huffman-encoded string of length "
                   << encoded_size;
     output_stream_.AppendPrefix(kStringLiteralHuffmanEncoded);
     output_stream_.AppendUint32(encoded_size);
-    huffman_table_.EncodeString(str, &output_stream_);
+    if (use_fast_huffman_encoder_) {
+      http2::HuffmanEncodeFast(str, encoded_size,
+                               output_stream_.MutableString());
+    } else {
+      huffman_table_.EncodeString(str, &output_stream_);
+    }
   } else {
     SPDY_DVLOG(2) << "Emitted literal string of length " << str.size();
     output_stream_.AppendPrefix(kStringLiteralIdentityEncoded);
diff --git a/spdy/core/hpack/hpack_encoder.h b/spdy/core/hpack/hpack_encoder.h
index 2455f3d..3b3e0d1 100644
--- a/spdy/core/hpack/hpack_encoder.h
+++ b/spdy/core/hpack/hpack_encoder.h
@@ -148,6 +148,8 @@
   IndexingPolicy should_index_;
   bool enable_compression_;
   bool should_emit_table_size_;
+  // Latched value of gfe2_reloadable_flag_http2_use_fast_huffman_encoder.
+  const bool use_fast_huffman_encoder_;
 };
 
 }  // namespace spdy