Chromium Code Reviews| Index: net/url_request/url_request_http_job.cc |
| =================================================================== |
| --- net/url_request/url_request_http_job.cc (revision 24426) |
| +++ net/url_request/url_request_http_job.cc (working copy) |
| @@ -29,6 +29,9 @@ |
| #include "net/url_request/url_request_context.h" |
| #include "net/url_request/url_request_error_job.h" |
| +// static |
| +std::set<int> URLRequestHttpJob::explicitly_allowed_ports_; |
| + |
| // TODO(darin): make sure the port blocking code is not lost |
| // static |
| @@ -36,7 +39,8 @@ |
| const std::string& scheme) { |
| DCHECK(scheme == "http" || scheme == "https"); |
| - if (!net::IsPortAllowedByDefault(request->url().IntPort())) |
| + int port = request->url().IntPort(); |
| + if (!net::IsPortAllowedByDefault(port) && !IsPortAllowedByOverride(port)) |
| return new URLRequestErrorJob(request, net::ERR_UNSAFE_PORT); |
| if (!request->context() || |
| @@ -58,6 +62,34 @@ |
| return new URLRequestHttpJob(request); |
| } |
| +// static |
| +void URLRequestHttpJob::SetExplicitlyAllowedPorts( |
|
darin (slow to review)
2009/09/01 06:49:23
it seems like we'd want to allow port overrides fo
|
| + const std::wstring& allowed_ports) { |
| + if (allowed_ports.empty()) |
| + return; |
| + |
| + std::set<int> ports; |
| + size_t last = 0; |
| + size_t size = allowed_ports.size(); |
| + // The comma delimiter. |
| + const std::wstring::value_type kComma = L','; |
| + |
| + // Overflow is still possible for evil user inputs. |
| + for (size_t i = 0; i <= size; ++i) { |
| + // The string should be composed of only digits and commas. |
| + if (i != size && !IsAsciiDigit(allowed_ports[i]) && |
| + (allowed_ports[i] != kComma)) |
| + return; |
| + if (i == size || allowed_ports[i] == kComma) { |
| + size_t length = i - last; |
| + if (length > 0) |
| + ports.insert(StringToInt(allowed_ports.substr(last, length))); |
| + last = i + 1; |
| + } |
| + } |
| + explicitly_allowed_ports_ = ports; |
| +} |
| + |
| URLRequestHttpJob::URLRequestHttpJob(URLRequest* request) |
| : URLRequestJob(request), |
| context_(request->context()), |
| @@ -345,6 +377,19 @@ |
| this, &URLRequestHttpJob::OnStartCompleted, rv)); |
| } |
| +// static |
| +bool URLRequestHttpJob::IsPortAllowedByOverride(int port) { |
| + if (explicitly_allowed_ports().empty()) |
| + return false; |
| + |
| + std::set<int>::const_iterator it = |
| + std::find(explicitly_allowed_ports().begin(), |
| + explicitly_allowed_ports().end(), |
| + port); |
| + |
| + return it != explicitly_allowed_ports().end(); |
| +} |
| + |
| void URLRequestHttpJob::CancelAuth() { |
| // Proxy gets set first, then WWW. |
| if (proxy_auth_state_ == net::AUTH_STATE_NEED_AUTH) { |