1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef URL_URL_CANON_IP_H_ 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define URL_URL_CANON_IP_H_ 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string16.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "url/url_canon.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "url/url_export.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "url/url_parse.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace url_canon { 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Writes the given IPv4 address to |output|. 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)URL_EXPORT void AppendIPv4Address(const unsigned char address[4], 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CanonOutput* output); 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Writes the given IPv6 address to |output|. 20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)URL_EXPORT void AppendIPv6Address(const unsigned char address[16], 21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CanonOutput* output); 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Searches the host name for the portions of the IPv4 address. On success, 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// each component will be placed into |components| and it will return true. 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// It will return false if the host can not be separated as an IPv4 address 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// or if there are any non-7-bit characters or other characters that can not 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// be in an IP address. (This is important so we fail as early as possible for 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// common non-IP hostnames.) 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Not all components may exist. If there are only 3 components, for example, 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// the last one will have a length of -1 or 0 to indicate it does not exist. 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Note that many platform's inet_addr will ignore everything after a space 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// in certain curcumstances if the stuff before the space looks like an IP 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// address. IE6 is included in this. We do NOT handle this case. In many cases, 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// the browser's canonicalization will get run before this which converts 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// spaces to %20 (in the case of IE7) or rejects them (in the case of 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Mozilla), so this code path never gets hit. Our host canonicalization will 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// notice these spaces and escape them, which will make IP address finding 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// fail. This seems like better behavior than stripping after a space. 41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)URL_EXPORT bool FindIPv4Components(const char* spec, 42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const url_parse::Component& host, 43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) url_parse::Component components[4]); 447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)URL_EXPORT bool FindIPv4Components(const base::char16* spec, 45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const url_parse::Component& host, 46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) url_parse::Component components[4]); 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Converts an IPv4 address to a 32-bit number (network byte order). 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Possible return values: 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// IPV4 - IPv4 address was successfully parsed. 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// BROKEN - Input was formatted like an IPv4 address, but overflow occurred 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// during parsing. 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// NEUTRAL - Input couldn't possibly be interpreted as an IPv4 address. 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// It might be an IPv6 address, or a hostname. 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// On success, |num_ipv4_components| will be populated with the number of 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// components in the IPv4 address. 59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)URL_EXPORT CanonHostInfo::Family IPv4AddressToNumber( 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* spec, 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const url_parse::Component& host, 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) unsigned char address[4], 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int* num_ipv4_components); 64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)URL_EXPORT CanonHostInfo::Family IPv4AddressToNumber( 657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::char16* spec, 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const url_parse::Component& host, 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) unsigned char address[4], 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int* num_ipv4_components); 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Converts an IPv6 address to a 128-bit number (network byte order), returning 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// true on success. False means that the input was not a valid IPv6 address. 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// NOTE that |host| is expected to be surrounded by square brackets. 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// i.e. "[::1]" rather than "::1". 75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)URL_EXPORT bool IPv6AddressToNumber(const char* spec, 76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const url_parse::Component& host, 77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) unsigned char address[16]); 787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)URL_EXPORT bool IPv6AddressToNumber(const base::char16* spec, 79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const url_parse::Component& host, 80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) unsigned char address[16]); 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace url_canon 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // URL_URL_CANON_IP_H_ 85