1*6777b538SAndroid Build Coastguard Worker // Copyright 2021 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef NET_BASE_PROXY_STRING_UTIL_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_BASE_PROXY_STRING_UTIL_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <string> 9*6777b538SAndroid Build Coastguard Worker #include <string_view> 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h" 12*6777b538SAndroid Build Coastguard Worker #include "net/base/proxy_chain.h" 13*6777b538SAndroid Build Coastguard Worker #include "net/base/proxy_server.h" 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker namespace net { 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker // Converts a PAC result element (commonly called a PAC string) to/from a 18*6777b538SAndroid Build Coastguard Worker // ProxyServer / ProxyChain. Note that this only deals with a single proxy 19*6777b538SAndroid Build Coastguard Worker // element separated out from the complete semicolon-delimited PAC result 20*6777b538SAndroid Build Coastguard Worker // string. 21*6777b538SAndroid Build Coastguard Worker // 22*6777b538SAndroid Build Coastguard Worker // Note that PAC strings cannot currently specify multi-proxy chains. 23*6777b538SAndroid Build Coastguard Worker // 24*6777b538SAndroid Build Coastguard Worker // PAC result elements have the format: 25*6777b538SAndroid Build Coastguard Worker // <scheme>" "<host>[":"<port>] 26*6777b538SAndroid Build Coastguard Worker // 27*6777b538SAndroid Build Coastguard Worker // Where <scheme> may be one of (case-insensitive): 28*6777b538SAndroid Build Coastguard Worker // "DIRECT" 29*6777b538SAndroid Build Coastguard Worker // "PROXY" 30*6777b538SAndroid Build Coastguard Worker // "HTTPS" 31*6777b538SAndroid Build Coastguard Worker // "SOCKS4" 32*6777b538SAndroid Build Coastguard Worker // "SOCKS5" 33*6777b538SAndroid Build Coastguard Worker // "SOCKS" (canonicalizes to "SOCKS4") 34*6777b538SAndroid Build Coastguard Worker // "QUIC" 35*6777b538SAndroid Build Coastguard Worker // 36*6777b538SAndroid Build Coastguard Worker // If <port> is omitted, it will be assumed as the default port for the 37*6777b538SAndroid Build Coastguard Worker // chosen scheme (via ProxyServer::GetDefaultPortForScheme()). 38*6777b538SAndroid Build Coastguard Worker // 39*6777b538SAndroid Build Coastguard Worker // Returns an invalid ProxyServer / ProxyChain if parsing fails. 40*6777b538SAndroid Build Coastguard Worker // 41*6777b538SAndroid Build Coastguard Worker // Examples: 42*6777b538SAndroid Build Coastguard Worker // "PROXY foopy:19" {scheme=HTTP, host="foopy", port=19} 43*6777b538SAndroid Build Coastguard Worker // "DIRECT" {scheme=DIRECT} 44*6777b538SAndroid Build Coastguard Worker // "SOCKS5 foopy" {scheme=SOCKS5, host="foopy", port=1080} 45*6777b538SAndroid Build Coastguard Worker // "HTTPS foopy:123" {scheme=HTTPS, host="foopy", port=123} 46*6777b538SAndroid Build Coastguard Worker // "QUIC foopy:123" {scheme=QUIC, host="foopy", port=123} 47*6777b538SAndroid Build Coastguard Worker // "BLAH xxx:xx" INVALID 48*6777b538SAndroid Build Coastguard Worker NET_EXPORT ProxyChain 49*6777b538SAndroid Build Coastguard Worker PacResultElementToProxyChain(std::string_view pac_result_element); 50*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/1491092): Remove method once all calls are updated to use 51*6777b538SAndroid Build Coastguard Worker // PacResultElementToProxyChain. 52*6777b538SAndroid Build Coastguard Worker NET_EXPORT ProxyServer 53*6777b538SAndroid Build Coastguard Worker PacResultElementToProxyServer(std::string_view pac_result_element); 54*6777b538SAndroid Build Coastguard Worker NET_EXPORT std::string ProxyServerToPacResultElement( 55*6777b538SAndroid Build Coastguard Worker const ProxyServer& proxy_server); 56*6777b538SAndroid Build Coastguard Worker 57*6777b538SAndroid Build Coastguard Worker // Converts a non-standard URI string to/from a ProxyServer. 58*6777b538SAndroid Build Coastguard Worker // 59*6777b538SAndroid Build Coastguard Worker // The non-standard URI strings have the format: 60*6777b538SAndroid Build Coastguard Worker // [<scheme>"://"]<server>[":"<port>] 61*6777b538SAndroid Build Coastguard Worker // 62*6777b538SAndroid Build Coastguard Worker // Where <scheme> may be one of: 63*6777b538SAndroid Build Coastguard Worker // "http" 64*6777b538SAndroid Build Coastguard Worker // "socks4" 65*6777b538SAndroid Build Coastguard Worker // "socks5 66*6777b538SAndroid Build Coastguard Worker // "socks" (equivalent to "socks5") 67*6777b538SAndroid Build Coastguard Worker // "direct" 68*6777b538SAndroid Build Coastguard Worker // "https" 69*6777b538SAndroid Build Coastguard Worker // "quic" 70*6777b538SAndroid Build Coastguard Worker // 71*6777b538SAndroid Build Coastguard Worker // Both <scheme> and <port> are optional. If <scheme> is omitted, it will be 72*6777b538SAndroid Build Coastguard Worker // assumed as |default_scheme|. If <port> is omitted, it will be assumed as 73*6777b538SAndroid Build Coastguard Worker // the default port for the chosen scheme (via 74*6777b538SAndroid Build Coastguard Worker // ProxyServer::GetDefaultPortForScheme()). 75*6777b538SAndroid Build Coastguard Worker // 76*6777b538SAndroid Build Coastguard Worker // If parsing fails the returned proxy will have scheme 77*6777b538SAndroid Build Coastguard Worker // `ProxyServer::SCHEME_INVALID`. 78*6777b538SAndroid Build Coastguard Worker // 79*6777b538SAndroid Build Coastguard Worker // Examples (for `default_pac_scheme` = `kHttp` ): 80*6777b538SAndroid Build Coastguard Worker // "foopy" {scheme=HTTP, host="foopy", port=80} 81*6777b538SAndroid Build Coastguard Worker // "socks://foopy" {scheme=SOCKS5, host="foopy", port=1080} 82*6777b538SAndroid Build Coastguard Worker // "socks4://foopy" {scheme=SOCKS4, host="foopy", port=1080} 83*6777b538SAndroid Build Coastguard Worker // "socks5://foopy" {scheme=SOCKS5, host="foopy", port=1080} 84*6777b538SAndroid Build Coastguard Worker // "http://foopy:17" {scheme=HTTP, host="foopy", port=17} 85*6777b538SAndroid Build Coastguard Worker // "https://foopy:17" {scheme=HTTPS, host="foopy", port=17} 86*6777b538SAndroid Build Coastguard Worker // "quic://foopy:17" {scheme=QUIC, host="foopy", port=17} 87*6777b538SAndroid Build Coastguard Worker // "direct://" {scheme=DIRECT} 88*6777b538SAndroid Build Coastguard Worker // "foopy:X" INVALID -- bad port. 89*6777b538SAndroid Build Coastguard Worker NET_EXPORT ProxyChain ProxyUriToProxyChain(std::string_view uri, 90*6777b538SAndroid Build Coastguard Worker ProxyServer::Scheme default_scheme); 91*6777b538SAndroid Build Coastguard Worker NET_EXPORT ProxyServer 92*6777b538SAndroid Build Coastguard Worker ProxyUriToProxyServer(std::string_view uri, ProxyServer::Scheme default_scheme); 93*6777b538SAndroid Build Coastguard Worker NET_EXPORT std::string ProxyServerToProxyUri(const ProxyServer& proxy_server); 94*6777b538SAndroid Build Coastguard Worker NET_EXPORT ProxyServer 95*6777b538SAndroid Build Coastguard Worker ProxySchemeHostAndPortToProxyServer(ProxyServer::Scheme scheme, 96*6777b538SAndroid Build Coastguard Worker std::string_view host_and_port); 97*6777b538SAndroid Build Coastguard Worker 98*6777b538SAndroid Build Coastguard Worker // Parses the proxy scheme from the non-standard URI scheme string 99*6777b538SAndroid Build Coastguard Worker // representation used in `ProxyUriToProxyServer()` and 100*6777b538SAndroid Build Coastguard Worker // `ProxyServerToProxyUri()`. If no type could be matched, returns 101*6777b538SAndroid Build Coastguard Worker // SCHEME_INVALID. 102*6777b538SAndroid Build Coastguard Worker NET_EXPORT ProxyServer::Scheme GetSchemeFromUriScheme(std::string_view scheme); 103*6777b538SAndroid Build Coastguard Worker 104*6777b538SAndroid Build Coastguard Worker } // namespace net 105*6777b538SAndroid Build Coastguard Worker 106*6777b538SAndroid Build Coastguard Worker #endif // NET_BASE_PROXY_STRING_UTIL_H_ 107