Do not use string_view_utils.h or stringpiece_ssize_type in balsa_headers.cc.

Neither string_view_utils.h nor stringpiece_ssize_type are part of public
Abseil.  This CL copies necessary helper functions to balsa_headers.cc.
stringpiece_ssize_type is typedefed to std::string::difference_type, which, just
like absl::string_piece::difference_type, is an alias to ptrdiff_t.

Also include absl/strings/str_format.h for absl::StrAppendFormat().

PiperOrigin-RevId: 445194088
diff --git a/quiche/common/balsa/balsa_headers.cc b/quiche/common/balsa/balsa_headers.cc
index d96b5a8..e024e1a 100644
--- a/quiche/common/balsa/balsa_headers.cc
+++ b/quiche/common/balsa/balsa_headers.cc
@@ -16,9 +16,9 @@
 #include "absl/strings/ascii.h"
 #include "absl/strings/match.h"
 #include "absl/strings/str_cat.h"
+#include "absl/strings/str_format.h"
 #include "absl/strings/str_join.h"
 #include "absl/strings/string_view.h"
-#include "absl/strings/string_view_utils.h"
 #include "quiche/common/balsa/balsa_enums.h"
 #include "quiche/common/balsa/header_properties.h"
 #include "quiche/common/platform/api/quiche_header_policy.h"
@@ -118,6 +118,49 @@
 // HEADER_FUNC to insert "name" into the MultivaluedHeadersSet of Envoy headers.
 #define MULTIVALUE_ENVOY_HEADER(name) {name},
 
+absl::string_view::difference_type FindIgnoreCase(absl::string_view haystack,
+                                                  absl::string_view needle) {
+  absl::string_view::difference_type pos = 0;
+  while (haystack.size() >= needle.size()) {
+    if (absl::StartsWithIgnoreCase(haystack, needle)) {
+      return pos;
+    }
+    ++pos;
+    haystack.remove_prefix(1);
+  }
+
+  return absl::string_view::npos;
+}
+
+absl::string_view::difference_type RemoveLeadingWhitespace(
+    absl::string_view* text) {
+  size_t count = 0;
+  const char* ptr = text->data();
+  while (count < text->size() && absl::ascii_isspace(*ptr)) {
+    count++;
+    ptr++;
+  }
+  text->remove_prefix(count);
+  return count;
+}
+
+absl::string_view::difference_type RemoveTrailingWhitespace(
+    absl::string_view* text) {
+  size_t count = 0;
+  const char* ptr = text->data() + text->size() - 1;
+  while (count < text->size() && absl::ascii_isspace(*ptr)) {
+    ++count;
+    --ptr;
+  }
+  text->remove_suffix(count);
+  return count;
+}
+
+absl::string_view::difference_type RemoveWhitespaceContext(
+    absl::string_view* text) {
+  return RemoveLeadingWhitespace(text) + RemoveTrailingWhitespace(text);
+}
+
 }  // namespace
 
 namespace quiche {
@@ -505,8 +548,8 @@
 // Helper function for HeaderHasValue that checks that the specified region
 // within line is preceded by whitespace and a comma or beginning of line,
 // and followed by whitespace and a comma or end of line.
-bool SurroundedOnlyBySpacesAndCommas(stringpiece_ssize_type idx,
-                                     stringpiece_ssize_type end_idx,
+bool SurroundedOnlyBySpacesAndCommas(absl::string_view::difference_type idx,
+                                     absl::string_view::difference_type end_idx,
                                      absl::string_view line) {
   for (idx = idx - 1; idx >= 0; --idx) {
     if (line[idx] == ',') {
@@ -537,10 +580,9 @@
        it != lines().end(); ++it) {
     absl::string_view line = it->second;
     absl::string_view::size_type idx =
-        case_sensitive ? line.find(value, 0)
-                       : strings::FindIgnoreCase(line, value);
+        case_sensitive ? line.find(value, 0) : FindIgnoreCase(line, value);
     while (idx != absl::string_view::npos) {
-      stringpiece_ssize_type end_idx = idx + value.size();
+      absl::string_view::difference_type end_idx = idx + value.size();
       if (SurroundedOnlyBySpacesAndCommas(idx, end_idx, line)) {
         return true;
       }
@@ -693,7 +735,7 @@
                                  absl::string_view search_value) {
   // Remove whitespace around search value.
   absl::string_view needle = search_value;
-  strings::RemoveWhitespaceContext(&needle);
+  RemoveWhitespaceContext(&needle);
   QUICHE_BUG_IF(bug_22783_2, needle != search_value)
       << "Search value should not be surrounded by spaces.";
 
@@ -723,7 +765,7 @@
     // this stringpiece will continually move forward, and its tail
     // (head+length) will always remain the same.
     absl::string_view values(value_begin, line->ValuesLength());
-    strings::RemoveWhitespaceContext(&values);
+    RemoveWhitespaceContext(&values);
     if (values.size() == needle.size()) {
       if (values == needle) {
         line->skip = true;
@@ -736,8 +778,7 @@
     char* insertion = value_begin;
     while (values.size() >= needle.size()) {
       // Strip leading whitespace.
-      ssize_t cur_leading_whitespace =
-          strings::RemoveLeadingWhitespace(&values);
+      ssize_t cur_leading_whitespace = RemoveLeadingWhitespace(&values);
 
       // See if we've got a match (at least as a prefix).
       bool found = absl::StartsWith(values, needle);
@@ -757,7 +798,7 @@
         if (comma_found) {
           cur.remove_suffix(1);
         }
-        strings::RemoveTrailingWhitespace(&cur);
+        RemoveTrailingWhitespace(&cur);
         found = (cur.size() == needle.size());
       }