| Index: net/base/ssl_false_start_blacklist.h
|
| ===================================================================
|
| --- net/base/ssl_false_start_blacklist.h (revision 101373)
|
| +++ net/base/ssl_false_start_blacklist.h (working copy)
|
| @@ -5,7 +5,9 @@
|
| #ifndef NET_BASE_SSL_FALSE_START_BLACKLIST_H_
|
| #define NET_BASE_SSL_FALSE_START_BLACKLIST_H_
|
|
|
| -#include "base/basictypes.h"
|
| +#include <string>
|
| +
|
| +#include "base/logging.h"
|
| #include "net/base/net_export.h"
|
|
|
| namespace net {
|
| @@ -16,64 +18,42 @@
|
| // table for fast lookups.
|
| class SSLFalseStartBlacklist {
|
| public:
|
| - // IsMember returns true if the given host is in the blacklist.
|
| - // host: a DNS name in dotted form (i.e. "www.example.com")
|
| - NET_EXPORT_PRIVATE static bool IsMember(const char* host);
|
| + // Returns true if |host| (a DNS name in dotted form, e.g. "www.example.com")
|
| + // is in the blacklist.
|
| + NET_EXPORT_PRIVATE static bool IsMember(const std::string& host);
|
|
|
| - // Hash returns the modified djb2 hash of the given string.
|
| - static unsigned Hash(const char* str) {
|
| - // This is inline because the code which generates the hash table needs to
|
| - // use it. However, the generating code cannot link against
|
| - // ssl_false_start_blacklist.cc because that needs the tables which it
|
| - // generates.
|
| - const unsigned char* in = reinterpret_cast<const unsigned char*>(str);
|
| - unsigned hash = 5381;
|
| - unsigned char c;
|
| -
|
| - while ((c = *in++))
|
| - hash = ((hash << 5) + hash) ^ c;
|
| + // Returns the modified djb2 hash of |host|.
|
| + // NOTE: This is inline because the code which generates the hash table needs
|
| + // to use it. However, the generating code cannot link against
|
| + // ssl_false_start_blacklist.cc because that needs the tables which it
|
| + // generates.
|
| + static uint32 Hash(const std::string& host) {
|
| + uint32 hash = 5381;
|
| + for (const uint8* in = reinterpret_cast<const uint8*>(host.c_str());
|
| + *in != 0; ++in)
|
| + hash = ((hash << 5) + hash) ^ *in;
|
| return hash;
|
| }
|
|
|
| - // LastTwoLabels returns a pointer within |host| to the last two labels of
|
| - // |host|. For example, if |host| is "a.b.c.d" then LastTwoLabels will return
|
| - // "c.d".
|
| - // host: a DNS name in dotted form.
|
| - // returns: NULL on error, otherwise a pointer inside |host|.
|
| - static const char* LastTwoLabels(const char* host) {
|
| - // See comment in |Hash| for why this function is inline.
|
| - const size_t len = strlen(host);
|
| - if (len == 0)
|
| - return NULL;
|
| -
|
| - unsigned dots_found = 0;
|
| - size_t i;
|
| - for (i = len - 1; i < len; i--) {
|
| - if (host[i] == '.') {
|
| - dots_found++;
|
| - if (dots_found == 2) {
|
| - i++;
|
| - break;
|
| - }
|
| - }
|
| - }
|
| -
|
| - if (i > len)
|
| - i = 0;
|
| -
|
| - if (dots_found == 0)
|
| - return NULL; // no names with less than two labels are in the blacklist.
|
| - if (dots_found == 1) {
|
| - if (host[0] == '.')
|
| - return NULL; // ditto
|
| - }
|
| -
|
| - return &host[i];
|
| + // Returns the last two dot-separated components of |host|, ignoring any
|
| + // trailing dots. For example, returns "c.d" for "a.b.c.d.". Returns an
|
| + // empty string if |host| does not have two dot-separated components.
|
| + // NOTE: Inline for the same reason as Hash().
|
| + static std::string LastTwoComponents(const std::string& host) {
|
| + size_t last_nondot = host.find_last_not_of('.');
|
| + if (last_nondot == std::string::npos)
|
| + return std::string();
|
| + size_t last_dot = host.find_last_of('.', last_nondot);
|
| + if ((last_dot == 0) || (last_dot == std::string::npos))
|
| + return std::string();
|
| + // NOTE: This next line works correctly even when the call returns npos.
|
| + size_t components_begin = host.find_last_of('.', last_dot - 1) + 1;
|
| + return host.substr(components_begin, last_nondot - components_begin + 1);
|
| }
|
|
|
| // This is the number of buckets in the blacklist hash table. (Must be a
|
| // power of two).
|
| - static const unsigned kBuckets = 128;
|
| + static const size_t kBuckets = 128;
|
|
|
| private:
|
| // The following two members are defined in
|
|
|