Chromium Code Reviews| 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..f86673fc08e6373496016c46e4ff036fa4c5f1a9 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 base::Callback<void(bool*)>& 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 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.
|
| + 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); |