Chromium Code Reviews| 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 |