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 |