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
3 // found in the LICENSE file.
5 #include "content/browser/loader/sync_resource_handler.h"
7 #include "base/logging.h"
8 #include "content/browser/devtools/devtools_netlog_observer.h"
9 #include "content/browser/loader/resource_dispatcher_host_impl.h"
10 #include "content/browser/loader/resource_message_filter.h"
11 #include "content/browser/loader/resource_request_info_impl.h"
12 #include "content/common/resource_messages.h"
13 #include "content/public/browser/resource_dispatcher_host_delegate.h"
14 #include "content/public/browser/resource_request_info.h"
15 #include "net/base/io_buffer.h"
16 #include "net/http/http_response_headers.h"
17 #include "net/url_request/redirect_info.h"
21 SyncResourceHandler::SyncResourceHandler(
22 net::URLRequest
* request
,
23 IPC::Message
* result_message
,
24 ResourceDispatcherHostImpl
* resource_dispatcher_host
)
25 : ResourceHandler(request
),
26 read_buffer_(new net::IOBuffer(kReadBufSize
)),
27 result_message_(result_message
),
28 rdh_(resource_dispatcher_host
),
29 total_transfer_size_(0) {
30 result_
.final_url
= request
->url();
33 SyncResourceHandler::~SyncResourceHandler() {
34 if (result_message_
) {
35 result_message_
->set_reply_error();
36 ResourceMessageFilter
* filter
= GetFilter();
37 // If the filter doesn't exist at this point, the process has died and isn't
38 // waiting for the result message anymore.
40 filter
->Send(result_message_
);
44 bool SyncResourceHandler::OnUploadProgress(uint64 position
, uint64 size
) {
48 bool SyncResourceHandler::OnRequestRedirected(
49 const net::RedirectInfo
& redirect_info
,
50 ResourceResponse
* response
,
52 if (rdh_
->delegate()) {
53 rdh_
->delegate()->OnRequestRedirected(
54 redirect_info
.new_url
, request(), GetRequestInfo()->GetContext(),
58 DevToolsNetLogObserver::PopulateResponseInfo(request(), response
);
59 // TODO(darin): It would be much better if this could live in WebCore, but
60 // doing so requires API changes at all levels. Similar code exists in
61 // WebCore/platform/network/cf/ResourceHandleCFNet.cpp :-(
62 if (redirect_info
.new_url
.GetOrigin() != result_
.final_url
.GetOrigin()) {
63 LOG(ERROR
) << "Cross origin redirect denied";
66 result_
.final_url
= redirect_info
.new_url
;
68 total_transfer_size_
+= request()->GetTotalReceivedBytes();
72 bool SyncResourceHandler::OnResponseStarted(
73 ResourceResponse
* response
,
75 const ResourceRequestInfoImpl
* info
= GetRequestInfo();
79 if (rdh_
->delegate()) {
80 rdh_
->delegate()->OnResponseStarted(
81 request(), info
->GetContext(), response
, info
->filter());
84 DevToolsNetLogObserver::PopulateResponseInfo(request(), response
);
86 // We don't care about copying the status here.
87 result_
.headers
= response
->head
.headers
;
88 result_
.mime_type
= response
->head
.mime_type
;
89 result_
.charset
= response
->head
.charset
;
90 result_
.download_file_path
= response
->head
.download_file_path
;
91 result_
.request_time
= response
->head
.request_time
;
92 result_
.response_time
= response
->head
.response_time
;
93 result_
.load_timing
= response
->head
.load_timing
;
94 result_
.devtools_info
= response
->head
.devtools_info
;
98 bool SyncResourceHandler::OnWillStart(const GURL
& url
, bool* defer
) {
102 bool SyncResourceHandler::OnBeforeNetworkStart(const GURL
& url
, bool* defer
) {
106 bool SyncResourceHandler::OnWillRead(scoped_refptr
<net::IOBuffer
>* buf
,
109 DCHECK(min_size
== -1);
110 *buf
= read_buffer_
.get();
111 *buf_size
= kReadBufSize
;
115 bool SyncResourceHandler::OnReadCompleted(int bytes_read
, bool* defer
) {
118 result_
.data
.append(read_buffer_
->data(), bytes_read
);
122 void SyncResourceHandler::OnResponseCompleted(
123 const net::URLRequestStatus
& status
,
124 const std::string
& security_info
,
126 ResourceMessageFilter
* filter
= GetFilter();
130 result_
.error_code
= status
.error();
132 int total_transfer_size
= request()->GetTotalReceivedBytes();
133 result_
.encoded_data_length
= total_transfer_size_
+ total_transfer_size
;
135 ResourceHostMsg_SyncLoad::WriteReplyParams(result_message_
, result_
);
136 filter
->Send(result_message_
);
137 result_message_
= NULL
;
141 void SyncResourceHandler::OnDataDownloaded(int bytes_downloaded
) {
142 // Sync requests don't involve ResourceMsg_DataDownloaded messages
143 // being sent back to renderers as progress is made.
146 } // namespace content