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