// Copyright 2024 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef COMPONENTS_URL_PATTERN_URL_PATTERN_UTIL_H_ #define COMPONENTS_URL_PATTERN_URL_PATTERN_UTIL_H_ #include <string> #include <string_view> #include "third_party/abseil-cpp/absl/status/statusor.h" namespace url_pattern { // The following functions are callbacks that may be passed to the // liburlpattern::Parse() method. Each performs validation and encoding for // a different URL component. // - Canonicalizes a protocol. // https://urlpattern.spec.whatwg.org/#canonicalize-a-protocol absl::StatusOr<std::string> ProtocolEncodeCallback(std::string_view input); // - Canonicalizes a username. // https://urlpattern.spec.whatwg.org/#canonicalize-a-username absl::StatusOr<std::string> UsernameEncodeCallback(std::string_view input); // - Canonicalizes a password. // https://urlpattern.spec.whatwg.org/#canonicalize-a-password absl::StatusOr<std::string> PasswordEncodeCallback(std::string_view input); // - Canonicalizes a hostname. // https://urlpattern.spec.whatwg.org/#canonicalize-a-hostname absl::StatusOr<std::string> HostnameEncodeCallback(std::string_view input); // - Canonicalizes an IPv6 hostname. // https://urlpattern.spec.whatwg.org/#canonicalize-an-ipv6-hostname absl::StatusOr<std::string> IPv6HostnameEncodeCallback(std::string_view input); // - Canonicalizes a port. // https://urlpattern.spec.whatwg.org/#canonicalize-a-port absl::StatusOr<std::string> PortEncodeCallback(std::string_view input); // Note that there are two different pathname callbacks for "standard" URLs // like `https://foo` // vs "path" URLs like `data:foo`. Select the correct // callback depending on the result of `protocol component matches a special // scheme`. // https://urlpattern.spec.whatwg.org/#protocol-component-matches-a-special-scheme // - Canonicalizes a pathname // https://urlpattern.spec.whatwg.org/#canonicalize-a-pathname absl::StatusOr<std::string> StandardURLPathnameEncodeCallback( std::string_view input); // - Canonicalizes an opaque pathname // https://urlpattern.spec.whatwg.org/#canonicalize-an-opaque-pathname absl::StatusOr<std::string> PathURLPathnameEncodeCallback( std::string_view input); // - Canonicalizes a search // https://urlpattern.spec.whatwg.org/#canonicalize-a-search absl::StatusOr<std::string> SearchEncodeCallback(std::string_view input); // - Canonicalizes a hash // https://urlpattern.spec.whatwg.org/#canonicalize-a-hash absl::StatusOr<std::string> HashEncodeCallback(std::string_view input); // Utility method to determine if a particular hostname pattern should be // treated as an IPv6 hostname. This implements a simple and fast heuristic // looking for a leading `[`. It is intended to catch the most common cases // with minimum overhead. bool TreatAsIPv6Hostname(std::string_view pattern_utf8); } // namespace url_pattern #endif // COMPONENTS_URL_PATTERN_URL_PATTERN_UTIL_H_