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/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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |