Home | History | Annotate | Download | only in src
      1 // Copyright 2008, Google Inc.
      2 // All rights reserved.
      3 //
      4 // Redistribution and use in source and binary forms, with or without
      5 // modification, are permitted provided that the following conditions are
      6 // met:
      7 //
      8 //     * Redistributions of source code must retain the above copyright
      9 // notice, this list of conditions and the following disclaimer.
     10 //     * Redistributions in binary form must reproduce the above
     11 // copyright notice, this list of conditions and the following disclaimer
     12 // in the documentation and/or other materials provided with the
     13 // distribution.
     14 //     * Neither the name of Google Inc. nor the names of its
     15 // contributors may be used to endorse or promote products derived from
     16 // this software without specific prior written permission.
     17 //
     18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29 
     30 #ifndef GOOGLEURL_SRC_URL_CANON_IP_H__
     31 #define GOOGLEURL_SRC_URL_CANON_IP_H__
     32 
     33 #include "base/string16.h"
     34 #include "googleurl/src/url_canon.h"
     35 #include "googleurl/src/url_common.h"
     36 #include "googleurl/src/url_parse.h"
     37 
     38 namespace url_canon {
     39 
     40 // Searches the host name for the portions of the IPv4 address. On success,
     41 // each component will be placed into |components| and it will return true.
     42 // It will return false if the host can not be separated as an IPv4 address
     43 // or if there are any non-7-bit characters or other characters that can not
     44 // be in an IP address. (This is important so we fail as early as possible for
     45 // common non-IP hostnames.)
     46 //
     47 // Not all components may exist. If there are only 3 components, for example,
     48 // the last one will have a length of -1 or 0 to indicate it does not exist.
     49 //
     50 // Note that many platform's inet_addr will ignore everything after a space
     51 // in certain curcumstances if the stuff before the space looks like an IP
     52 // address. IE6 is included in this. We do NOT handle this case. In many cases,
     53 // the browser's canonicalization will get run before this which converts
     54 // spaces to %20 (in the case of IE7) or rejects them (in the case of
     55 // Mozilla), so this code path never gets hit. Our host canonicalization will
     56 // notice these spaces and escape them, which will make IP address finding
     57 // fail. This seems like better behavior than stripping after a space.
     58 GURL_API bool FindIPv4Components(const char* spec,
     59                                  const url_parse::Component& host,
     60                                  url_parse::Component components[4]);
     61 GURL_API bool FindIPv4Components(const char16* spec,
     62                                  const url_parse::Component& host,
     63                                  url_parse::Component components[4]);
     64 
     65 // Converts an IPv4 address to a 32-bit number (network byte order).
     66 //
     67 // Possible return values:
     68 //   IPV4    - IPv4 address was successfully parsed.
     69 //   BROKEN  - Input was formatted like an IPv4 address, but overflow occurred
     70 //             during parsing.
     71 //   NEUTRAL - Input couldn't possibly be interpreted as an IPv4 address.
     72 //             It might be an IPv6 address, or a hostname.
     73 //
     74 // On success, |num_ipv4_components| will be populated with the number of
     75 // components in the IPv4 address.
     76 GURL_API CanonHostInfo::Family IPv4AddressToNumber(
     77     const char* spec,
     78     const url_parse::Component& host,
     79     unsigned char address[4],
     80     int* num_ipv4_components);
     81 GURL_API CanonHostInfo::Family IPv4AddressToNumber(
     82     const char16* spec,
     83     const url_parse::Component& host,
     84     unsigned char address[4],
     85     int* num_ipv4_components);
     86 
     87 // Converts an IPv6 address to a 128-bit number (network byte order), returning
     88 // true on success. False means that the input was not a valid IPv6 address.
     89 //
     90 // NOTE that |host| is expected to be surrounded by square brackets.
     91 // i.e. "[::1]" rather than "::1".
     92 GURL_API bool IPv6AddressToNumber(const char* spec,
     93                                   const url_parse::Component& host,
     94                                   unsigned char address[16]);
     95 GURL_API bool IPv6AddressToNumber(const char16* spec,
     96                                   const url_parse::Component& host,
     97                                   unsigned char address[16]);
     98 
     99 }  // namespace url_canon
    100 
    101 #endif  // GOOGLEURL_SRC_URL_CANON_IP_H__
    102