Updates SpdyHeaderBlock's hashing and equality types to make the data structure case-insensitive with respect to keys. gfe-relnote: Makes SpdyHeaderBlock case-insensitive with respect to keys. Not possible to protect. PiperOrigin-RevId: 288035700 Change-Id: Ifdff6aed6e65f96c60e3ef9d164f7899a0a23baa
diff --git a/spdy/core/hpack/hpack_decoder_adapter_test.cc b/spdy/core/hpack/hpack_decoder_adapter_test.cc index f1bfe0c..ab3ac77 100644 --- a/spdy/core/hpack/hpack_decoder_adapter_test.cc +++ b/spdy/core/hpack/hpack_decoder_adapter_test.cc
@@ -410,7 +410,7 @@ std::string("foo\0baz", 7)); // Other headers are joined on \0. Case matters. - decoder_peer_.HandleHeaderRepresentation("joined", "not joined"); + decoder_peer_.HandleHeaderRepresentation("joined", "joined"); decoder_peer_.HandleHeaderRepresentation("joineD", "value 1"); decoder_peer_.HandleHeaderRepresentation("joineD", "value 2"); @@ -435,8 +435,8 @@ ElementsAre( Pair("cookie", " part 1; part 2 ; part3; fin!"), Pair("passed-through", quiche::QuicheStringPiece("foo\0baz", 7)), - Pair("joined", "not joined"), - Pair("joineD", quiche::QuicheStringPiece("value 1\0value 2", 15)), + Pair("joined", + quiche::QuicheStringPiece("joined\0value 1\0value 2", 22)), Pair("empty", ""), Pair("empty-joined", quiche::QuicheStringPiece("\0foo\0\0", 6)))); }
diff --git a/spdy/core/spdy_header_block.h b/spdy/core/spdy_header_block.h index e164478..a625393 100644 --- a/spdy/core/spdy_header_block.h +++ b/spdy/core/spdy_header_block.h
@@ -18,6 +18,7 @@ #include "net/third_party/quiche/src/spdy/platform/api/spdy_containers.h" #include "net/third_party/quiche/src/spdy/platform/api/spdy_export.h" #include "net/third_party/quiche/src/spdy/platform/api/spdy_macros.h" +#include "net/third_party/quiche/src/spdy/platform/api/spdy_string_utils.h" namespace spdy { @@ -86,8 +87,8 @@ typedef SpdyLinkedHashMap<quiche::QuicheStringPiece, HeaderValue, - quiche::QuicheStringPieceHash, - std::equal_to<quiche::QuicheStringPiece>> + SpdyStringPieceCaseHash, + SpdyStringPieceCaseEq> MapType; public:
diff --git a/spdy/core/spdy_header_block_test.cc b/spdy/core/spdy_header_block_test.cc index aad264c..806e89e 100644 --- a/spdy/core/spdy_header_block_test.cc +++ b/spdy/core/spdy_header_block_test.cc
@@ -220,13 +220,14 @@ SpdyHeaderBlock block; block["Foo"] = "foo"; block.AppendValueOrAddHeader("Foo", "bar"); - EXPECT_EQ(block.end(), block.find("foo")); + EXPECT_NE(block.end(), block.find("foo")); EXPECT_EQ(Pair("Foo", std::string("foo\0bar", 7)), *block.find("Foo")); - // The map is case sensitive, so both "Foo" and "foo" can be present. + // The map is case insensitive, so updating "foo" modifies the entry + // previously added. block.AppendValueOrAddHeader("foo", "baz"); - EXPECT_THAT(block, ElementsAre(Pair("Foo", std::string("foo\0bar", 7)), - Pair("foo", "baz"))); + EXPECT_THAT(block, + ElementsAre(Pair("Foo", std::string("foo\0bar\0baz", 11)))); } namespace {