Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(318)

Side by Side Diff: net/http/http_network_transaction.cc

Issue 122453002: Allows deferral of a URLRequest just before talking to the network, at (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Formatting nits Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/http/http_network_transaction.h" 5 #include "net/http/http_network_transaction.h"
6 6
7 #include <set> 7 #include <set>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 server_ssl_config_.rev_checking_enabled = false; 191 server_ssl_config_.rev_checking_enabled = false;
192 proxy_ssl_config_.rev_checking_enabled = false; 192 proxy_ssl_config_.rev_checking_enabled = false;
193 } 193 }
194 194
195 // Channel ID is enabled unless --disable-tls-channel-id flag is set, 195 // Channel ID is enabled unless --disable-tls-channel-id flag is set,
196 // or if privacy mode is enabled. 196 // or if privacy mode is enabled.
197 bool channel_id_enabled = server_ssl_config_.channel_id_enabled && 197 bool channel_id_enabled = server_ssl_config_.channel_id_enabled &&
198 (request_->privacy_mode == kPrivacyModeDisabled); 198 (request_->privacy_mode == kPrivacyModeDisabled);
199 server_ssl_config_.channel_id_enabled = channel_id_enabled; 199 server_ssl_config_.channel_id_enabled = channel_id_enabled;
200 200
201 next_state_ = STATE_CREATE_STREAM; 201 next_state_ = STATE_NOTIFY_BEFORE_CREATE_STREAM;
202 int rv = DoLoop(OK); 202 int rv = DoLoop(OK);
203 if (rv == ERR_IO_PENDING) 203 if (rv == ERR_IO_PENDING)
204 callback_ = callback; 204 callback_ = callback;
205 return rv; 205 return rv;
206 } 206 }
207 207
208 int HttpNetworkTransaction::RestartIgnoringLastError( 208 int HttpNetworkTransaction::RestartIgnoringLastError(
209 const CompletionCallback& callback) { 209 const CompletionCallback& callback) {
210 DCHECK(!stream_.get()); 210 DCHECK(!stream_.get());
211 DCHECK(!stream_request_.get()); 211 DCHECK(!stream_request_.get());
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
397 return ((headers_valid_ && response_.headers.get()) || 397 return ((headers_valid_ && response_.headers.get()) ||
398 response_.ssl_info.cert.get() || response_.cert_request_info.get()) 398 response_.ssl_info.cert.get() || response_.cert_request_info.get())
399 ? &response_ 399 ? &response_
400 : NULL; 400 : NULL;
401 } 401 }
402 402
403 LoadState HttpNetworkTransaction::GetLoadState() const { 403 LoadState HttpNetworkTransaction::GetLoadState() const {
404 // TODO(wtc): Define a new LoadState value for the 404 // TODO(wtc): Define a new LoadState value for the
405 // STATE_INIT_CONNECTION_COMPLETE state, which delays the HTTP request. 405 // STATE_INIT_CONNECTION_COMPLETE state, which delays the HTTP request.
406 switch (next_state_) { 406 switch (next_state_) {
407 case STATE_CREATE_STREAM:
408 return LOAD_STATE_WAITING_FOR_DELEGATE;
407 case STATE_CREATE_STREAM_COMPLETE: 409 case STATE_CREATE_STREAM_COMPLETE:
408 return stream_request_->GetLoadState(); 410 return stream_request_->GetLoadState();
409 case STATE_GENERATE_PROXY_AUTH_TOKEN_COMPLETE: 411 case STATE_GENERATE_PROXY_AUTH_TOKEN_COMPLETE:
410 case STATE_GENERATE_SERVER_AUTH_TOKEN_COMPLETE: 412 case STATE_GENERATE_SERVER_AUTH_TOKEN_COMPLETE:
411 case STATE_SEND_REQUEST_COMPLETE: 413 case STATE_SEND_REQUEST_COMPLETE:
412 return LOAD_STATE_SENDING_REQUEST; 414 return LOAD_STATE_SENDING_REQUEST;
413 case STATE_READ_HEADERS_COMPLETE: 415 case STATE_READ_HEADERS_COMPLETE:
414 return LOAD_STATE_WAITING_FOR_RESPONSE; 416 return LOAD_STATE_WAITING_FOR_RESPONSE;
415 case STATE_READ_BODY_COMPLETE: 417 case STATE_READ_BODY_COMPLETE:
416 return LOAD_STATE_READING_RESPONSE; 418 return LOAD_STATE_READING_RESPONSE;
(...skipping 29 matching lines...) Expand all
446 stream_request_->SetPriority(priority); 448 stream_request_->SetPriority(priority);
447 if (stream_) 449 if (stream_)
448 stream_->SetPriority(priority); 450 stream_->SetPriority(priority);
449 } 451 }
450 452
451 void HttpNetworkTransaction::SetWebSocketHandshakeStreamCreateHelper( 453 void HttpNetworkTransaction::SetWebSocketHandshakeStreamCreateHelper(
452 WebSocketHandshakeStreamBase::CreateHelper* create_helper) { 454 WebSocketHandshakeStreamBase::CreateHelper* create_helper) {
453 websocket_handshake_stream_base_create_helper_ = create_helper; 455 websocket_handshake_stream_base_create_helper_ = create_helper;
454 } 456 }
455 457
458 void HttpNetworkTransaction::SetBeforeNetworkStartCallback(
459 const base::Callback<void(bool*)>& callback) {
460 before_network_start_callback_ = callback;
461 }
462
463 int HttpNetworkTransaction::ResumeNetworkStart() {
464 DCHECK_EQ(next_state_, STATE_CREATE_STREAM);
465 return DoLoop(OK);
466 }
467
456 void HttpNetworkTransaction::OnStreamReady(const SSLConfig& used_ssl_config, 468 void HttpNetworkTransaction::OnStreamReady(const SSLConfig& used_ssl_config,
457 const ProxyInfo& used_proxy_info, 469 const ProxyInfo& used_proxy_info,
458 HttpStreamBase* stream) { 470 HttpStreamBase* stream) {
459 DCHECK_EQ(STATE_CREATE_STREAM_COMPLETE, next_state_); 471 DCHECK_EQ(STATE_CREATE_STREAM_COMPLETE, next_state_);
460 DCHECK(stream_request_.get()); 472 DCHECK(stream_request_.get());
461 473
462 if (stream_) 474 if (stream_)
463 total_received_bytes_ += stream_->GetTotalReceivedBytes(); 475 total_received_bytes_ += stream_->GetTotalReceivedBytes();
464 stream_.reset(stream); 476 stream_.reset(stream);
465 server_ssl_config_ = used_ssl_config; 477 server_ssl_config_ = used_ssl_config;
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
582 } 594 }
583 595
584 int HttpNetworkTransaction::DoLoop(int result) { 596 int HttpNetworkTransaction::DoLoop(int result) {
585 DCHECK(next_state_ != STATE_NONE); 597 DCHECK(next_state_ != STATE_NONE);
586 598
587 int rv = result; 599 int rv = result;
588 do { 600 do {
589 State state = next_state_; 601 State state = next_state_;
590 next_state_ = STATE_NONE; 602 next_state_ = STATE_NONE;
591 switch (state) { 603 switch (state) {
604 case STATE_NOTIFY_BEFORE_CREATE_STREAM:
605 DCHECK_EQ(OK, rv);
606 rv = DoNotifyBeforeCreateStream();
607 break;
592 case STATE_CREATE_STREAM: 608 case STATE_CREATE_STREAM:
593 DCHECK_EQ(OK, rv); 609 DCHECK_EQ(OK, rv);
594 rv = DoCreateStream(); 610 rv = DoCreateStream();
595 break; 611 break;
596 case STATE_CREATE_STREAM_COMPLETE: 612 case STATE_CREATE_STREAM_COMPLETE:
597 rv = DoCreateStreamComplete(rv); 613 rv = DoCreateStreamComplete(rv);
598 break; 614 break;
599 case STATE_INIT_STREAM: 615 case STATE_INIT_STREAM:
600 DCHECK_EQ(OK, rv); 616 DCHECK_EQ(OK, rv);
601 rv = DoInitStream(); 617 rv = DoInitStream();
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 default: 691 default:
676 NOTREACHED() << "bad state"; 692 NOTREACHED() << "bad state";
677 rv = ERR_FAILED; 693 rv = ERR_FAILED;
678 break; 694 break;
679 } 695 }
680 } while (rv != ERR_IO_PENDING && next_state_ != STATE_NONE); 696 } while (rv != ERR_IO_PENDING && next_state_ != STATE_NONE);
681 697
682 return rv; 698 return rv;
683 } 699 }
684 700
701 int HttpNetworkTransaction::DoNotifyBeforeCreateStream() {
702 next_state_ = STATE_CREATE_STREAM;
703 bool defer = false;
704 if (!before_network_start_callback_.is_null())
705 before_network_start_callback_.Run(&defer);
706 if (!defer)
707 return DoLoop(OK);
mmenke 2014/01/07 15:26:23 This should just return OK, since we're already in
jkarlin 2014/01/07 16:19:32 Done.
708 return ERR_IO_PENDING;
709 }
710
685 int HttpNetworkTransaction::DoCreateStream() { 711 int HttpNetworkTransaction::DoCreateStream() {
686 next_state_ = STATE_CREATE_STREAM_COMPLETE; 712 next_state_ = STATE_CREATE_STREAM_COMPLETE;
687
688 if (ForWebSocketHandshake()) { 713 if (ForWebSocketHandshake()) {
689 stream_request_.reset( 714 stream_request_.reset(
690 session_->http_stream_factory_for_websocket() 715 session_->http_stream_factory_for_websocket()
691 ->RequestWebSocketHandshakeStream( 716 ->RequestWebSocketHandshakeStream(
692 *request_, 717 *request_,
693 priority_, 718 priority_,
694 server_ssl_config_, 719 server_ssl_config_,
695 proxy_ssl_config_, 720 proxy_ssl_config_,
696 this, 721 this,
697 websocket_handshake_stream_base_create_helper_, 722 websocket_handshake_stream_base_create_helper_,
(...skipping 863 matching lines...) Expand 10 before | Expand all | Expand 10 after
1561 } 1586 }
1562 1587
1563 #define STATE_CASE(s) \ 1588 #define STATE_CASE(s) \
1564 case s: \ 1589 case s: \
1565 description = base::StringPrintf("%s (0x%08X)", #s, s); \ 1590 description = base::StringPrintf("%s (0x%08X)", #s, s); \
1566 break 1591 break
1567 1592
1568 std::string HttpNetworkTransaction::DescribeState(State state) { 1593 std::string HttpNetworkTransaction::DescribeState(State state) {
1569 std::string description; 1594 std::string description;
1570 switch (state) { 1595 switch (state) {
1596 STATE_CASE(STATE_NOTIFY_BEFORE_CREATE_STREAM);
1571 STATE_CASE(STATE_CREATE_STREAM); 1597 STATE_CASE(STATE_CREATE_STREAM);
1572 STATE_CASE(STATE_CREATE_STREAM_COMPLETE); 1598 STATE_CASE(STATE_CREATE_STREAM_COMPLETE);
1573 STATE_CASE(STATE_INIT_REQUEST_BODY); 1599 STATE_CASE(STATE_INIT_REQUEST_BODY);
1574 STATE_CASE(STATE_INIT_REQUEST_BODY_COMPLETE); 1600 STATE_CASE(STATE_INIT_REQUEST_BODY_COMPLETE);
1575 STATE_CASE(STATE_BUILD_REQUEST); 1601 STATE_CASE(STATE_BUILD_REQUEST);
1576 STATE_CASE(STATE_BUILD_REQUEST_COMPLETE); 1602 STATE_CASE(STATE_BUILD_REQUEST_COMPLETE);
1577 STATE_CASE(STATE_SEND_REQUEST); 1603 STATE_CASE(STATE_SEND_REQUEST);
1578 STATE_CASE(STATE_SEND_REQUEST_COMPLETE); 1604 STATE_CASE(STATE_SEND_REQUEST_COMPLETE);
1579 STATE_CASE(STATE_READ_HEADERS); 1605 STATE_CASE(STATE_READ_HEADERS);
1580 STATE_CASE(STATE_READ_HEADERS_COMPLETE); 1606 STATE_CASE(STATE_READ_HEADERS_COMPLETE);
1581 STATE_CASE(STATE_READ_BODY); 1607 STATE_CASE(STATE_READ_BODY);
1582 STATE_CASE(STATE_READ_BODY_COMPLETE); 1608 STATE_CASE(STATE_READ_BODY_COMPLETE);
1583 STATE_CASE(STATE_DRAIN_BODY_FOR_AUTH_RESTART); 1609 STATE_CASE(STATE_DRAIN_BODY_FOR_AUTH_RESTART);
1584 STATE_CASE(STATE_DRAIN_BODY_FOR_AUTH_RESTART_COMPLETE); 1610 STATE_CASE(STATE_DRAIN_BODY_FOR_AUTH_RESTART_COMPLETE);
1585 STATE_CASE(STATE_NONE); 1611 STATE_CASE(STATE_NONE);
1586 default: 1612 default:
1587 description = base::StringPrintf("Unknown state 0x%08X (%u)", state, 1613 description = base::StringPrintf("Unknown state 0x%08X (%u)", state,
1588 state); 1614 state);
1589 break; 1615 break;
1590 } 1616 }
1591 return description; 1617 return description;
1592 } 1618 }
1593 1619
1594 #undef STATE_CASE 1620 #undef STATE_CASE
1595 1621
1596 } // namespace net 1622 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698