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 "net/url_request/url_request_http_job.h" | 5 #include "net/url_request/url_request_http_job.h" |
6 | 6 |
7 #include "base/base_switches.h" | 7 #include "base/base_switches.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
183 done_(false), | 183 done_(false), |
184 bytes_observed_in_packets_(0), | 184 bytes_observed_in_packets_(0), |
185 request_time_snapshot_(), | 185 request_time_snapshot_(), |
186 final_packet_time_(), | 186 final_packet_time_(), |
187 filter_context_(new HttpFilterContext(this)), | 187 filter_context_(new HttpFilterContext(this)), |
188 weak_factory_(this), | 188 weak_factory_(this), |
189 on_headers_received_callback_( | 189 on_headers_received_callback_( |
190 base::Bind(&URLRequestHttpJob::OnHeadersReceivedCallback, | 190 base::Bind(&URLRequestHttpJob::OnHeadersReceivedCallback, |
191 base::Unretained(this))), | 191 base::Unretained(this))), |
192 awaiting_callback_(false), | 192 awaiting_callback_(false), |
193 http_user_agent_settings_(http_user_agent_settings) { | 193 http_user_agent_settings_(http_user_agent_settings), |
| 194 request_(request) { |
194 URLRequestThrottlerManager* manager = request->context()->throttler_manager(); | 195 URLRequestThrottlerManager* manager = request->context()->throttler_manager(); |
195 if (manager) | 196 if (manager) |
196 throttling_entry_ = manager->RegisterRequestUrl(request->url()); | 197 throttling_entry_ = manager->RegisterRequestUrl(request->url()); |
197 | 198 |
198 ResetTimer(); | 199 ResetTimer(); |
199 } | 200 } |
200 | 201 |
201 URLRequestHttpJob::~URLRequestHttpJob() { | 202 URLRequestHttpJob::~URLRequestHttpJob() { |
202 CHECK(!awaiting_callback_); | 203 CHECK(!awaiting_callback_); |
203 | 204 |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
407 | 408 |
408 if (transaction_.get()) { | 409 if (transaction_.get()) { |
409 rv = transaction_->RestartWithAuth(auth_credentials_, start_callback_); | 410 rv = transaction_->RestartWithAuth(auth_credentials_, start_callback_); |
410 auth_credentials_ = AuthCredentials(); | 411 auth_credentials_ = AuthCredentials(); |
411 } else { | 412 } else { |
412 DCHECK(request_->context()->http_transaction_factory()); | 413 DCHECK(request_->context()->http_transaction_factory()); |
413 | 414 |
414 rv = request_->context()->http_transaction_factory()->CreateTransaction( | 415 rv = request_->context()->http_transaction_factory()->CreateTransaction( |
415 priority_, &transaction_); | 416 priority_, &transaction_); |
416 | 417 |
| 418 transaction_->SetBeforeNetworkStartCallback( |
| 419 base::Bind(&URLRequestHttpJob::NotifyBeforeNetworkStart, this)); |
| 420 |
417 if (rv == OK && request_info_.url.SchemeIsWSOrWSS()) { | 421 if (rv == OK && request_info_.url.SchemeIsWSOrWSS()) { |
418 // TODO(ricea): Implement WebSocket throttling semantics as defined in | 422 // TODO(ricea): Implement WebSocket throttling semantics as defined in |
419 // RFC6455 Section 4.1. | 423 // RFC6455 Section 4.1. |
420 base::SupportsUserData::Data* data = request_->GetUserData( | 424 base::SupportsUserData::Data* data = request_->GetUserData( |
421 WebSocketHandshakeStreamBase::CreateHelper::DataKey()); | 425 WebSocketHandshakeStreamBase::CreateHelper::DataKey()); |
422 if (data) { | 426 if (data) { |
423 transaction_->SetWebSocketHandshakeStreamCreateHelper( | 427 transaction_->SetWebSocketHandshakeStreamCreateHelper( |
424 static_cast<WebSocketHandshakeStreamBase::CreateHelper*>(data)); | 428 static_cast<WebSocketHandshakeStreamBase::CreateHelper*>(data)); |
425 } else { | 429 } else { |
426 rv = ERR_DISALLOWED_URL_SCHEME; | 430 rv = ERR_DISALLOWED_URL_SCHEME; |
(...skipping 733 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1160 return; | 1164 return; |
1161 | 1165 |
1162 // The transaction started synchronously, but we need to notify the | 1166 // The transaction started synchronously, but we need to notify the |
1163 // URLRequest delegate via the message loop. | 1167 // URLRequest delegate via the message loop. |
1164 base::MessageLoop::current()->PostTask( | 1168 base::MessageLoop::current()->PostTask( |
1165 FROM_HERE, | 1169 FROM_HERE, |
1166 base::Bind(&URLRequestHttpJob::OnStartCompleted, | 1170 base::Bind(&URLRequestHttpJob::OnStartCompleted, |
1167 weak_factory_.GetWeakPtr(), rv)); | 1171 weak_factory_.GetWeakPtr(), rv)); |
1168 } | 1172 } |
1169 | 1173 |
| 1174 void URLRequestHttpJob::ResumeNetworkStart() { |
| 1175 DCHECK(transaction_.get()); |
| 1176 transaction_->ResumeNetworkStart(); |
| 1177 } |
| 1178 |
1170 bool URLRequestHttpJob::ShouldFixMismatchedContentLength(int rv) const { | 1179 bool URLRequestHttpJob::ShouldFixMismatchedContentLength(int rv) const { |
1171 // Some servers send the body compressed, but specify the content length as | 1180 // Some servers send the body compressed, but specify the content length as |
1172 // the uncompressed size. Although this violates the HTTP spec we want to | 1181 // the uncompressed size. Although this violates the HTTP spec we want to |
1173 // support it (as IE and FireFox do), but *only* for an exact match. | 1182 // support it (as IE and FireFox do), but *only* for an exact match. |
1174 // See http://crbug.com/79694. | 1183 // See http://crbug.com/79694. |
1175 if (rv == net::ERR_CONTENT_LENGTH_MISMATCH || | 1184 if (rv == net::ERR_CONTENT_LENGTH_MISMATCH || |
1176 rv == net::ERR_INCOMPLETE_CHUNKED_ENCODING) { | 1185 rv == net::ERR_INCOMPLETE_CHUNKED_ENCODING) { |
1177 if (request_ && request_->response_headers()) { | 1186 if (request_ && request_->response_headers()) { |
1178 int64 expected_length = request_->response_headers()->GetContentLength(); | 1187 int64 expected_length = request_->response_headers()->GetContentLength(); |
1179 VLOG(1) << __FUNCTION__ << "() " | 1188 VLOG(1) << __FUNCTION__ << "() " |
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1446 return override_response_headers_.get() ? | 1455 return override_response_headers_.get() ? |
1447 override_response_headers_.get() : | 1456 override_response_headers_.get() : |
1448 transaction_->GetResponseInfo()->headers.get(); | 1457 transaction_->GetResponseInfo()->headers.get(); |
1449 } | 1458 } |
1450 | 1459 |
1451 void URLRequestHttpJob::NotifyURLRequestDestroyed() { | 1460 void URLRequestHttpJob::NotifyURLRequestDestroyed() { |
1452 awaiting_callback_ = false; | 1461 awaiting_callback_ = false; |
1453 } | 1462 } |
1454 | 1463 |
1455 } // namespace net | 1464 } // namespace net |
OLD | NEW |