treat ipv4 addresses as a single lookup key in the url classifier. b=395376, r=tony, a=mconnor

This commit is contained in:
dcamp@mozilla.com 2007-10-01 17:21:45 -07:00
Родитель be87079403
Коммит 3e9ca5a69a
1 изменённых файлов: 62 добавлений и 31 удалений

Просмотреть файл

@ -489,9 +489,12 @@ private:
nsresult GetLookupFragments(const nsCSubstring& spec,
nsTArray<nsUrlClassifierHash>& fragments);
// Check for a canonicalized IP address.
PRBool IsCanonicalizedIP(const nsACString& host);
// Get the database key for a given URI. This is the top three
// domain components if they exist, otherwise the top two.
// hostname.com/foo/bar -> hostname
// hostname.com/foo/bar -> hostname.com
// mail.hostname.com/foo/bar -> mail.hostname.com
// www.mail.hostname.com/foo/bar -> mail.hostname.com
nsresult GetKey(const nsACString& spec, nsUrlClassifierHash& hash);
@ -812,39 +815,47 @@ nsUrlClassifierDBServiceWorker::DoLookup(const nsACString& spec,
}
const nsCSubstring& host = Substring(begin, iter++);
nsCStringArray hostComponents;
hostComponents.ParseString(PromiseFlatCString(host).get(), ".");
if (hostComponents.Count() < 2) {
// no host or toplevel host, this won't match anything in the db
c->HandleEvent(EmptyCString());
return NS_OK;
}
// First check with two domain components
PRInt32 last = hostComponents.Count() - 1;
nsCAutoString lookupHost;
lookupHost.Assign(*hostComponents[last - 1]);
lookupHost.Append(".");
lookupHost.Append(*hostComponents[last]);
lookupHost.Append("/");
nsUrlClassifierHash hash;
hash.FromPlaintext(lookupHost, mCryptoHash);
// we ignore failures from CheckKey because we'd rather try to find
// more results than fail.
nsTArray<PRUint32> resultTables;
CheckKey(spec, hash, resultTables);
// Now check with three domain components
if (hostComponents.Count() > 2) {
nsCAutoString lookupHost2;
lookupHost2.Assign(*hostComponents[last - 2]);
lookupHost2.Append(".");
lookupHost2.Append(lookupHost);
hash.FromPlaintext(lookupHost2, mCryptoHash);
nsUrlClassifierHash hash;
if (IsCanonicalizedIP(host)) {
// Don't break up the host into components
hash.FromPlaintext(host, mCryptoHash);
CheckKey(spec, hash, resultTables);
} else {
nsCStringArray hostComponents;
hostComponents.ParseString(PromiseFlatCString(host).get(), ".");
if (hostComponents.Count() < 2) {
// no host or toplevel host, this won't match anything in the db
c->HandleEvent(EmptyCString());
return NS_OK;
}
// First check with two domain components
PRInt32 last = hostComponents.Count() - 1;
nsCAutoString lookupHost;
lookupHost.Assign(*hostComponents[last - 1]);
lookupHost.Append(".");
lookupHost.Append(*hostComponents[last]);
lookupHost.Append("/");
hash.FromPlaintext(lookupHost, mCryptoHash);
// we ignore failures from CheckKey because we'd rather try to find
// more results than fail.
CheckKey(spec, hash, resultTables);
// Now check with three domain components
if (hostComponents.Count() > 2) {
nsCAutoString lookupHost2;
lookupHost2.Assign(*hostComponents[last - 2]);
lookupHost2.Append(".");
lookupHost2.Append(lookupHost);
hash.FromPlaintext(lookupHost2, mCryptoHash);
CheckKey(spec, hash, resultTables);
}
}
nsCAutoString result;
@ -1151,6 +1162,21 @@ nsUrlClassifierDBServiceWorker::WriteEntry(nsUrlClassifierEntry& entry)
return NS_OK;
}
PRBool
nsUrlClassifierDBServiceWorker::IsCanonicalizedIP(const nsACString& host)
{
// The canonicalization process will have left IP addresses in dotted
// decimal with no surprises.
PRUint32 i1, i2, i3, i4;
char c;
if (PR_sscanf(PromiseFlatCString(host).get(), "%u.%u.%u.%u%c",
&i1, &i2, &i3, &i4, &c) == 4) {
return (i1 <= 0xFF && i1 <= 0xFF && i1 <= 0xFF && i1 <= 0xFF);
}
return PR_FALSE;
}
nsresult
nsUrlClassifierDBServiceWorker::GetKey(const nsACString& spec,
nsUrlClassifierHash& hash)
@ -1164,7 +1190,12 @@ nsUrlClassifierDBServiceWorker::GetKey(const nsACString& spec,
return NS_OK;
}
const nsCSubstring& host = Substring(begin, iter++);
const nsCSubstring& host = Substring(begin, iter);
if (IsCanonicalizedIP(host)) {
return hash.FromPlaintext(host, mCryptoHash);
}
nsCStringArray hostComponents;
hostComponents.ParseString(PromiseFlatCString(host).get(), ".");