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_dispatcher_host_impl.h" | 10 #include "content/browser/loader/resource_dispatcher_host_impl.h" |
11 #include "content/browser/loader/resource_message_filter.h" | 11 #include "content/browser/loader/resource_message_filter.h" |
12 #include "content/browser/loader/resource_request_info_impl.h" | 12 #include "content/browser/loader/resource_request_info_impl.h" |
13 #include "content/common/resource_messages.h" | 13 #include "content/common/resource_messages.h" |
| 14 #include "content/public/browser/resource_controller.h" |
14 #include "content/public/browser/resource_dispatcher_host_delegate.h" | 15 #include "content/public/browser/resource_dispatcher_host_delegate.h" |
15 #include "content/public/browser/resource_request_info.h" | 16 #include "content/public/browser/resource_request_info.h" |
16 #include "net/base/io_buffer.h" | 17 #include "net/base/io_buffer.h" |
17 #include "net/http/http_response_headers.h" | 18 #include "net/http/http_response_headers.h" |
18 #include "net/url_request/redirect_info.h" | 19 #include "net/url_request/redirect_info.h" |
19 | 20 |
20 namespace content { | 21 namespace content { |
21 | 22 |
22 SyncResourceHandler::SyncResourceHandler( | 23 SyncResourceHandler::SyncResourceHandler( |
23 net::URLRequest* request, | 24 net::URLRequest* request, |
24 const SyncLoadResultCallback& result_handler, | 25 const SyncLoadResultCallback& result_handler, |
25 ResourceDispatcherHostImpl* resource_dispatcher_host) | 26 ResourceDispatcherHostImpl* resource_dispatcher_host) |
26 : ResourceHandler(request), | 27 : ResourceHandler(request), |
27 read_buffer_(new net::IOBuffer(kReadBufSize)), | 28 read_buffer_(new net::IOBuffer(kReadBufSize)), |
28 result_handler_(result_handler), | 29 result_handler_(result_handler), |
29 rdh_(resource_dispatcher_host), | 30 rdh_(resource_dispatcher_host), |
30 total_transfer_size_(0) { | 31 total_transfer_size_(0) { |
31 result_.final_url = request->url(); | 32 result_.final_url = request->url(); |
32 } | 33 } |
33 | 34 |
34 SyncResourceHandler::~SyncResourceHandler() { | 35 SyncResourceHandler::~SyncResourceHandler() { |
35 if (result_handler_) | 36 if (result_handler_) |
36 result_handler_.Run(nullptr); | 37 result_handler_.Run(nullptr); |
37 } | 38 } |
38 | 39 |
39 bool SyncResourceHandler::OnRequestRedirected( | 40 void SyncResourceHandler::OnRequestRedirected( |
40 const net::RedirectInfo& redirect_info, | 41 const net::RedirectInfo& redirect_info, |
41 ResourceResponse* response, | 42 ResourceResponse* response, |
42 bool* defer) { | 43 std::unique_ptr<ResourceController> controller) { |
43 if (rdh_->delegate()) { | 44 if (rdh_->delegate()) { |
44 rdh_->delegate()->OnRequestRedirected( | 45 rdh_->delegate()->OnRequestRedirected( |
45 redirect_info.new_url, request(), GetRequestInfo()->GetContext(), | 46 redirect_info.new_url, request(), GetRequestInfo()->GetContext(), |
46 response); | 47 response); |
47 } | 48 } |
48 | 49 |
49 NetLogObserver::PopulateResponseInfo(request(), response); | 50 NetLogObserver::PopulateResponseInfo(request(), response); |
50 // TODO(darin): It would be much better if this could live in WebCore, but | 51 // TODO(darin): It would be much better if this could live in WebCore, but |
51 // doing so requires API changes at all levels. Similar code exists in | 52 // doing so requires API changes at all levels. Similar code exists in |
52 // WebCore/platform/network/cf/ResourceHandleCFNet.cpp :-( | 53 // WebCore/platform/network/cf/ResourceHandleCFNet.cpp :-( |
53 if (redirect_info.new_url.GetOrigin() != result_.final_url.GetOrigin()) { | 54 if (redirect_info.new_url.GetOrigin() != result_.final_url.GetOrigin()) { |
54 LOG(ERROR) << "Cross origin redirect denied"; | 55 LOG(ERROR) << "Cross origin redirect denied"; |
55 return false; | 56 controller->Cancel(); |
| 57 return; |
56 } | 58 } |
57 result_.final_url = redirect_info.new_url; | 59 result_.final_url = redirect_info.new_url; |
58 | 60 |
59 total_transfer_size_ += request()->GetTotalReceivedBytes(); | 61 total_transfer_size_ += request()->GetTotalReceivedBytes(); |
60 return true; | 62 controller->Resume(); |
61 } | 63 } |
62 | 64 |
63 bool SyncResourceHandler::OnResponseStarted( | 65 void SyncResourceHandler::OnResponseStarted( |
64 ResourceResponse* response, | 66 ResourceResponse* response, |
65 bool* defer) { | 67 std::unique_ptr<ResourceController> controller) { |
66 const ResourceRequestInfoImpl* info = GetRequestInfo(); | 68 const ResourceRequestInfoImpl* info = GetRequestInfo(); |
67 if (!info->filter()) | 69 if (!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 |