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 |