| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 // See http://dev.chromium.org/developers/design-documents/multi-process-resourc
e-loading | 5 // See http://dev.chromium.org/developers/design-documents/multi-process-resourc
e-loading |
| 6 | 6 |
| 7 #include "content/browser/renderer_host/resource_dispatcher_host.h" | 7 #include "content/browser/renderer_host/resource_dispatcher_host.h" |
| 8 | 8 |
| 9 #include <set> | 9 #include <set> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 147 return GURL(); | 147 return GURL(); |
| 148 return possible_referrer; | 148 return possible_referrer; |
| 149 } | 149 } |
| 150 | 150 |
| 151 // Consults the RendererSecurity policy to determine whether the | 151 // Consults the RendererSecurity policy to determine whether the |
| 152 // ResourceDispatcherHost should service this request. A request might be | 152 // ResourceDispatcherHost should service this request. A request might be |
| 153 // disallowed if the renderer is not authorized to retrieve the request URL or | 153 // disallowed if the renderer is not authorized to retrieve the request URL or |
| 154 // if the renderer is attempting to upload an unauthorized file. | 154 // if the renderer is attempting to upload an unauthorized file. |
| 155 bool ShouldServiceRequest(content::ProcessType process_type, | 155 bool ShouldServiceRequest(content::ProcessType process_type, |
| 156 int child_id, | 156 int child_id, |
| 157 const ResourceHostMsg_Request& request_data) { | 157 const ResourceHostMsg_Request& request_data, |
| 158 const net::URLRequestJobFactory* job_factory) { |
| 158 if (process_type == content::PROCESS_TYPE_PLUGIN) | 159 if (process_type == content::PROCESS_TYPE_PLUGIN) |
| 159 return true; | 160 return true; |
| 160 | 161 |
| 161 ChildProcessSecurityPolicy* policy = | 162 ChildProcessSecurityPolicy* policy = |
| 162 ChildProcessSecurityPolicy::GetInstance(); | 163 ChildProcessSecurityPolicy::GetInstance(); |
| 163 | 164 |
| 164 // Check if the renderer is permitted to request the requested URL. | 165 // Check if the renderer is permitted to request the requested URL. |
| 165 if (!policy->CanRequestURL(child_id, request_data.url)) { | 166 if (!policy->CanRequestURL(child_id, request_data.url, job_factory)) { |
| 166 VLOG(1) << "Denied unauthorized request for " | 167 VLOG(1) << "Denied unauthorized request for " |
| 167 << request_data.url.possibly_invalid_spec(); | 168 << request_data.url.possibly_invalid_spec(); |
| 168 return false; | 169 return false; |
| 169 } | 170 } |
| 170 | 171 |
| 171 // Check if the renderer is permitted to upload the requested files. | 172 // Check if the renderer is permitted to upload the requested files. |
| 172 if (request_data.upload_data) { | 173 if (request_data.upload_data) { |
| 173 const std::vector<net::UploadData::Element>* uploads = | 174 const std::vector<net::UploadData::Element>* uploads = |
| 174 request_data.upload_data->elements(); | 175 request_data.upload_data->elements(); |
| 175 std::vector<net::UploadData::Element>::const_iterator iter; | 176 std::vector<net::UploadData::Element>::const_iterator iter; |
| (...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 483 const content::ResourceContext& resource_context = | 484 const content::ResourceContext& resource_context = |
| 484 filter_->resource_context(); | 485 filter_->resource_context(); |
| 485 | 486 |
| 486 // Might need to resolve the blob references in the upload data. | 487 // Might need to resolve the blob references in the upload data. |
| 487 if (request_data.upload_data) { | 488 if (request_data.upload_data) { |
| 488 resource_context.blob_storage_context()->controller()-> | 489 resource_context.blob_storage_context()->controller()-> |
| 489 ResolveBlobReferencesInUploadData(request_data.upload_data.get()); | 490 ResolveBlobReferencesInUploadData(request_data.upload_data.get()); |
| 490 } | 491 } |
| 491 | 492 |
| 492 if (is_shutdown_ || | 493 if (is_shutdown_ || |
| 493 !ShouldServiceRequest(process_type, child_id, request_data)) { | 494 !ShouldServiceRequest( |
| 495 process_type, child_id, request_data, |
| 496 resource_context.request_context()->job_factory())) { |
| 494 AbortRequestBeforeItStarts(filter_, sync_result, route_id, request_id); | 497 AbortRequestBeforeItStarts(filter_, sync_result, route_id, request_id); |
| 495 return; | 498 return; |
| 496 } | 499 } |
| 497 | 500 |
| 498 const GURL referrer = MaybeStripReferrer(request_data.referrer); | 501 const GURL referrer = MaybeStripReferrer(request_data.referrer); |
| 499 | 502 |
| 500 // Allow the observer to block/handle the request. | 503 // Allow the observer to block/handle the request. |
| 501 if (delegate_ && !delegate_->ShouldBeginRequest(child_id, | 504 if (delegate_ && !delegate_->ShouldBeginRequest(child_id, |
| 502 route_id, | 505 route_id, |
| 503 request_data.method, | 506 request_data.method, |
| (...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 866 const GURL& url = request->original_url(); | 869 const GURL& url = request->original_url(); |
| 867 const net::URLRequestContext* request_context = context.request_context(); | 870 const net::URLRequestContext* request_context = context.request_context(); |
| 868 request->set_referrer(MaybeStripReferrer(GURL(request->referrer())).spec()); | 871 request->set_referrer(MaybeStripReferrer(GURL(request->referrer())).spec()); |
| 869 request->set_method("GET"); | 872 request->set_method("GET"); |
| 870 request->set_context(request_context); | 873 request->set_context(request_context); |
| 871 request->set_load_flags(request->load_flags() | | 874 request->set_load_flags(request->load_flags() | |
| 872 net::LOAD_IS_DOWNLOAD | net::LOAD_DISABLE_CACHE); | 875 net::LOAD_IS_DOWNLOAD | net::LOAD_DISABLE_CACHE); |
| 873 | 876 |
| 874 // Check if the renderer is permitted to request the requested URL. | 877 // Check if the renderer is permitted to request the requested URL. |
| 875 if (!ChildProcessSecurityPolicy::GetInstance()-> | 878 if (!ChildProcessSecurityPolicy::GetInstance()-> |
| 876 CanRequestURL(child_id, url)) { | 879 CanRequestURL(child_id, url, request_context->job_factory())) { |
| 877 VLOG(1) << "Denied unauthorized download request for " | 880 VLOG(1) << "Denied unauthorized download request for " |
| 878 << url.possibly_invalid_spec(); | 881 << url.possibly_invalid_spec(); |
| 879 if (!started_cb.is_null()) | 882 if (!started_cb.is_null()) |
| 880 started_cb.Run(DownloadId::Invalid(), net::ERR_ACCESS_DENIED); | 883 started_cb.Run(DownloadId::Invalid(), net::ERR_ACCESS_DENIED); |
| 881 return; | 884 return; |
| 882 } | 885 } |
| 883 | 886 |
| 884 request_id_--; | 887 request_id_--; |
| 885 | 888 |
| 886 DownloadId dl_id = context.download_id_factory()->GetNextId(); | 889 DownloadId dl_id = context.download_id_factory()->GetNextId(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 897 prompt_for_save_location, | 900 prompt_for_save_location, |
| 898 started_cb, | 901 started_cb, |
| 899 save_info)); | 902 save_info)); |
| 900 | 903 |
| 901 if (delegate_) { | 904 if (delegate_) { |
| 902 handler = delegate_->DownloadStarting( | 905 handler = delegate_->DownloadStarting( |
| 903 handler, context, request, child_id, route_id, request_id_, true, | 906 handler, context, request, child_id, route_id, request_id_, true, |
| 904 false); | 907 false); |
| 905 } | 908 } |
| 906 | 909 |
| 910 // FIXME(tsepez); probably redundant in face of passing job_factory to |
| 911 // ChildProcessSecurityPolicy above. |
| 907 if (!request_context->job_factory()->IsHandledURL(url)) { | 912 if (!request_context->job_factory()->IsHandledURL(url)) { |
| 908 VLOG(1) << "Download request for unsupported protocol: " | 913 VLOG(1) << "Download request for unsupported protocol: " |
| 909 << url.possibly_invalid_spec(); | 914 << url.possibly_invalid_spec(); |
| 910 if (!started_cb.is_null()) | 915 if (!started_cb.is_null()) |
| 911 started_cb.Run(DownloadId::Invalid(), net::ERR_ACCESS_DENIED); | 916 started_cb.Run(DownloadId::Invalid(), net::ERR_ACCESS_DENIED); |
| 912 return; | 917 return; |
| 913 } | 918 } |
| 914 | 919 |
| 915 ResourceDispatcherHostRequestInfo* extra_info = | 920 ResourceDispatcherHostRequestInfo* extra_info = |
| 916 CreateRequestInfo(handler, child_id, route_id, true, context); | 921 CreateRequestInfo(handler, child_id, route_id, true, context); |
| (...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1257 | 1262 |
| 1258 void ResourceDispatcherHost::OnReceivedRedirect(net::URLRequest* request, | 1263 void ResourceDispatcherHost::OnReceivedRedirect(net::URLRequest* request, |
| 1259 const GURL& new_url, | 1264 const GURL& new_url, |
| 1260 bool* defer_redirect) { | 1265 bool* defer_redirect) { |
| 1261 VLOG(1) << "OnReceivedRedirect: " << request->url().spec(); | 1266 VLOG(1) << "OnReceivedRedirect: " << request->url().spec(); |
| 1262 ResourceDispatcherHostRequestInfo* info = InfoForRequest(request); | 1267 ResourceDispatcherHostRequestInfo* info = InfoForRequest(request); |
| 1263 | 1268 |
| 1264 DCHECK(request->status().is_success()); | 1269 DCHECK(request->status().is_success()); |
| 1265 | 1270 |
| 1266 if (info->process_type() != content::PROCESS_TYPE_PLUGIN && | 1271 if (info->process_type() != content::PROCESS_TYPE_PLUGIN && |
| 1267 !ChildProcessSecurityPolicy::GetInstance()-> | 1272 !ChildProcessSecurityPolicy::GetInstance()->CanRequestURL( |
| 1268 CanRequestURL(info->child_id(), new_url)) { | 1273 info->child_id(), new_url, request->context()->job_factory())) { |
| 1269 VLOG(1) << "Denied unauthorized request for " | 1274 VLOG(1) << "Denied unauthorized request for " |
| 1270 << new_url.possibly_invalid_spec(); | 1275 << new_url.possibly_invalid_spec(); |
| 1271 | 1276 |
| 1272 // Tell the renderer that this request was disallowed. | 1277 // Tell the renderer that this request was disallowed. |
| 1273 CancelRequestInternal(request, false); | 1278 CancelRequestInternal(request, false); |
| 1274 return; | 1279 return; |
| 1275 } | 1280 } |
| 1276 | 1281 |
| 1277 NotifyReceivedRedirect(request, info->child_id(), new_url); | 1282 NotifyReceivedRedirect(request, info->child_id(), new_url); |
| 1278 | 1283 |
| (...skipping 953 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2232 | 2237 |
| 2233 void ResourceDispatcherHost::set_allow_cross_origin_auth_prompt(bool value) { | 2238 void ResourceDispatcherHost::set_allow_cross_origin_auth_prompt(bool value) { |
| 2234 allow_cross_origin_auth_prompt_ = value; | 2239 allow_cross_origin_auth_prompt_ = value; |
| 2235 } | 2240 } |
| 2236 | 2241 |
| 2237 void ResourceDispatcherHost::MarkAsTransferredNavigation( | 2242 void ResourceDispatcherHost::MarkAsTransferredNavigation( |
| 2238 const GlobalRequestID& transferred_request_id, | 2243 const GlobalRequestID& transferred_request_id, |
| 2239 net::URLRequest* ransferred_request) { | 2244 net::URLRequest* ransferred_request) { |
| 2240 transferred_navigations_[transferred_request_id] = ransferred_request; | 2245 transferred_navigations_[transferred_request_id] = ransferred_request; |
| 2241 } | 2246 } |
| OLD | NEW |