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