| 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/spdy/spdy_stream.h" | 5 #include "net/spdy/spdy_stream.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 202 | 202 |
| 203 std::unique_ptr<SpdySerializedFrame> SpdyStream::ProduceSynStreamFrame() { | 203 std::unique_ptr<SpdySerializedFrame> SpdyStream::ProduceSynStreamFrame() { |
| 204 CHECK_EQ(io_state_, STATE_IDLE); | 204 CHECK_EQ(io_state_, STATE_IDLE); |
| 205 CHECK(request_headers_valid_); | 205 CHECK(request_headers_valid_); |
| 206 CHECK_GT(stream_id_, 0u); | 206 CHECK_GT(stream_id_, 0u); |
| 207 | 207 |
| 208 SpdyControlFlags flags = | 208 SpdyControlFlags flags = |
| 209 (pending_send_status_ == NO_MORE_DATA_TO_SEND) ? | 209 (pending_send_status_ == NO_MORE_DATA_TO_SEND) ? |
| 210 CONTROL_FLAG_FIN : CONTROL_FLAG_NONE; | 210 CONTROL_FLAG_FIN : CONTROL_FLAG_NONE; |
| 211 std::unique_ptr<SpdySerializedFrame> frame(session_->CreateSynStream( | 211 std::unique_ptr<SpdySerializedFrame> frame(session_->CreateSynStream( |
| 212 stream_id_, priority_, flags, request_headers_.Clone())); | 212 stream_id_, priority_, flags, std::move(request_headers_))); |
| 213 request_headers_valid_ = false; |
| 213 send_time_ = base::TimeTicks::Now(); | 214 send_time_ = base::TimeTicks::Now(); |
| 214 return frame; | 215 return frame; |
| 215 } | 216 } |
| 216 | 217 |
| 217 void SpdyStream::DetachDelegate() { | 218 void SpdyStream::DetachDelegate() { |
| 218 DCHECK(!IsClosed()); | 219 DCHECK(!IsClosed()); |
| 219 delegate_ = NULL; | 220 delegate_ = NULL; |
| 220 Cancel(); | 221 Cancel(); |
| 221 } | 222 } |
| 222 | 223 |
| (...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 466 | 467 |
| 467 void SpdyStream::OnPushPromiseHeadersReceived(const SpdyHeaderBlock& headers) { | 468 void SpdyStream::OnPushPromiseHeadersReceived(const SpdyHeaderBlock& headers) { |
| 468 CHECK(!request_headers_valid_); | 469 CHECK(!request_headers_valid_); |
| 469 CHECK_EQ(io_state_, STATE_IDLE); | 470 CHECK_EQ(io_state_, STATE_IDLE); |
| 470 CHECK_EQ(type_, SPDY_PUSH_STREAM); | 471 CHECK_EQ(type_, SPDY_PUSH_STREAM); |
| 471 DCHECK(!delegate_); | 472 DCHECK(!delegate_); |
| 472 | 473 |
| 473 io_state_ = STATE_RESERVED_REMOTE; | 474 io_state_ = STATE_RESERVED_REMOTE; |
| 474 request_headers_ = headers.Clone(); | 475 request_headers_ = headers.Clone(); |
| 475 request_headers_valid_ = true; | 476 request_headers_valid_ = true; |
| 477 url_from_header_block_ = GetUrlFromHeaderBlock(request_headers_); |
| 476 } | 478 } |
| 477 | 479 |
| 478 void SpdyStream::OnDataReceived(std::unique_ptr<SpdyBuffer> buffer) { | 480 void SpdyStream::OnDataReceived(std::unique_ptr<SpdyBuffer> buffer) { |
| 479 DCHECK(session_->IsStreamActive(stream_id_)); | 481 DCHECK(session_->IsStreamActive(stream_id_)); |
| 480 | 482 |
| 481 // Track our bandwidth. | 483 // Track our bandwidth. |
| 482 recv_bytes_ += buffer ? buffer->GetRemainingSize() : 0; | 484 recv_bytes_ += buffer ? buffer->GetRemainingSize() : 0; |
| 483 recv_last_byte_time_ = base::TimeTicks::Now(); | 485 recv_last_byte_time_ = base::TimeTicks::Now(); |
| 484 | 486 |
| 485 // If we're still buffering data for a push stream, we will do the | 487 // If we're still buffering data for a push stream, we will do the |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 684 | 686 |
| 685 int SpdyStream::SendRequestHeaders(SpdyHeaderBlock request_headers, | 687 int SpdyStream::SendRequestHeaders(SpdyHeaderBlock request_headers, |
| 686 SpdySendStatus send_status) { | 688 SpdySendStatus send_status) { |
| 687 CHECK_NE(type_, SPDY_PUSH_STREAM); | 689 CHECK_NE(type_, SPDY_PUSH_STREAM); |
| 688 CHECK_EQ(pending_send_status_, MORE_DATA_TO_SEND); | 690 CHECK_EQ(pending_send_status_, MORE_DATA_TO_SEND); |
| 689 CHECK(!request_headers_valid_); | 691 CHECK(!request_headers_valid_); |
| 690 CHECK(!pending_send_data_.get()); | 692 CHECK(!pending_send_data_.get()); |
| 691 CHECK_EQ(io_state_, STATE_IDLE); | 693 CHECK_EQ(io_state_, STATE_IDLE); |
| 692 request_headers_ = std::move(request_headers); | 694 request_headers_ = std::move(request_headers); |
| 693 request_headers_valid_ = true; | 695 request_headers_valid_ = true; |
| 696 url_from_header_block_ = GetUrlFromHeaderBlock(request_headers_); |
| 694 pending_send_status_ = send_status; | 697 pending_send_status_ = send_status; |
| 695 session_->EnqueueStreamWrite(GetWeakPtr(), SYN_STREAM, | 698 session_->EnqueueStreamWrite(GetWeakPtr(), SYN_STREAM, |
| 696 std::unique_ptr<SpdyBufferProducer>( | 699 std::unique_ptr<SpdyBufferProducer>( |
| 697 new SynStreamBufferProducer(GetWeakPtr()))); | 700 new SynStreamBufferProducer(GetWeakPtr()))); |
| 698 return ERR_IO_PENDING; | 701 return ERR_IO_PENDING; |
| 699 } | 702 } |
| 700 | 703 |
| 701 void SpdyStream::SendData(IOBuffer* data, | 704 void SpdyStream::SendData(IOBuffer* data, |
| 702 int length, | 705 int length, |
| 703 SpdySendStatus send_status) { | 706 SpdySendStatus send_status) { |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 768 if (type_ == SPDY_PUSH_STREAM) { | 771 if (type_ == SPDY_PUSH_STREAM) { |
| 769 load_timing_info->push_start = recv_first_byte_time_; | 772 load_timing_info->push_start = recv_first_byte_time_; |
| 770 bool done_receiving = IsClosed() || (!pending_recv_data_.empty() && | 773 bool done_receiving = IsClosed() || (!pending_recv_data_.empty() && |
| 771 !pending_recv_data_.back()); | 774 !pending_recv_data_.back()); |
| 772 if (done_receiving) | 775 if (done_receiving) |
| 773 load_timing_info->push_end = recv_last_byte_time_; | 776 load_timing_info->push_end = recv_last_byte_time_; |
| 774 } | 777 } |
| 775 return result; | 778 return result; |
| 776 } | 779 } |
| 777 | 780 |
| 778 GURL SpdyStream::GetUrlFromHeaders() const { | |
| 779 if (!request_headers_valid_) | |
| 780 return GURL(); | |
| 781 | |
| 782 return GetUrlFromHeaderBlock(request_headers_); | |
| 783 } | |
| 784 | |
| 785 bool SpdyStream::HasUrlFromHeaders() const { | |
| 786 return !GetUrlFromHeaders().is_empty(); | |
| 787 } | |
| 788 | |
| 789 void SpdyStream::UpdateHistograms() { | 781 void SpdyStream::UpdateHistograms() { |
| 790 // We need at least the receive timers to be filled in, as otherwise | 782 // We need at least the receive timers to be filled in, as otherwise |
| 791 // metrics can be bogus. | 783 // metrics can be bogus. |
| 792 if (recv_first_byte_time_.is_null() || recv_last_byte_time_.is_null()) | 784 if (recv_first_byte_time_.is_null() || recv_last_byte_time_.is_null()) |
| 793 return; | 785 return; |
| 794 | 786 |
| 795 base::TimeTicks effective_send_time; | 787 base::TimeTicks effective_send_time; |
| 796 if (type_ == SPDY_PUSH_STREAM) { | 788 if (type_ == SPDY_PUSH_STREAM) { |
| 797 // Push streams shouldn't have |send_time_| filled in. | 789 // Push streams shouldn't have |send_time_| filled in. |
| 798 DCHECK(send_time_.is_null()); | 790 DCHECK(send_time_.is_null()); |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 939 description = base::StringPrintf("Unknown state 0x%08X (%u)", state, | 931 description = base::StringPrintf("Unknown state 0x%08X (%u)", state, |
| 940 state); | 932 state); |
| 941 break; | 933 break; |
| 942 } | 934 } |
| 943 return description; | 935 return description; |
| 944 } | 936 } |
| 945 | 937 |
| 946 #undef STATE_CASE | 938 #undef STATE_CASE |
| 947 | 939 |
| 948 } // namespace net | 940 } // namespace net |
| OLD | NEW |