| 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/quic/chromium/quic_http_stream.h" | 5 #include "net/quic/chromium/quic_http_stream.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
| 10 #include "base/callback_helpers.h" | 10 #include "base/callback_helpers.h" |
| (...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 513 if (!callback_.is_null()) | 513 if (!callback_.is_null()) |
| 514 DoCallback(GetResponseStatus()); | 514 DoCallback(GetResponseStatus()); |
| 515 } | 515 } |
| 516 | 516 |
| 517 bool QuicHttpStream::HasSendHeadersComplete() { | 517 bool QuicHttpStream::HasSendHeadersComplete() { |
| 518 return next_state_ > STATE_SEND_HEADERS_COMPLETE; | 518 return next_state_ > STATE_SEND_HEADERS_COMPLETE; |
| 519 } | 519 } |
| 520 | 520 |
| 521 void QuicHttpStream::OnCryptoHandshakeConfirmed() { | 521 void QuicHttpStream::OnCryptoHandshakeConfirmed() { |
| 522 was_handshake_confirmed_ = true; | 522 was_handshake_confirmed_ = true; |
| 523 if (next_state_ == STATE_WAIT_FOR_CONFIRMATION_COMPLETE) { | |
| 524 // Post a task to avoid reentrant calls into the session. | |
| 525 base::ThreadTaskRunnerHandle::Get()->PostTask( | |
| 526 FROM_HERE, base::Bind(&QuicHttpStream::OnIOComplete, | |
| 527 weak_factory_.GetWeakPtr(), OK)); | |
| 528 } | |
| 529 } | 523 } |
| 530 | 524 |
| 531 void QuicHttpStream::OnSuccessfulVersionNegotiation( | 525 void QuicHttpStream::OnSuccessfulVersionNegotiation( |
| 532 const QuicVersion& version) { | 526 const QuicVersion& version) { |
| 533 quic_version_ = version; | 527 quic_version_ = version; |
| 534 } | 528 } |
| 535 | 529 |
| 536 void QuicHttpStream::OnSessionClosed(int error, bool port_migration_detected) { | 530 void QuicHttpStream::OnSessionClosed(int error, bool port_migration_detected) { |
| 537 session_error_ = error; | 531 session_error_ = error; |
| 538 port_migration_detected_ = port_migration_detected; | 532 port_migration_detected_ = port_migration_detected; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 579 CHECK_EQ(OK, rv); | 573 CHECK_EQ(OK, rv); |
| 580 rv = DoRequestStream(); | 574 rv = DoRequestStream(); |
| 581 break; | 575 break; |
| 582 case STATE_REQUEST_STREAM_COMPLETE: | 576 case STATE_REQUEST_STREAM_COMPLETE: |
| 583 rv = DoRequestStreamComplete(rv); | 577 rv = DoRequestStreamComplete(rv); |
| 584 break; | 578 break; |
| 585 case STATE_SET_REQUEST_PRIORITY: | 579 case STATE_SET_REQUEST_PRIORITY: |
| 586 CHECK_EQ(OK, rv); | 580 CHECK_EQ(OK, rv); |
| 587 rv = DoSetRequestPriority(); | 581 rv = DoSetRequestPriority(); |
| 588 break; | 582 break; |
| 589 case STATE_WAIT_FOR_CONFIRMATION: | |
| 590 CHECK_EQ(OK, rv); | |
| 591 rv = DoWaitForConfirmation(); | |
| 592 break; | |
| 593 case STATE_WAIT_FOR_CONFIRMATION_COMPLETE: | |
| 594 rv = DoWaitForConfirmationComplete(rv); | |
| 595 break; | |
| 596 case STATE_SEND_HEADERS: | 583 case STATE_SEND_HEADERS: |
| 597 CHECK_EQ(OK, rv); | 584 CHECK_EQ(OK, rv); |
| 598 rv = DoSendHeaders(); | 585 rv = DoSendHeaders(); |
| 599 break; | 586 break; |
| 600 case STATE_SEND_HEADERS_COMPLETE: | 587 case STATE_SEND_HEADERS_COMPLETE: |
| 601 rv = DoSendHeadersComplete(rv); | 588 rv = DoSendHeadersComplete(rv); |
| 602 break; | 589 break; |
| 603 case STATE_READ_REQUEST_BODY: | 590 case STATE_READ_REQUEST_BODY: |
| 604 CHECK_EQ(OK, rv); | 591 CHECK_EQ(OK, rv); |
| 605 rv = DoReadRequestBody(); | 592 rv = DoReadRequestBody(); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 622 break; | 609 break; |
| 623 } | 610 } |
| 624 } while (next_state_ != STATE_NONE && next_state_ != STATE_OPEN && | 611 } while (next_state_ != STATE_NONE && next_state_ != STATE_OPEN && |
| 625 rv != ERR_IO_PENDING); | 612 rv != ERR_IO_PENDING); |
| 626 | 613 |
| 627 return rv; | 614 return rv; |
| 628 } | 615 } |
| 629 | 616 |
| 630 int QuicHttpStream::DoRequestStream() { | 617 int QuicHttpStream::DoRequestStream() { |
| 631 next_state_ = STATE_REQUEST_STREAM_COMPLETE; | 618 next_state_ = STATE_REQUEST_STREAM_COMPLETE; |
| 632 stream_request_ = session_->CreateStreamRequest(); | 619 stream_request_ = |
| 620 session_->CreateStreamRequest(request_info_->method == "POST"); |
| 633 return stream_request_->StartRequest( | 621 return stream_request_->StartRequest( |
| 634 base::Bind(&QuicHttpStream::OnIOComplete, weak_factory_.GetWeakPtr())); | 622 base::Bind(&QuicHttpStream::OnIOComplete, weak_factory_.GetWeakPtr())); |
| 635 } | 623 } |
| 636 | 624 |
| 637 int QuicHttpStream::DoRequestStreamComplete(int rv) { | 625 int QuicHttpStream::DoRequestStreamComplete(int rv) { |
| 638 DCHECK(rv == OK || !stream_); | 626 DCHECK(rv == OK || !stream_); |
| 639 if (rv != OK) { | 627 if (rv != OK) { |
| 640 session_error_ = rv; | 628 session_error_ = rv; |
| 641 return GetResponseStatus(); | 629 return GetResponseStatus(); |
| 642 } | 630 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 658 | 646 |
| 659 return OK; | 647 return OK; |
| 660 } | 648 } |
| 661 | 649 |
| 662 int QuicHttpStream::DoSetRequestPriority() { | 650 int QuicHttpStream::DoSetRequestPriority() { |
| 663 // Set priority according to request | 651 // Set priority according to request |
| 664 DCHECK(stream_); | 652 DCHECK(stream_); |
| 665 DCHECK(response_info_); | 653 DCHECK(response_info_); |
| 666 SpdyPriority priority = ConvertRequestPriorityToQuicPriority(priority_); | 654 SpdyPriority priority = ConvertRequestPriorityToQuicPriority(priority_); |
| 667 stream_->SetPriority(priority); | 655 stream_->SetPriority(priority); |
| 668 next_state_ = STATE_WAIT_FOR_CONFIRMATION; | |
| 669 return OK; | |
| 670 } | |
| 671 | |
| 672 int QuicHttpStream::DoWaitForConfirmation() { | |
| 673 next_state_ = STATE_WAIT_FOR_CONFIRMATION_COMPLETE; | |
| 674 if (!session_->IsCryptoHandshakeConfirmed() && | |
| 675 request_info_->method == "POST") { | |
| 676 return ERR_IO_PENDING; | |
| 677 } | |
| 678 return OK; | |
| 679 } | |
| 680 | |
| 681 int QuicHttpStream::DoWaitForConfirmationComplete(int rv) { | |
| 682 if (rv < 0) | |
| 683 return rv; | |
| 684 | |
| 685 next_state_ = STATE_SEND_HEADERS; | 656 next_state_ = STATE_SEND_HEADERS; |
| 686 return OK; | 657 return OK; |
| 687 } | 658 } |
| 688 | 659 |
| 689 int QuicHttpStream::DoSendHeaders() { | 660 int QuicHttpStream::DoSendHeaders() { |
| 690 if (!stream_) | 661 if (!stream_) |
| 691 return GetResponseStatus(); | 662 return GetResponseStatus(); |
| 692 | 663 |
| 693 // Log the actual request with the URL Request's net log. | 664 // Log the actual request with the URL Request's net log. |
| 694 stream_net_log_.AddEvent( | 665 stream_net_log_.AddEvent( |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 890 quic_stream_error_ != QUIC_STREAM_CONNECTION_ERROR) { | 861 quic_stream_error_ != QUIC_STREAM_CONNECTION_ERROR) { |
| 891 return ERR_QUIC_PROTOCOL_ERROR; | 862 return ERR_QUIC_PROTOCOL_ERROR; |
| 892 } | 863 } |
| 893 | 864 |
| 894 DCHECK_NE(QUIC_HANDSHAKE_TIMEOUT, quic_connection_error_); | 865 DCHECK_NE(QUIC_HANDSHAKE_TIMEOUT, quic_connection_error_); |
| 895 | 866 |
| 896 return ERR_QUIC_PROTOCOL_ERROR; | 867 return ERR_QUIC_PROTOCOL_ERROR; |
| 897 } | 868 } |
| 898 | 869 |
| 899 } // namespace net | 870 } // namespace net |
| OLD | NEW |