| 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/logging.h" | 7 #include "base/logging.h" |
| 8 #include "content/browser/devtools/devtools_netlog_observer.h" | 8 #include "content/browser/devtools/devtools_netlog_observer.h" |
| 9 #include "content/browser/loader/resource_dispatcher_host_impl.h" | 9 #include "content/browser/loader/resource_dispatcher_host_impl.h" |
| 10 #include "content/browser/loader/resource_message_filter.h" | 10 #include "content/browser/loader/resource_message_filter.h" |
| 11 #include "content/browser/loader/resource_request_info_impl.h" | 11 #include "content/browser/loader/resource_request_info_impl.h" |
| 12 #include "content/common/resource_messages.h" | 12 #include "content/common/resource_messages.h" |
| 13 #include "content/public/browser/global_request_id.h" | 13 #include "content/public/browser/global_request_id.h" |
| 14 #include "content/public/browser/resource_dispatcher_host_delegate.h" | 14 #include "content/public/browser/resource_dispatcher_host_delegate.h" |
| 15 #include "content/public/browser/resource_request_info.h" | 15 #include "content/public/browser/resource_request_info.h" |
| 16 #include "net/base/io_buffer.h" | 16 #include "net/base/io_buffer.h" |
| 17 #include "net/http/http_response_headers.h" | 17 #include "net/http/http_response_headers.h" |
| 18 | 18 |
| 19 namespace content { | 19 namespace content { |
| 20 | 20 |
| 21 SyncResourceHandler::SyncResourceHandler( | 21 SyncResourceHandler::SyncResourceHandler( |
| 22 net::URLRequest* request, | 22 net::URLRequest* request, |
| 23 IPC::Message* result_message, | 23 IPC::Message* result_message, |
| 24 ResourceDispatcherHostImpl* resource_dispatcher_host) | 24 ResourceDispatcherHostImpl* resource_dispatcher_host) |
| 25 : ResourceHandler(request), | 25 : read_buffer_(new net::IOBuffer(kReadBufSize)), |
| 26 read_buffer_(new net::IOBuffer(kReadBufSize)), | 26 request_(request), |
| 27 result_message_(result_message), | 27 result_message_(result_message), |
| 28 rdh_(resource_dispatcher_host) { | 28 rdh_(resource_dispatcher_host) { |
| 29 result_.final_url = request->url(); | 29 result_.final_url = request_->url(); |
| 30 } | 30 } |
| 31 | 31 |
| 32 SyncResourceHandler::~SyncResourceHandler() { | 32 SyncResourceHandler::~SyncResourceHandler() { |
| 33 if (result_message_) { | 33 if (result_message_) { |
| 34 result_message_->set_reply_error(); | 34 result_message_->set_reply_error(); |
| 35 ResourceMessageFilter* filter = GetFilter(); | 35 const ResourceRequestInfoImpl* info = |
| 36 ResourceRequestInfoImpl::ForRequest(request_); |
| 36 // If the filter doesn't exist at this point, the process has died and isn't | 37 // If the filter doesn't exist at this point, the process has died and isn't |
| 37 // waiting for the result message anymore. | 38 // waiting for the result message anymore. |
| 38 if (filter) | 39 if (info->filter()) |
| 39 filter->Send(result_message_); | 40 info->filter()->Send(result_message_); |
| 40 } | 41 } |
| 41 } | 42 } |
| 42 | 43 |
| 43 bool SyncResourceHandler::OnUploadProgress(int request_id, | 44 bool SyncResourceHandler::OnUploadProgress(int request_id, |
| 44 uint64 position, | 45 uint64 position, |
| 45 uint64 size) { | 46 uint64 size) { |
| 46 return true; | 47 return true; |
| 47 } | 48 } |
| 48 | 49 |
| 49 bool SyncResourceHandler::OnRequestRedirected( | 50 bool SyncResourceHandler::OnRequestRedirected( |
| 50 int request_id, | 51 int request_id, |
| 51 const GURL& new_url, | 52 const GURL& new_url, |
| 52 ResourceResponse* response, | 53 ResourceResponse* response, |
| 53 bool* defer) { | 54 bool* defer) { |
| 54 if (rdh_->delegate()) { | 55 if (rdh_->delegate()) { |
| 56 const ResourceRequestInfoImpl* info = |
| 57 ResourceRequestInfoImpl::ForRequest(request_); |
| 55 rdh_->delegate()->OnRequestRedirected( | 58 rdh_->delegate()->OnRequestRedirected( |
| 56 new_url, request(), GetRequestInfo()->GetContext(), response); | 59 new_url, request_, info->GetContext(), response); |
| 57 } | 60 } |
| 58 | 61 |
| 59 DevToolsNetLogObserver::PopulateResponseInfo(request(), response); | 62 DevToolsNetLogObserver::PopulateResponseInfo(request_, response); |
| 60 // TODO(darin): It would be much better if this could live in WebCore, but | 63 // TODO(darin): It would be much better if this could live in WebCore, but |
| 61 // doing so requires API changes at all levels. Similar code exists in | 64 // doing so requires API changes at all levels. Similar code exists in |
| 62 // WebCore/platform/network/cf/ResourceHandleCFNet.cpp :-( | 65 // WebCore/platform/network/cf/ResourceHandleCFNet.cpp :-( |
| 63 if (new_url.GetOrigin() != result_.final_url.GetOrigin()) { | 66 if (new_url.GetOrigin() != result_.final_url.GetOrigin()) { |
| 64 LOG(ERROR) << "Cross origin redirect denied"; | 67 LOG(ERROR) << "Cross origin redirect denied"; |
| 65 return false; | 68 return false; |
| 66 } | 69 } |
| 67 result_.final_url = new_url; | 70 result_.final_url = new_url; |
| 68 return true; | 71 return true; |
| 69 } | 72 } |
| 70 | 73 |
| 71 bool SyncResourceHandler::OnResponseStarted( | 74 bool SyncResourceHandler::OnResponseStarted( |
| 72 int request_id, | 75 int request_id, |
| 73 ResourceResponse* response, | 76 ResourceResponse* response, |
| 74 bool* defer) { | 77 bool* defer) { |
| 75 const ResourceRequestInfoImpl* info = GetRequestInfo(); | 78 const ResourceRequestInfoImpl* info = |
| 79 ResourceRequestInfoImpl::ForRequest(request_); |
| 76 if (!info->filter()) | 80 if (!info->filter()) |
| 77 return false; | 81 return false; |
| 78 | 82 |
| 79 if (rdh_->delegate()) { | 83 if (rdh_->delegate()) { |
| 80 rdh_->delegate()->OnResponseStarted( | 84 rdh_->delegate()->OnResponseStarted( |
| 81 request(), info->GetContext(), response, info->filter()); | 85 request_, info->GetContext(), response, info->filter()); |
| 82 } | 86 } |
| 83 | 87 |
| 84 DevToolsNetLogObserver::PopulateResponseInfo(request(), response); | 88 DevToolsNetLogObserver::PopulateResponseInfo(request_, response); |
| 85 | 89 |
| 86 // We don't care about copying the status here. | 90 // We don't care about copying the status here. |
| 87 result_.headers = response->head.headers; | 91 result_.headers = response->head.headers; |
| 88 result_.mime_type = response->head.mime_type; | 92 result_.mime_type = response->head.mime_type; |
| 89 result_.charset = response->head.charset; | 93 result_.charset = response->head.charset; |
| 90 result_.download_file_path = response->head.download_file_path; | 94 result_.download_file_path = response->head.download_file_path; |
| 91 result_.request_time = response->head.request_time; | 95 result_.request_time = response->head.request_time; |
| 92 result_.response_time = response->head.response_time; | 96 result_.response_time = response->head.response_time; |
| 93 result_.load_timing = response->head.load_timing; | 97 result_.load_timing = response->head.load_timing; |
| 94 result_.devtools_info = response->head.devtools_info; | 98 result_.devtools_info = response->head.devtools_info; |
| 95 return true; | 99 return true; |
| 96 } | 100 } |
| 97 | 101 |
| 98 bool SyncResourceHandler::OnWillStart(int request_id, | 102 bool SyncResourceHandler::OnWillStart(int request_id, |
| 99 const GURL& url, | 103 const GURL& url, |
| 100 bool* defer) { | 104 bool* defer) { |
| 101 return true; | 105 return true; |
| 102 } | 106 } |
| 103 | 107 |
| 104 bool SyncResourceHandler::OnWillRead(int request_id, | 108 bool SyncResourceHandler::OnWillRead(int request_id, net::IOBuffer** buf, |
| 105 scoped_refptr<net::IOBuffer>* buf, | 109 int* buf_size, int min_size) { |
| 106 int* buf_size, | |
| 107 int min_size) { | |
| 108 DCHECK(min_size == -1); | 110 DCHECK(min_size == -1); |
| 109 *buf = read_buffer_.get(); | 111 *buf = read_buffer_.get(); |
| 110 *buf_size = kReadBufSize; | 112 *buf_size = kReadBufSize; |
| 111 return true; | 113 return true; |
| 112 } | 114 } |
| 113 | 115 |
| 114 bool SyncResourceHandler::OnReadCompleted(int request_id, int bytes_read, | 116 bool SyncResourceHandler::OnReadCompleted(int request_id, int bytes_read, |
| 115 bool* defer) { | 117 bool* defer) { |
| 116 if (!bytes_read) | 118 if (!bytes_read) |
| 117 return true; | 119 return true; |
| 118 result_.data.append(read_buffer_->data(), bytes_read); | 120 result_.data.append(read_buffer_->data(), bytes_read); |
| 119 return true; | 121 return true; |
| 120 } | 122 } |
| 121 | 123 |
| 122 bool SyncResourceHandler::OnResponseCompleted( | 124 bool SyncResourceHandler::OnResponseCompleted( |
| 123 int request_id, | 125 int request_id, |
| 124 const net::URLRequestStatus& status, | 126 const net::URLRequestStatus& status, |
| 125 const std::string& security_info) { | 127 const std::string& security_info) { |
| 126 ResourceMessageFilter* filter = GetFilter(); | 128 const ResourceRequestInfoImpl* info = |
| 127 if (!filter) | 129 ResourceRequestInfoImpl::ForRequest(request_); |
| 130 if (!info->filter()) |
| 128 return false; | 131 return false; |
| 129 | 132 |
| 130 result_.error_code = status.error(); | 133 result_.error_code = status.error(); |
| 131 | 134 |
| 132 result_.encoded_data_length = | 135 result_.encoded_data_length = |
| 133 DevToolsNetLogObserver::GetAndResetEncodedDataLength(request()); | 136 DevToolsNetLogObserver::GetAndResetEncodedDataLength(request_); |
| 134 | 137 |
| 135 ResourceHostMsg_SyncLoad::WriteReplyParams(result_message_, result_); | 138 ResourceHostMsg_SyncLoad::WriteReplyParams(result_message_, result_); |
| 136 filter->Send(result_message_); | 139 info->filter()->Send(result_message_); |
| 137 result_message_ = NULL; | 140 result_message_ = NULL; |
| 138 return true; | 141 return true; |
| 139 } | 142 } |
| 140 | 143 |
| 141 void SyncResourceHandler::OnDataDownloaded( | 144 void SyncResourceHandler::OnDataDownloaded( |
| 142 int request_id, | 145 int request_id, |
| 143 int bytes_downloaded) { | 146 int bytes_downloaded) { |
| 144 // Sync requests don't involve ResourceMsg_DataDownloaded messages | 147 // Sync requests don't involve ResourceMsg_DataDownloaded messages |
| 145 // being sent back to renderers as progress is made. | 148 // being sent back to renderers as progress is made. |
| 146 } | 149 } |
| 147 | 150 |
| 148 } // namespace content | 151 } // namespace content |
| OLD | NEW |