13345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NET_PROXY_PROXY_SERVER_H_ 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define NET_PROXY_PROXY_SERVER_H_ 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "build/build_config.h" 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_MACOSX) 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <CoreFoundation/CoreFoundation.h> 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <string> 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/host_port_pair.h" 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace net { 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// ProxyServer encodes the {type, host, port} of a proxy server. 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// ProxyServer is immutable. 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass ProxyServer { 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The type of proxy. These are defined as bit flags so they can be ORed 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // together to pass as the |scheme_bit_field| argument to 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // ProxyService::RemoveProxiesWithoutScheme(). 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott enum Scheme { 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SCHEME_INVALID = 1 << 0, 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SCHEME_DIRECT = 1 << 1, 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SCHEME_HTTP = 1 << 2, 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SCHEME_SOCKS4 = 1 << 3, 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SCHEME_SOCKS5 = 1 << 4, 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SCHEME_HTTPS = 1 << 5, 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Default copy-constructor and assignment operator are OK! 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Constructs an invalid ProxyServer. 393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ProxyServer() : scheme_(SCHEME_INVALID) {} 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ProxyServer(Scheme scheme, const HostPortPair& host_port_pair); 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool is_valid() const { return scheme_ != SCHEME_INVALID; } 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Gets the proxy's scheme (i.e. SOCKS4, SOCKS5, HTTP) 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Scheme scheme() const { return scheme_; } 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns true if this ProxyServer is actually just a DIRECT connection. 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool is_direct() const { return scheme_ == SCHEME_DIRECT; } 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns true if this ProxyServer is an HTTP proxy. 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool is_http() const { return scheme_ == SCHEME_HTTP; } 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns true if this ProxyServer is an HTTPS proxy. 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool is_https() const { return scheme_ == SCHEME_HTTPS; } 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns true if this ProxyServer is a SOCKS proxy. 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool is_socks() const { 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return scheme_ == SCHEME_SOCKS4 || scheme_ == SCHEME_SOCKS5; 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const HostPortPair& host_port_pair() const; 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Parses from an input with format: 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // [<scheme>"://"]<server>[":"<port>] 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Both <scheme> and <port> are optional. If <scheme> is omitted, it will be 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // assumed as |default_scheme|. If <port> is omitted, it will be assumed as 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // the default port for the chosen scheme (80 for "http", 1080 for "socks"). 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // If parsing fails the instance will be set to invalid. 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Examples (for |default_scheme| = SCHEME_HTTP ): 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // "foopy" {scheme=HTTP, host="foopy", port=80} 753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // "socks://foopy" {scheme=SOCKS5, host="foopy", port=1080} 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // "socks4://foopy" {scheme=SOCKS4, host="foopy", port=1080} 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // "socks5://foopy" {scheme=SOCKS5, host="foopy", port=1080} 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // "http://foopy:17" {scheme=HTTP, host="foopy", port=17} 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "https://foopy:17" {scheme=HTTPS, host="foopy", port=17} 80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // "direct://" {scheme=DIRECT} 81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // "foopy:X" INVALID -- bad port. 82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static ProxyServer FromURI(const std::string& uri, Scheme default_scheme); 83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static ProxyServer FromURI(std::string::const_iterator uri_begin, 84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string::const_iterator uri_end, 85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Scheme default_scheme); 86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Formats as a URI string. This does the reverse of FromURI. 88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string ToURI() const; 89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Parses from a PAC string result. 91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // If <port> is omitted, it will be assumed as the default port for the 93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // chosen scheme (80 for "http", 1080 for "socks"). 94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // If parsing fails the instance will be set to invalid. 96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Examples: 98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // "PROXY foopy:19" {scheme=HTTP, host="foopy", port=19} 99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // "DIRECT" {scheme=DIRECT} 100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // "SOCKS5 foopy" {scheme=SOCKS5, host="foopy", port=1080} 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // "HTTPS foopy:123" {scheme=HTTPS, host="foopy", port=123} 102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // "BLAH xxx:xx" INVALID 103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static ProxyServer FromPacString(const std::string& pac_string); 104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static ProxyServer FromPacString(std::string::const_iterator pac_string_begin, 105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string::const_iterator pac_string_end); 106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns a ProxyServer representing DIRECT connections. 108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static ProxyServer Direct() { 1093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return ProxyServer(SCHEME_DIRECT, HostPortPair()); 110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_MACOSX) 113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Utility function to pull out a host/port pair from a dictionary and return 114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // it as a ProxyServer object. Pass in a dictionary that has a value for the 115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // host key and optionally a value for the port key. In the error condition 116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // where the host value is especially malformed, returns an invalid 117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // ProxyServer. 118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static ProxyServer FromDictionary(Scheme scheme, 119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CFDictionaryRef dict, 120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CFStringRef host_key, 121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CFStringRef port_key); 122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Formats as a PAC result entry. This does the reverse of FromPacString(). 125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string ToPacString() const; 126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns the default port number for a proxy server with the specified 128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // scheme. Returns -1 if unknown. 129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static int GetDefaultPortForScheme(Scheme scheme); 130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Parses the proxy scheme from a URL-like representation, to a 13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // ProxyServer::Scheme. This corresponds with the values used in 13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // ProxyServer::ToURI(). If no type could be matched, returns SCHEME_INVALID. 13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // |scheme| can be one of http, https, socks, socks4, socks5, direct. 13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static Scheme GetSchemeFromURI(const std::string& scheme); 13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool operator==(const ProxyServer& other) const { 138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return scheme_ == other.scheme_ && 1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick host_port_pair_.Equals(other.host_port_pair_); 1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Comparator function so this can be placed in a std::map. 1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool operator<(const ProxyServer& other) const { 1443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (scheme_ != other.scheme_) 1453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return scheme_ < other.scheme_; 1463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return host_port_pair_ < other.host_port_pair_; 147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private: 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Creates a ProxyServer given a scheme, and host/port string. If parsing the 151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // host/port string fails, the returned instance will be invalid. 152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static ProxyServer FromSchemeHostAndPort( 153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Scheme scheme, 154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string::const_iterator host_and_port_begin, 155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string::const_iterator host_and_port_end); 156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Scheme scheme_; 1583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick HostPortPair host_port_pair_; 159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 161dc0f95d653279beabeb9817299e2902918ba123eKristian Monsentypedef std::pair<HostPortPair, ProxyServer> HostPortProxyPair; 162dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace net 164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // NET_PROXY_PROXY_SERVER_H_ 166