OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/url_request/url_request_http_job.h" | 5 #include "net/url_request/url_request_http_job.h" |
6 | 6 |
7 #include "base/base_switches.h" | 7 #include "base/base_switches.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 794 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
805 } | 805 } |
806 } | 806 } |
807 | 807 |
808 if (result == OK) { | 808 if (result == OK) { |
809 scoped_refptr<HttpResponseHeaders> headers = GetResponseHeaders(); | 809 scoped_refptr<HttpResponseHeaders> headers = GetResponseHeaders(); |
810 if (network_delegate()) { | 810 if (network_delegate()) { |
811 // Note that |this| may not be deleted until | 811 // Note that |this| may not be deleted until |
812 // |on_headers_received_callback_| or | 812 // |on_headers_received_callback_| or |
813 // |NetworkDelegate::URLRequestDestroyed()| has been called. | 813 // |NetworkDelegate::URLRequestDestroyed()| has been called. |
814 OnCallToDelegate(); | 814 OnCallToDelegate(); |
| 815 allowed_unsafe_redirect_url_ = GURL(); |
815 int error = network_delegate()->NotifyHeadersReceived( | 816 int error = network_delegate()->NotifyHeadersReceived( |
816 request_, | 817 request_, |
817 on_headers_received_callback_, | 818 on_headers_received_callback_, |
818 headers.get(), | 819 headers.get(), |
819 &override_response_headers_); | 820 &override_response_headers_, |
| 821 &allowed_unsafe_redirect_url_); |
820 if (error != net::OK) { | 822 if (error != net::OK) { |
821 if (error == net::ERR_IO_PENDING) { | 823 if (error == net::ERR_IO_PENDING) { |
822 awaiting_callback_ = true; | 824 awaiting_callback_ = true; |
823 } else { | 825 } else { |
824 std::string source("delegate"); | 826 std::string source("delegate"); |
825 request_->net_log().AddEvent(NetLog::TYPE_CANCELLED, | 827 request_->net_log().AddEvent(NetLog::TYPE_CANCELLED, |
826 NetLog::StringCallback("source", | 828 NetLog::StringCallback("source", |
827 &source)); | 829 &source)); |
828 OnCallToDelegateComplete(); | 830 OnCallToDelegateComplete(); |
829 NotifyStartError(URLRequestStatus(URLRequestStatus::FAILED, error)); | 831 NotifyStartError(URLRequestStatus(URLRequestStatus::FAILED, error)); |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1037 ? Filter::Factory(encoding_types, *filter_context_) : NULL; | 1039 ? Filter::Factory(encoding_types, *filter_context_) : NULL; |
1038 } | 1040 } |
1039 | 1041 |
1040 bool URLRequestHttpJob::IsSafeRedirect(const GURL& location) { | 1042 bool URLRequestHttpJob::IsSafeRedirect(const GURL& location) { |
1041 // HTTP is always safe. | 1043 // HTTP is always safe. |
1042 // TODO(pauljensen): Remove once crbug.com/146591 is fixed. | 1044 // TODO(pauljensen): Remove once crbug.com/146591 is fixed. |
1043 if (location.is_valid() && | 1045 if (location.is_valid() && |
1044 (location.scheme() == "http" || location.scheme() == "https")) { | 1046 (location.scheme() == "http" || location.scheme() == "https")) { |
1045 return true; | 1047 return true; |
1046 } | 1048 } |
| 1049 // Delegates may mark an URL as safe for redirection. |
| 1050 if (allowed_unsafe_redirect_url_.is_valid()) { |
| 1051 GURL::Replacements replacements; |
| 1052 replacements.ClearRef(); |
| 1053 if (allowed_unsafe_redirect_url_.ReplaceComponents(replacements) == |
| 1054 location.ReplaceComponents(replacements)) { |
| 1055 return true; |
| 1056 } |
| 1057 } |
1047 // Query URLRequestJobFactory as to whether |location| would be safe to | 1058 // Query URLRequestJobFactory as to whether |location| would be safe to |
1048 // redirect to. | 1059 // redirect to. |
1049 return request_->context()->job_factory() && | 1060 return request_->context()->job_factory() && |
1050 request_->context()->job_factory()->IsSafeRedirectTarget(location); | 1061 request_->context()->job_factory()->IsSafeRedirectTarget(location); |
1051 } | 1062 } |
1052 | 1063 |
1053 bool URLRequestHttpJob::NeedsAuth() { | 1064 bool URLRequestHttpJob::NeedsAuth() { |
1054 int code = GetResponseCode(); | 1065 int code = GetResponseCode(); |
1055 if (code == -1) | 1066 if (code == -1) |
1056 return false; | 1067 return false; |
(...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1492 return override_response_headers_.get() ? | 1503 return override_response_headers_.get() ? |
1493 override_response_headers_.get() : | 1504 override_response_headers_.get() : |
1494 transaction_->GetResponseInfo()->headers.get(); | 1505 transaction_->GetResponseInfo()->headers.get(); |
1495 } | 1506 } |
1496 | 1507 |
1497 void URLRequestHttpJob::NotifyURLRequestDestroyed() { | 1508 void URLRequestHttpJob::NotifyURLRequestDestroyed() { |
1498 awaiting_callback_ = false; | 1509 awaiting_callback_ = false; |
1499 } | 1510 } |
1500 | 1511 |
1501 } // namespace net | 1512 } // namespace net |
OLD | NEW |