15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_BASE_NET_UTIL_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_BASE_NET_UTIL_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <ws2tcpip.h> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/types.h> 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/socket.h> 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list> 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 205e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include <string> 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 245e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string16.h" 2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "net/base/address_family.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/escape.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_export.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FilePath; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Time; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace url_canon { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct CanonHostInfo; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace url_parse { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Parsed; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used by FormatUrl to specify handling of certain parts of the url. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint32 FormatUrlType; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint32 FormatUrlTypes; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IPAddressNumber is used to represent an IP address's numeric value as an 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// array of bytes, from most significant to least significant. This is the 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// network byte ordering. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IPv4 addresses will have length 4, whereas IPv6 address will have length 16. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<unsigned char> IPAddressNumber; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<IPAddressNumber> IPAddressList; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const size_t kIPv4AddressSize = 4; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const size_t kIPv6AddressSize = 16; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Nothing is ommitted. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT extern const FormatUrlType kFormatUrlOmitNothing; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If set, any username and password are removed. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT extern const FormatUrlType kFormatUrlOmitUsernamePassword; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If the scheme is 'http://', it's removed. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT extern const FormatUrlType kFormatUrlOmitHTTP; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Omits the path if it is just a slash and there is no query or ref. This is 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// meaningful for non-file "standard" URLs. 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT extern const FormatUrlType kFormatUrlOmitTrailingSlashOnBareHostname; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Convenience for omitting all unecessary types. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT extern const FormatUrlType kFormatUrlOmitAll; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the number of explicitly allowed ports; for testing. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT_PRIVATE extern size_t GetCountOfExplicitlyAllowedPorts(); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Given the full path to a file name, creates a file: URL. The returned URL 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// may not be valid if the input is malformed. 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NET_EXPORT GURL FilePathToFileURL(const base::FilePath& path); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Converts a file: URL back to a filename that can be passed to the OS. The 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// file URL must be well-formed (GURL::is_valid() must return true); we don't 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// handle degenerate cases here. Returns true on success, false if it isn't a 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// valid file URL. On failure, *file_path will be empty. 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NET_EXPORT bool FileURLToFilePath(const GURL& url, base::FilePath* file_path); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Splits an input of the form <host>[":"<port>] into its consitituent parts. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Saves the result into |*host| and |*port|. If the input did not have 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the optional port, sets |*port| to -1. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if the parsing was successful, false otherwise. 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The returned host is NOT canonicalized, and may be invalid. If <host> is 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an IPv6 literal address, the returned host includes the square brackets. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT bool ParseHostAndPort( 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string::const_iterator host_and_port_begin, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string::const_iterator host_and_port_end, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* host, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* port); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT bool ParseHostAndPort( 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& host_and_port, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* host, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* port); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns a host:port string for the given URL. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT std::string GetHostAndPort(const GURL& url); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns a host[:port] string for the given URL, where the port is omitted 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if it is the default for the URL's scheme. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT_PRIVATE std::string GetHostAndOptionalPort(const GURL& url); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Returns true if |hostname| contains a non-registerable or non-assignable 115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// domain name (eg: a gTLD that has not been assigned by IANA) 116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// 117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// TODO(rsleevi): http://crbug.com/119212 - Also match internal IP 118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// address ranges. 119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)NET_EXPORT bool IsHostnameNonUnique(const std::string& hostname); 120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Convenience struct for when you need a |struct sockaddr|. 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct SockaddrStorage { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SockaddrStorage() : addr_len(sizeof(addr_storage)), 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr(reinterpret_cast<struct sockaddr*>(&addr_storage)) {} 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct sockaddr_storage addr_storage; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socklen_t addr_len; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct sockaddr* const addr; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Extracts the IP address and port portions of a sockaddr. |port| is optional, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and will not be filled in if NULL. 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetIPAddressFromSockAddr(const struct sockaddr* sock_addr, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socklen_t sock_addr_len, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unsigned char** address, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t* address_len, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16* port); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the string representation of an IP address. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For example: "192.168.0.1" or "::1". 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT std::string IPAddressToString(const uint8* address, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t address_len); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the string representation of an IP address along with its port. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For example: "192.168.0.1:99" or "[::1]:80". 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT std::string IPAddressToStringWithPort(const uint8* address, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t address_len, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16 port); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Same as IPAddressToString() but for a sockaddr. This output will not include 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the IPv6 scope ID. 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT std::string NetAddressToString(const struct sockaddr* sa, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socklen_t sock_addr_len); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Same as IPAddressToStringWithPort() but for a sockaddr. This output will not 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// include the IPv6 scope ID. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT std::string NetAddressToStringWithPort(const struct sockaddr* sa, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socklen_t sock_addr_len); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Same as IPAddressToString() but for an IPAddressNumber. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT std::string IPAddressToString(const IPAddressNumber& addr); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Same as IPAddressToStringWithPort() but for an IPAddressNumber. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT std::string IPAddressToStringWithPort( 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPAddressNumber& addr, uint16 port); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the hostname of the current system. Returns empty string on failure. 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT std::string GetHostName(); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Extracts the unescaped username/password from |url|, saving the results 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// into |*username| and |*password|. 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT_PRIVATE void GetIdentityFromURL(const GURL& url, 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16* username, 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16* password); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns either the host from |url|, or, if the host is empty, the full spec. 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT std::string GetHostOrSpecFromURL(const GURL& url); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return the value of the HTTP response header with name 'name'. 'headers' 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// should be in the format that URLRequest::GetResponseHeaders() returns. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the empty string if the header is not found. 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT std::string GetSpecificHeader(const std::string& headers, 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& name); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Converts the given host name to unicode characters. This can be called for 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// any host name, if the input is not IDN or is invalid in some way, we'll just 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// return the ASCII source so it is still usable. 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The input should be the canonicalized ASCII host name from GURL. This 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// function does NOT accept UTF-8! 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |languages| is a comma separated list of ISO 639 language codes. It 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is used to determine whether a hostname is 'comprehensible' to a user 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// who understands languages listed. |host| will be converted to a 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// human-readable form (Unicode) ONLY when each component of |host| is 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// regarded as 'comprehensible'. Scipt-mixing is not allowed except that 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Latin letters in the ASCII range can be mixed with a limited set of 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// script-language pairs (currently Han, Kana and Hangul for zh,ja and ko). 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// When |languages| is empty, even that mixing is not allowed. 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)NET_EXPORT base::string16 IDNToUnicode(const std::string& host, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& languages); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Canonicalizes |host| and returns it. Also fills |host_info| with 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IP address information. |host_info| must not be NULL. 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT std::string CanonicalizeHost(const std::string& host, 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_canon::CanonHostInfo* host_info); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if |host| is not an IP address and is compliant with a set of 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// rules based on RFC 1738 and tweaked to be compatible with the real world. 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The rules are: 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * One or more components separated by '.' 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Each component begins with an alphanumeric character or '-' 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Each component contains only alphanumeric characters and '-' or '_' 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Each component ends with an alphanumeric character or '-' 214558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// * The last component begins with an alphanumeric character 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Optional trailing dot after last component (means "treat as FQDN") 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If |desired_tld| is non-NULL, the host will only be considered invalid if 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// appending it as a trailing component still results in an invalid host. This 218558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// helps us avoid marking as "invalid" user attempts to open, say, "www.-9.com" 219558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// by typing -, 9, <ctrl>+<enter>. 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTE: You should only pass in hosts that have been returned from 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CanonicalizeHost(), or you may not get accurate results. 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT bool IsCanonicalizedHostCompliant(const std::string& host, 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& desired_tld); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Call these functions to get the html snippet for a directory listing. 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The return values of both functions are in UTF-8. 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)NET_EXPORT std::string GetDirectoryListingHeader(const base::string16& title); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Given the name of a file in a directory (ftp or local) and 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// other information (is_dir, size, modification time), it returns 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the html snippet to add the entry for the file to the directory listing. 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Currently, it's a script tag containing a call to a Javascript function 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |addRow|. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |name| is the file name to be displayed. |raw_bytes| will be used 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// as the actual target of the link (so for example, ftp links should use 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// server's encoding). If |raw_bytes| is an empty string, UTF-8 encoded |name| 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// will be used. 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Both |name| and |raw_bytes| are escaped internally. 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)NET_EXPORT std::string GetDirectoryListingEntry(const base::string16& name, 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& raw_bytes, 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_dir, int64 size, 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time modified); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If text starts with "www." it is removed, otherwise text is returned 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unmodified. 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)NET_EXPORT base::string16 StripWWW(const base::string16& text); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Runs |url|'s host through StripWWW(). |url| must be valid. 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)NET_EXPORT base::string16 StripWWWFromHost(const GURL& url); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generates a filename using the first successful method from the following (in 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// order): 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 1) The raw Content-Disposition header in |content_disposition| as read from 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the network. |referrer_charset| is used to decode non-ASCII strings. 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2) |suggested_name| if specified. |suggested_name| is assumed to be in 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// UTF-8. 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3) The filename extracted from the |url|. |referrer_charset| will be used to 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// interpret the URL if there are non-ascii characters. 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 4) |default_name|. If non-empty, |default_name| is assumed to be a filename 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and shouldn't contain a path. |default_name| is not subject to validation 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// or sanitization, and therefore shouldn't be a user supplied string. 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 5) The hostname portion from the |url| 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Then, leading and trailing '.'s will be removed. On Windows, trailing spaces 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are also removed. The string "download" is the final fallback if no filename 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is found or the filename is empty. 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Any illegal characters in the filename will be replaced by '-'. If the 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// filename doesn't contain an extension, and a |mime_type| is specified, the 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// preferred extension for the |mime_type| will be appended to the filename. 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The resulting filename is then checked against a list of reserved names on 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Windows. If the name is reserved, an underscore will be prepended to the 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// filename. 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note: |mime_type| should only be specified if this function is called from a 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// thread that allows IO. 281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)NET_EXPORT base::string16 GetSuggestedFilename( 282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GURL& url, 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& content_disposition, 284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& referrer_charset, 285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& suggested_name, 286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& mime_type, 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& default_name); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Similar to GetSuggestedFilename(), but returns a FilePath. 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NET_EXPORT base::FilePath GenerateFileName( 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url, 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& content_disposition, 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& referrer_charset, 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& suggested_name, 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& mime_type, 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& default_name); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Valid basenames: 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// * are not empty 300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// * are not Windows reserved names (CON, NUL.zip, etc.) 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// * are just basenames 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// * do not have trailing separators 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// * do not equal kCurrentDirectory 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// * do not reference the parent directory 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// * are valid path components, which: 306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// - * are not the empty string 307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// - * do not contain illegal characters 308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// - * do not end with Windows shell-integrated extensions (even on posix) 309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// - * do not begin with '.' (which would hide them in most file managers) 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// - * do not end with ' ' or '.' 311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)NET_EXPORT bool IsSafePortableBasename(const base::FilePath& path); 312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Basenames of valid relative paths are IsSafePortableBasename(), and internal 314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// path components of valid relative paths are valid path components as 315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// described above IsSafePortableBasename(). Valid relative paths are not 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// absolute paths. 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)NET_EXPORT bool IsSafePortableRelativePath(const base::FilePath& path); 318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensures that the filename and extension is safe to use in the filesystem. 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assumes that |file_path| already contains a valid path or file name. On 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Windows if the extension causes the file to have an unsafe interaction with 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the shell (see net_util::IsShellIntegratedExtension()), then it will be 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// replaced by the string 'download'. If |file_path| doesn't contain an 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extension or |ignore_extension| is true then the preferred extension, if one 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// exists, for |mime_type| will be used as the extension. 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On Windows, the filename will be checked against a set of reserved names, and 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if so, an underscore will be prepended to the name. 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |file_name| can either be just the file name or it can be a full path to a 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// file. 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note: |mime_type| should only be non-empty if this function is called from a 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// thread that allows IO. 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT void GenerateSafeFileName(const std::string& mime_type, 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ignore_extension, 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath* file_path); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks |port| against a list of ports which are restricted by default. 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if |port| is allowed, false if it is restricted. 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT bool IsPortAllowedByDefault(int port); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks |port| against a list of ports which are restricted by the FTP 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// protocol. Returns true if |port| is allowed, false if it is restricted. 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT_PRIVATE bool IsPortAllowedByFtp(int port); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check if banned |port| has been overriden by an entry in 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |explicitly_allowed_ports_|. 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT_PRIVATE bool IsPortAllowedByOverride(int port); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Set socket to non-blocking mode 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT int SetNonBlocking(int fd); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Formats the host in |url| and appends it to |output|. The host formatter 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// takes the same accept languages component as ElideURL(). 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT void AppendFormattedHost(const GURL& url, 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& languages, 359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16* output); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creates a string representation of |url|. The IDN host name may be in Unicode 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if |languages| accepts the Unicode representation. |format_type| is a bitmask 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of FormatUrlTypes, see it for details. |unescape_rules| defines how to clean 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the URL for human readability. You will generally want |UnescapeRule::SPACES| 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for display to the user if you can handle spaces, or |UnescapeRule::NORMAL| 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if not. If the path part and the query part seem to be encoded in %-encoded 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// UTF-8, decodes %-encoding and UTF-8. 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The last three parameters may be NULL. 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |new_parsed| will be set to the parsing parameters of the resultant URL. 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |prefix_end| will be the length before the hostname of the resultant URL. 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (|offset[s]_for_adjustment|) specifies one or more offsets into the original 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |url|'s spec(); each offset will be modified to reflect changes this function 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// makes to the output string. For example, if |url| is "http://a:b@c.com/", 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |omit_username_password| is true, and an offset is 12 (the offset of '.'), 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// then on return the output string will be "http://c.com/" and the offset will 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be 8. If an offset cannot be successfully adjusted (e.g. because it points 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// into the middle of a component that was entirely removed, past the end of the 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// string, or into the middle of an encoding sequence), it will be set to 381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// base::string16::npos. 382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)NET_EXPORT base::string16 FormatUrl(const GURL& url, 383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& languages, 384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FormatUrlTypes format_types, 385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UnescapeRule::Type unescape_rules, 386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) url_parse::Parsed* new_parsed, 387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t* prefix_end, 388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t* offset_for_adjustment); 389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)NET_EXPORT base::string16 FormatUrlWithOffsets( 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& languages, 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormatUrlTypes format_types, 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UnescapeRule::Type unescape_rules, 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_parse::Parsed* new_parsed, 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t* prefix_end, 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<size_t>* offsets_for_adjustment); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is a convenience function for FormatUrl() with 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// format_types = kFormatUrlOmitAll and unescape = SPACES. This is the typical 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// set of flags for "URLs to display to the user". You should be cautious about 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// using this for URLs which will be parsed or sent to other applications. 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline base::string16 FormatUrl(const GURL& url, const std::string& languages) { 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return FormatUrl(url, languages, kFormatUrlOmitAll, UnescapeRule::SPACES, 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL, NULL); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns whether FormatUrl() would strip a trailing slash from |url|, given a 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// format flag including kFormatUrlOmitTrailingSlashOnBareHostname. 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT bool CanStripTrailingSlash(const GURL& url); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Strip the portions of |url| that aren't core to the network request. 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - user name / password 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - reference section 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT_PRIVATE GURL SimplifyUrlForRequest(const GURL& url); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT void SetExplicitlyAllowedPorts(const std::string& allowed_ports); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT ScopedPortException { 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedPortException(int port); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ScopedPortException(); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int port_; 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedPortException); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if it can determine that only loopback addresses are configured. 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// i.e. if only 127.0.0.1 and ::1 are routable. 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Also returns false if it cannot determine this. 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HaveOnlyLoopbackAddresses(); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Returns AddressFamily of the address. 43590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)NET_EXPORT_PRIVATE AddressFamily GetAddressFamily( 43690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const IPAddressNumber& address); 43790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Parses an IP address literal (either IPv4 or IPv6) to its numeric value. 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true on success and fills |ip_number| with the numeric value. 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT_PRIVATE bool ParseIPLiteralToNumber(const std::string& ip_literal, 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPAddressNumber* ip_number); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Converts an IPv4 address to an IPv4-mapped IPv6 address. 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For example 192.168.0.1 would be converted to ::ffff:192.168.0.1. 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT_PRIVATE IPAddressNumber ConvertIPv4NumberToIPv6Number( 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPAddressNumber& ipv4_number); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true iff |address| is an IPv4-mapped IPv6 address. 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT_PRIVATE bool IsIPv4Mapped(const IPAddressNumber& address); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Converts an IPv4-mapped IPv6 address to IPv4 address. Should only be called 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// on IPv4-mapped IPv6 addresses. 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT_PRIVATE IPAddressNumber ConvertIPv4MappedToIPv4( 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPAddressNumber& address); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Parses an IP block specifier from CIDR notation to an 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (IP address, prefix length) pair. Returns true on success and fills 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |*ip_number| with the numeric value of the IP address and sets 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |*prefix_length_in_bits| with the length of the prefix. 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CIDR notation literals can use either IPv4 or IPv6 literals. Some examples: 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 10.10.3.1/20 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a:b:c::/46 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ::1/128 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT bool ParseCIDRBlock(const std::string& cidr_literal, 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPAddressNumber* ip_number, 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t* prefix_length_in_bits); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Compares an IP address to see if it falls within the specified IP block. 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if it does, false otherwise. 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The IP block is given by (|ip_prefix|, |prefix_length_in_bits|) -- any 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IP address whose |prefix_length_in_bits| most significant bits match 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |ip_prefix| will be matched. 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In cases when an IPv4 address is being compared to an IPv6 address prefix 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and vice versa, the IPv4 addresses will be converted to IPv4-mapped 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (IPv6) addresses. 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT_PRIVATE bool IPNumberMatchesPrefix(const IPAddressNumber& ip_number, 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPAddressNumber& ip_prefix, 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t prefix_length_in_bits); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Retuns the port field of the |sockaddr|. 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint16* GetPortFieldFromSockaddr(const struct sockaddr* address, 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socklen_t address_len); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the value of port in |sockaddr| (in host byte ordering). 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT_PRIVATE int GetPortFromSockaddr(const struct sockaddr* address, 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socklen_t address_len); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if |host| is one of the names (e.g. "localhost") or IP 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// addresses (IPv4 127.0.0.0/8 or IPv6 ::1) that indicate a loopback. 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that this function does not check for IP addresses other than 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the above, although other IP addresses may point to the local 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// machine. 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT_PRIVATE bool IsLocalhost(const std::string& host); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// struct that is used by GetNetworkList() to represent a network 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// interface. 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT NetworkInterface { 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkInterface(); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkInterface(const std::string& name, const IPAddressNumber& address); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~NetworkInterface(); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name; 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPAddressNumber address; 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<NetworkInterface> NetworkInterfaceList; 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns list of network interfaces except loopback interface. If an 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// interface has more than one address, a separate entry is added to 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the list for each address. 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Can be called only on a thread that allows IO. 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NET_EXPORT bool GetNetworkList(NetworkInterfaceList* networks); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// General category of the IEEE 802.11 (wifi) physical layer operating mode. 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum WifiPHYLayerProtocol { 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No wifi support or no associated AP. 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WIFI_PHY_LAYER_PROTOCOL_NONE, 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // An obsolete modes introduced by the original 802.11, e.g. IR, FHSS, 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WIFI_PHY_LAYER_PROTOCOL_ANCIENT, 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 802.11a, OFDM-based rates. 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WIFI_PHY_LAYER_PROTOCOL_A, 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 802.11b, DSSS or HR DSSS. 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WIFI_PHY_LAYER_PROTOCOL_B, 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 802.11g, same rates as 802.11a but compatible with 802.11b. 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WIFI_PHY_LAYER_PROTOCOL_G, 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 802.11n, HT rates. 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WIFI_PHY_LAYER_PROTOCOL_N, 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Unclassified mode or failure to identify. 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WIFI_PHY_LAYER_PROTOCOL_UNKNOWN 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Characterize the PHY mode of the currently associated access point. 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Currently only available on OS_WIN. 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NET_EXPORT WifiPHYLayerProtocol GetWifiPHYLayerProtocol(); 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // NET_BASE_NET_UTIL_H_ 543