Index: net/http/http_network_transaction.cc |
diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc |
index 322e2e144a387ffd19f15346c2b973669d79a438..8fb5a28f869c4781e7473c50517f1d319e4c6425 100644 |
--- a/net/http/http_network_transaction.cc |
+++ b/net/http/http_network_transaction.cc |
@@ -198,7 +198,7 @@ int HttpNetworkTransaction::Start(const HttpRequestInfo* request_info, |
(request_->privacy_mode == kPrivacyModeDisabled); |
server_ssl_config_.channel_id_enabled = channel_id_enabled; |
- next_state_ = STATE_CREATE_STREAM; |
+ next_state_ = STATE_NOTIFY_BEFORE_CREATE_STREAM; |
int rv = DoLoop(OK); |
if (rv == ERR_IO_PENDING) |
callback_ = callback; |
@@ -404,6 +404,8 @@ LoadState HttpNetworkTransaction::GetLoadState() const { |
// TODO(wtc): Define a new LoadState value for the |
// STATE_INIT_CONNECTION_COMPLETE state, which delays the HTTP request. |
switch (next_state_) { |
+ case STATE_CREATE_STREAM: |
+ return LOAD_STATE_WAITING_FOR_DELEGATE; |
case STATE_CREATE_STREAM_COMPLETE: |
return stream_request_->GetLoadState(); |
case STATE_GENERATE_PROXY_AUTH_TOKEN_COMPLETE: |
@@ -453,6 +455,16 @@ void HttpNetworkTransaction::SetWebSocketHandshakeStreamCreateHelper( |
websocket_handshake_stream_base_create_helper_ = create_helper; |
} |
+void HttpNetworkTransaction::SetBeforeNetworkStartCallback( |
+ const BeforeNetworkStartCallback& callback) { |
+ before_network_start_callback_ = callback; |
+} |
+ |
+int HttpNetworkTransaction::ResumeNetworkStart() { |
+ DCHECK_EQ(next_state_, STATE_CREATE_STREAM); |
+ return DoLoop(OK); |
+} |
+ |
void HttpNetworkTransaction::OnStreamReady(const SSLConfig& used_ssl_config, |
const ProxyInfo& used_proxy_info, |
HttpStreamBase* stream) { |
@@ -589,6 +601,10 @@ int HttpNetworkTransaction::DoLoop(int result) { |
State state = next_state_; |
next_state_ = STATE_NONE; |
switch (state) { |
+ case STATE_NOTIFY_BEFORE_CREATE_STREAM: |
+ DCHECK_EQ(OK, rv); |
+ rv = DoNotifyBeforeCreateStream(); |
+ break; |
case STATE_CREATE_STREAM: |
DCHECK_EQ(OK, rv); |
rv = DoCreateStream(); |
@@ -682,9 +698,18 @@ int HttpNetworkTransaction::DoLoop(int result) { |
return rv; |
} |
+int HttpNetworkTransaction::DoNotifyBeforeCreateStream() { |
+ next_state_ = STATE_CREATE_STREAM; |
+ bool defer = false; |
+ if (!before_network_start_callback_.is_null()) |
+ before_network_start_callback_.Run(&defer); |
+ if (!defer) |
+ return OK; |
+ return ERR_IO_PENDING; |
+} |
+ |
int HttpNetworkTransaction::DoCreateStream() { |
next_state_ = STATE_CREATE_STREAM_COMPLETE; |
- |
if (ForWebSocketHandshake()) { |
stream_request_.reset( |
session_->http_stream_factory_for_websocket() |
@@ -1568,6 +1593,7 @@ bool HttpNetworkTransaction::ForWebSocketHandshake() const { |
std::string HttpNetworkTransaction::DescribeState(State state) { |
std::string description; |
switch (state) { |
+ STATE_CASE(STATE_NOTIFY_BEFORE_CREATE_STREAM); |
STATE_CASE(STATE_CREATE_STREAM); |
STATE_CASE(STATE_CREATE_STREAM_COMPLETE); |
STATE_CASE(STATE_INIT_REQUEST_BODY); |