Remove SpdyStrAppend, SpdyHexEncodeUInt32AndTrim, SpdyStringPieceCaseHash, and SpdyStringPieceCaseEq from spdy/platform.
SpdyStrAppend and SpdyHexEncodeUInt32AndTrim can now be inlined, and call sites
simplified to avoid nested StrCat/StrAppend. Also change some stray
std::string::append(StrCat) to StrAppend.
SpdyStringPieceCaseHash and SpdyStringPieceCaseEq have such simple
implementations that it is not worth to platformize them, especially given that
only the internal implementation can delegate to an existing library
(internal-only, see b/157743370), Chromium and Envoy both have to implement
them:
https://source.chromium.org/chromium/chromium/src/+/master:net/spdy/platform/impl/spdy_string_utils_impl.h
https://github.com/envoyproxy/envoy/blob/1d1b708c7bf6efa02c41d9ce22cbf1e4a1aeec2c/source/extensions/quic_listeners/quiche/platform/spdy_string_utils_impl.h#L52-L63
PiperOrigin-RevId: 364834100
Change-Id: I70f95182b3fd7e97b19248de4512cea443a3ffdb
diff --git a/spdy/core/spdy_alt_svc_wire_format.cc b/spdy/core/spdy_alt_svc_wire_format.cc
index 4f6b4f3..5b6af98 100644
--- a/spdy/core/spdy_alt_svc_wire_format.cc
+++ b/spdy/core/spdy_alt_svc_wire_format.cc
@@ -265,15 +265,14 @@
}
value.push_back(c);
}
- value.append(absl::StrCat(":", altsvc.port, "\""));
+ absl::StrAppend(&value, ":", altsvc.port, "\"");
if (altsvc.max_age != 86400) {
- value.append(absl::StrCat("; ma=", altsvc.max_age));
+ absl::StrAppend(&value, "; ma=", altsvc.max_age);
}
if (!altsvc.version.empty()) {
if (is_ietf_format_quic) {
for (uint32_t quic_version : altsvc.version) {
- value.append("; quic=");
- value.append(SpdyHexEncodeUInt32AndTrim(quic_version));
+ absl::StrAppend(&value, "; quic=", absl::Hex(quic_version));
}
} else {
value.append("; v=\"");
@@ -282,7 +281,7 @@
if (it != altsvc.version.begin()) {
value.append(",");
}
- value.append(absl::StrCat(*it));
+ absl::StrAppend(&value, *it);
}
value.append("\"");
}
diff --git a/spdy/core/spdy_header_block.cc b/spdy/core/spdy_header_block.cc
index 93ae28f..59a9069 100644
--- a/spdy/core/spdy_header_block.cc
+++ b/spdy/core/spdy_header_block.cc
@@ -9,9 +9,9 @@
#include <algorithm>
#include <utility>
+#include "absl/strings/str_cat.h"
#include "spdy/platform/api/spdy_estimate_memory_usage.h"
#include "spdy/platform/api/spdy_logging.h"
-#include "spdy/platform/api/spdy_string_utils.h"
namespace spdy {
namespace {
@@ -223,9 +223,9 @@
std::string output = "\n{\n";
for (auto it = begin(); it != end(); ++it) {
- SpdyStrAppend(&output, " ", it->first, " ", it->second, "\n");
+ absl::StrAppend(&output, " ", it->first, " ", it->second, "\n");
}
- SpdyStrAppend(&output, "}\n");
+ absl::StrAppend(&output, "}\n");
return output;
}
diff --git a/spdy/core/spdy_header_block.h b/spdy/core/spdy_header_block.h
index 76ec436..4658419 100644
--- a/spdy/core/spdy_header_block.h
+++ b/spdy/core/spdy_header_block.h
@@ -14,12 +14,14 @@
#include <vector>
#include "absl/base/attributes.h"
+#include "absl/hash/hash.h"
+#include "absl/strings/ascii.h"
+#include "absl/strings/match.h"
#include "absl/strings/string_view.h"
#include "common/platform/api/quiche_export.h"
#include "common/platform/api/quiche_logging.h"
#include "spdy/core/spdy_header_storage.h"
#include "spdy/platform/api/spdy_containers.h"
-#include "spdy/platform/api/spdy_string_utils.h"
namespace spdy {
@@ -92,10 +94,24 @@
size_t separator_size_ = 0;
};
+ struct StringPieceCaseHash {
+ size_t operator()(absl::string_view data) const {
+ std::string lower = absl::AsciiStrToLower(data);
+ absl::Hash<absl::string_view> hasher;
+ return hasher(lower);
+ }
+ };
+
+ struct StringPieceCaseEqual {
+ bool operator()(absl::string_view piece1, absl::string_view piece2) const {
+ return absl::EqualsIgnoreCase(piece1, piece2);
+ }
+ };
+
typedef SpdyLinkedHashMap<absl::string_view,
HeaderValue,
- SpdyStringPieceCaseHash,
- SpdyStringPieceCaseEq>
+ StringPieceCaseHash,
+ StringPieceCaseEqual>
MapType;
public:
diff --git a/spdy/core/spdy_protocol.cc b/spdy/core/spdy_protocol.cc
index 4839b9b..ea90b65 100644
--- a/spdy/core/spdy_protocol.cc
+++ b/spdy/core/spdy_protocol.cc
@@ -9,7 +9,6 @@
#include "absl/strings/str_cat.h"
#include "spdy/platform/api/spdy_bug_tracker.h"
-#include "spdy/platform/api/spdy_string_utils.h"
namespace spdy {
@@ -192,8 +191,7 @@
std::string SettingsIdToString(SpdySettingsId id) {
SpdyKnownSettingsId known_id;
if (!ParseSettingsId(id, &known_id)) {
- return absl::StrCat("SETTINGS_UNKNOWN_",
- SpdyHexEncodeUInt32AndTrim(uint32_t{id}));
+ return absl::StrCat("SETTINGS_UNKNOWN_", absl::Hex(uint32_t{id}));
}
switch (known_id) {
@@ -217,8 +215,7 @@
return "SETTINGS_EXPERIMENT_SCHEDULER";
}
- return absl::StrCat("SETTINGS_UNKNOWN_",
- SpdyHexEncodeUInt32AndTrim(uint32_t{id}));
+ return absl::StrCat("SETTINGS_UNKNOWN_", absl::Hex(uint32_t{id}));
}
SpdyErrorCode ParseErrorCode(uint32_t wire_error_code) {
diff --git a/spdy/platform/api/spdy_string_utils.h b/spdy/platform/api/spdy_string_utils.h
index 81a0866..f59bcd9 100644
--- a/spdy/platform/api/spdy_string_utils.h
+++ b/spdy/platform/api/spdy_string_utils.h
@@ -19,11 +19,6 @@
namespace spdy {
-template <typename... Args>
-inline void SpdyStrAppend(std::string* output, const Args&... args) {
- SpdyStrAppendImpl(output, std::forward<const Args&>(args)...);
-}
-
inline char SpdyHexDigitToInt(char c) {
return SpdyHexDigitToIntImpl(c);
}
@@ -40,18 +35,10 @@
return SpdyHexEncodeImpl(bytes, size);
}
-inline std::string SpdyHexEncodeUInt32AndTrim(uint32_t data) {
- return SpdyHexEncodeUInt32AndTrimImpl(data);
-}
-
inline std::string SpdyHexDump(absl::string_view data) {
return SpdyHexDumpImpl(data);
}
-using SpdyStringPieceCaseHash = SpdyStringPieceCaseHashImpl;
-
-using SpdyStringPieceCaseEq = SpdyStringPieceCaseEqImpl;
-
} // namespace spdy
#endif // QUICHE_SPDY_PLATFORM_API_SPDY_STRING_UTILS_H_
diff --git a/spdy/platform/api/spdy_string_utils_test.cc b/spdy/platform/api/spdy_string_utils_test.cc
index 2964876..cb73a9b 100644
--- a/spdy/platform/api/spdy_string_utils_test.cc
+++ b/spdy/platform/api/spdy_string_utils_test.cc
@@ -13,101 +13,6 @@
namespace test {
namespace {
-TEST(SpdyStringUtilsTest, SpdyStrAppend) {
- // No arguments on empty string.
- std::string output;
- SpdyStrAppend(&output);
- EXPECT_TRUE(output.empty());
-
- // Single string-like argument.
- const char kFoo[] = "foo";
- const std::string string_foo(kFoo);
- const absl::string_view stringpiece_foo(string_foo);
- SpdyStrAppend(&output, kFoo);
- EXPECT_EQ("foo", output);
- SpdyStrAppend(&output, string_foo);
- EXPECT_EQ("foofoo", output);
- SpdyStrAppend(&output, stringpiece_foo);
- EXPECT_EQ("foofoofoo", output);
-
- // No arguments on non-empty string.
- SpdyStrAppend(&output);
- EXPECT_EQ("foofoofoo", output);
-
- output.clear();
-
- // Two string-like arguments.
- const char kBar[] = "bar";
- const absl::string_view stringpiece_bar(kBar);
- const std::string string_bar(kBar);
- SpdyStrAppend(&output, kFoo, kBar);
- EXPECT_EQ("foobar", output);
- SpdyStrAppend(&output, kFoo, string_bar);
- EXPECT_EQ("foobarfoobar", output);
- SpdyStrAppend(&output, kFoo, stringpiece_bar);
- EXPECT_EQ("foobarfoobarfoobar", output);
- SpdyStrAppend(&output, string_foo, kBar);
- EXPECT_EQ("foobarfoobarfoobarfoobar", output);
-
- output.clear();
-
- SpdyStrAppend(&output, string_foo, string_bar);
- EXPECT_EQ("foobar", output);
- SpdyStrAppend(&output, string_foo, stringpiece_bar);
- EXPECT_EQ("foobarfoobar", output);
- SpdyStrAppend(&output, stringpiece_foo, kBar);
- EXPECT_EQ("foobarfoobarfoobar", output);
- SpdyStrAppend(&output, stringpiece_foo, string_bar);
- EXPECT_EQ("foobarfoobarfoobarfoobar", output);
-
- output.clear();
-
- SpdyStrAppend(&output, stringpiece_foo, stringpiece_bar);
- EXPECT_EQ("foobar", output);
-
- // Many-many arguments.
- SpdyStrAppend(&output, "foo", "bar", "baz", "qux", "quux", "quuz", "corge",
- "grault", "garply", "waldo", "fred", "plugh", "xyzzy", "thud");
- EXPECT_EQ(
- "foobarfoobarbazquxquuxquuzcorgegraultgarplywaldofredplughxyzzythud",
- output);
-
- output.clear();
-
- // Numerical arguments.
- const int16_t i = 1;
- const uint64_t u = 8;
- const double d = 3.1415;
-
- SpdyStrAppend(&output, i, " ", u);
- EXPECT_EQ("1 8", output);
- SpdyStrAppend(&output, d, i, i, u, i);
- EXPECT_EQ("1 83.14151181", output);
- SpdyStrAppend(&output, "i: ", i, ", u: ", u, ", d: ", d);
- EXPECT_EQ("1 83.14151181i: 1, u: 8, d: 3.1415", output);
-
- output.clear();
-
- // Boolean arguments.
- const bool t = true;
- const bool f = false;
-
- SpdyStrAppend(&output, t);
- EXPECT_EQ("1", output);
- SpdyStrAppend(&output, f);
- EXPECT_EQ("10", output);
- SpdyStrAppend(&output, f, t, t, f);
- EXPECT_EQ("100110", output);
-
- output.clear();
-
- // Mixed string-like, numerical, and Boolean arguments.
- SpdyStrAppend(&output, kFoo, i, string_foo, f, u, t, stringpiece_bar, d, t);
- EXPECT_EQ("foo1foo081bar3.14151", output);
- SpdyStrAppend(&output, d, t, t, string_bar, i, u, kBar, t, d, f);
- EXPECT_EQ("foo1foo081bar3.141513.141511bar18bar13.14150", output);
-}
-
TEST(SpdyStringUtilsTest, SpdyHexDigitToInt) {
EXPECT_EQ(0, SpdyHexDigitToInt('0'));
EXPECT_EQ(1, SpdyHexDigitToInt('1'));
@@ -168,40 +73,6 @@
SpdyHexEncode(reinterpret_cast<char*>(bytes), sizeof(bytes)));
}
-TEST(SpdyStringUtilsTest, SpdyHexEncodeUInt32AndTrim) {
- EXPECT_EQ("0", SpdyHexEncodeUInt32AndTrim(0));
- EXPECT_EQ("1", SpdyHexEncodeUInt32AndTrim(1));
- EXPECT_EQ("a", SpdyHexEncodeUInt32AndTrim(0xA));
- EXPECT_EQ("f", SpdyHexEncodeUInt32AndTrim(0xF));
- EXPECT_EQ("a9", SpdyHexEncodeUInt32AndTrim(0xA9));
- EXPECT_EQ("9abcdef", SpdyHexEncodeUInt32AndTrim(0x9ABCDEF));
- EXPECT_EQ("12345678", SpdyHexEncodeUInt32AndTrim(0x12345678));
- EXPECT_EQ("ffffffff", SpdyHexEncodeUInt32AndTrim(0xFFFFFFFF));
- EXPECT_EQ("10000001", SpdyHexEncodeUInt32AndTrim(0x10000001));
-}
-
-TEST(SpdyStringUtilsTest, SpdyStringPieceCaseHash) {
- SpdyStringPieceCaseHash hasher;
- auto mixed = hasher("To Be Or Not To Be, That is The Question");
- auto lower = hasher("to be or not to be, that is the question");
- EXPECT_EQ(mixed, lower);
- auto lower2 = hasher("to be or not to be, that is the question");
- EXPECT_EQ(lower, lower2);
- auto different = hasher("to see or not to see, that is the question");
- EXPECT_NE(lower, different);
- EXPECT_NE(lower, hasher(""));
-}
-
-TEST(SpdyStringUtilsTest, SpdyStringPieceCaseEq) {
- SpdyStringPieceCaseEq eq;
- EXPECT_TRUE(eq("To Be Or Not To Be, That is The Question",
- "to be or not to be, that is the question"));
- EXPECT_TRUE(eq("to be or not to be, that is the question",
- "to be or not to be, that is the question"));
- EXPECT_FALSE(eq("to be or not to be, that is the question",
- "to see or not to see, that is the question"));
-}
-
} // namespace
} // namespace test
} // namespace spdy