| 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 "content/browser/loader/sync_resource_handler.h" | 5 #include "content/browser/loader/sync_resource_handler.h" |
| 6 | 6 |
| 7 #include "base/callback_helpers.h" | 7 #include "base/callback_helpers.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "content/browser/loader/netlog_observer.h" | 9 #include "content/browser/loader/netlog_observer.h" |
| 10 #include "content/browser/loader/resource_controller.h" |
| 10 #include "content/browser/loader/resource_dispatcher_host_impl.h" | 11 #include "content/browser/loader/resource_dispatcher_host_impl.h" |
| 11 #include "content/browser/loader/resource_request_info_impl.h" | 12 #include "content/browser/loader/resource_request_info_impl.h" |
| 12 #include "content/common/resource_messages.h" | 13 #include "content/common/resource_messages.h" |
| 13 #include "content/public/browser/resource_dispatcher_host_delegate.h" | 14 #include "content/public/browser/resource_dispatcher_host_delegate.h" |
| 14 #include "content/public/browser/resource_request_info.h" | 15 #include "content/public/browser/resource_request_info.h" |
| 15 #include "net/base/io_buffer.h" | 16 #include "net/base/io_buffer.h" |
| 16 #include "net/http/http_response_headers.h" | 17 #include "net/http/http_response_headers.h" |
| 17 #include "net/url_request/redirect_info.h" | 18 #include "net/url_request/redirect_info.h" |
| 18 | 19 |
| 19 namespace content { | 20 namespace content { |
| 20 | 21 |
| 21 SyncResourceHandler::SyncResourceHandler( | 22 SyncResourceHandler::SyncResourceHandler( |
| 22 net::URLRequest* request, | 23 net::URLRequest* request, |
| 23 const SyncLoadResultCallback& result_handler, | 24 const SyncLoadResultCallback& result_handler, |
| 24 ResourceDispatcherHostImpl* resource_dispatcher_host) | 25 ResourceDispatcherHostImpl* resource_dispatcher_host) |
| 25 : ResourceHandler(request), | 26 : ResourceHandler(request), |
| 26 read_buffer_(new net::IOBuffer(kReadBufSize)), | 27 read_buffer_(new net::IOBuffer(kReadBufSize)), |
| 27 result_handler_(result_handler), | 28 result_handler_(result_handler), |
| 28 rdh_(resource_dispatcher_host), | 29 rdh_(resource_dispatcher_host), |
| 29 total_transfer_size_(0) { | 30 total_transfer_size_(0) { |
| 30 result_.final_url = request->url(); | 31 result_.final_url = request->url(); |
| 31 } | 32 } |
| 32 | 33 |
| 33 SyncResourceHandler::~SyncResourceHandler() { | 34 SyncResourceHandler::~SyncResourceHandler() { |
| 34 if (result_handler_) | 35 if (result_handler_) |
| 35 result_handler_.Run(nullptr); | 36 result_handler_.Run(nullptr); |
| 36 } | 37 } |
| 37 | 38 |
| 38 bool SyncResourceHandler::OnRequestRedirected( | 39 void SyncResourceHandler::OnRequestRedirected( |
| 39 const net::RedirectInfo& redirect_info, | 40 const net::RedirectInfo& redirect_info, |
| 40 ResourceResponse* response, | 41 ResourceResponse* response, |
| 41 bool* defer) { | 42 std::unique_ptr<ResourceController> controller) { |
| 42 if (rdh_->delegate()) { | 43 if (rdh_->delegate()) { |
| 43 rdh_->delegate()->OnRequestRedirected( | 44 rdh_->delegate()->OnRequestRedirected( |
| 44 redirect_info.new_url, request(), GetRequestInfo()->GetContext(), | 45 redirect_info.new_url, request(), GetRequestInfo()->GetContext(), |
| 45 response); | 46 response); |
| 46 } | 47 } |
| 47 | 48 |
| 48 NetLogObserver::PopulateResponseInfo(request(), response); | 49 NetLogObserver::PopulateResponseInfo(request(), response); |
| 49 // TODO(darin): It would be much better if this could live in WebCore, but | 50 // TODO(darin): It would be much better if this could live in WebCore, but |
| 50 // doing so requires API changes at all levels. Similar code exists in | 51 // doing so requires API changes at all levels. Similar code exists in |
| 51 // WebCore/platform/network/cf/ResourceHandleCFNet.cpp :-( | 52 // WebCore/platform/network/cf/ResourceHandleCFNet.cpp :-( |
| 52 if (redirect_info.new_url.GetOrigin() != result_.final_url.GetOrigin()) { | 53 if (redirect_info.new_url.GetOrigin() != result_.final_url.GetOrigin()) { |
| 53 LOG(ERROR) << "Cross origin redirect denied"; | 54 LOG(ERROR) << "Cross origin redirect denied"; |
| 54 return false; | 55 controller->Cancel(); |
| 56 return; |
| 55 } | 57 } |
| 56 result_.final_url = redirect_info.new_url; | 58 result_.final_url = redirect_info.new_url; |
| 57 | 59 |
| 58 total_transfer_size_ += request()->GetTotalReceivedBytes(); | 60 total_transfer_size_ += request()->GetTotalReceivedBytes(); |
| 59 return true; | 61 controller->Resume(); |
| 60 } | 62 } |
| 61 | 63 |
| 62 bool SyncResourceHandler::OnResponseStarted( | 64 void SyncResourceHandler::OnResponseStarted( |
| 63 ResourceResponse* response, | 65 ResourceResponse* response, |
| 64 bool* defer) { | 66 std::unique_ptr<ResourceController> controller) { |
| 65 ResourceRequestInfoImpl* info = GetRequestInfo(); | 67 ResourceRequestInfoImpl* info = GetRequestInfo(); |
| 66 DCHECK(info->requester_info()->IsRenderer()); | 68 DCHECK(info->requester_info()->IsRenderer()); |
| 67 if (!info->requester_info()->filter()) | 69 if (!info->requester_info()->filter()) { |
| 68 return false; | 70 controller->Cancel(); |
| 71 return; |
| 72 } |
| 69 | 73 |
| 70 if (rdh_->delegate()) { | 74 if (rdh_->delegate()) { |
| 71 rdh_->delegate()->OnResponseStarted(request(), info->GetContext(), | 75 rdh_->delegate()->OnResponseStarted(request(), info->GetContext(), |
| 72 response); | 76 response); |
| 73 } | 77 } |
| 74 | 78 |
| 75 NetLogObserver::PopulateResponseInfo(request(), response); | 79 NetLogObserver::PopulateResponseInfo(request(), response); |
| 76 | 80 |
| 77 // We don't care about copying the status here. | 81 // We don't care about copying the status here. |
| 78 result_.headers = response->head.headers; | 82 result_.headers = response->head.headers; |
| 79 result_.mime_type = response->head.mime_type; | 83 result_.mime_type = response->head.mime_type; |
| 80 result_.charset = response->head.charset; | 84 result_.charset = response->head.charset; |
| 81 result_.download_file_path = response->head.download_file_path; | 85 result_.download_file_path = response->head.download_file_path; |
| 82 result_.request_time = response->head.request_time; | 86 result_.request_time = response->head.request_time; |
| 83 result_.response_time = response->head.response_time; | 87 result_.response_time = response->head.response_time; |
| 84 result_.load_timing = response->head.load_timing; | 88 result_.load_timing = response->head.load_timing; |
| 85 result_.devtools_info = response->head.devtools_info; | 89 result_.devtools_info = response->head.devtools_info; |
| 86 return true; | 90 controller->Resume(); |
| 87 } | 91 } |
| 88 | 92 |
| 89 bool SyncResourceHandler::OnWillStart(const GURL& url, bool* defer) { | 93 void SyncResourceHandler::OnWillStart( |
| 90 return true; | 94 const GURL& url, |
| 95 std::unique_ptr<ResourceController> controller) { |
| 96 controller->Resume(); |
| 91 } | 97 } |
| 92 | 98 |
| 93 bool SyncResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf, | 99 bool SyncResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf, |
| 94 int* buf_size, | 100 int* buf_size, |
| 95 int min_size) { | 101 int min_size) { |
| 96 DCHECK(min_size == -1); | 102 DCHECK(min_size == -1); |
| 97 *buf = read_buffer_.get(); | 103 *buf = read_buffer_.get(); |
| 98 *buf_size = kReadBufSize; | 104 *buf_size = kReadBufSize; |
| 99 return true; | 105 return true; |
| 100 } | 106 } |
| 101 | 107 |
| 102 bool SyncResourceHandler::OnReadCompleted(int bytes_read, bool* defer) { | 108 void SyncResourceHandler::OnReadCompleted( |
| 103 if (!bytes_read) | 109 int bytes_read, |
| 104 return true; | 110 std::unique_ptr<ResourceController> controller) { |
| 105 result_.data.append(read_buffer_->data(), bytes_read); | 111 if (bytes_read) |
| 106 return true; | 112 result_.data.append(read_buffer_->data(), bytes_read); |
| 113 controller->Resume(); |
| 107 } | 114 } |
| 108 | 115 |
| 109 void SyncResourceHandler::OnResponseCompleted( | 116 void SyncResourceHandler::OnResponseCompleted( |
| 110 const net::URLRequestStatus& status, | 117 const net::URLRequestStatus& status, |
| 111 bool* defer) { | 118 std::unique_ptr<ResourceController> controller) { |
| 112 result_.error_code = status.error(); | 119 result_.error_code = status.error(); |
| 113 | 120 |
| 114 int total_transfer_size = request()->GetTotalReceivedBytes(); | 121 int total_transfer_size = request()->GetTotalReceivedBytes(); |
| 115 result_.encoded_data_length = total_transfer_size_ + total_transfer_size; | 122 result_.encoded_data_length = total_transfer_size_ + total_transfer_size; |
| 116 result_.encoded_body_length = request()->GetRawBodyBytes(); | 123 result_.encoded_body_length = request()->GetRawBodyBytes(); |
| 117 | 124 |
| 118 base::ResetAndReturn(&result_handler_).Run(&result_); | 125 base::ResetAndReturn(&result_handler_).Run(&result_); |
| 126 |
| 127 controller->Resume(); |
| 119 } | 128 } |
| 120 | 129 |
| 121 void SyncResourceHandler::OnDataDownloaded(int bytes_downloaded) { | 130 void SyncResourceHandler::OnDataDownloaded(int bytes_downloaded) { |
| 122 // Sync requests don't involve ResourceMsg_DataDownloaded messages | 131 // Sync requests don't involve ResourceMsg_DataDownloaded messages |
| 123 // being sent back to renderers as progress is made. | 132 // being sent back to renderers as progress is made. |
| 124 } | 133 } |
| 125 | 134 |
| 126 } // namespace content | 135 } // namespace content |
| OLD | NEW |