| 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 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 stream_id_(0), | 93 stream_id_(0), |
| 94 url_(url), | 94 url_(url), |
| 95 priority_(priority), | 95 priority_(priority), |
| 96 send_stalled_by_flow_control_(false), | 96 send_stalled_by_flow_control_(false), |
| 97 send_window_size_(initial_send_window_size), | 97 send_window_size_(initial_send_window_size), |
| 98 max_recv_window_size_(max_recv_window_size), | 98 max_recv_window_size_(max_recv_window_size), |
| 99 recv_window_size_(max_recv_window_size), | 99 recv_window_size_(max_recv_window_size), |
| 100 unacked_recv_window_bytes_(0), | 100 unacked_recv_window_bytes_(0), |
| 101 session_(session), | 101 session_(session), |
| 102 delegate_(NULL), | 102 delegate_(NULL), |
| 103 request_headers_valid_(false), |
| 103 pending_send_status_(MORE_DATA_TO_SEND), | 104 pending_send_status_(MORE_DATA_TO_SEND), |
| 104 request_time_(base::Time::Now()), | 105 request_time_(base::Time::Now()), |
| 105 response_headers_status_(RESPONSE_HEADERS_ARE_INCOMPLETE), | 106 response_headers_status_(RESPONSE_HEADERS_ARE_INCOMPLETE), |
| 106 io_state_(STATE_IDLE), | 107 io_state_(STATE_IDLE), |
| 107 response_status_(OK), | 108 response_status_(OK), |
| 108 net_log_(net_log), | 109 net_log_(net_log), |
| 109 raw_received_bytes_(0), | 110 raw_received_bytes_(0), |
| 110 raw_sent_bytes_(0), | 111 raw_sent_bytes_(0), |
| 111 send_bytes_(0), | 112 send_bytes_(0), |
| 112 recv_bytes_(0), | 113 recv_bytes_(0), |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 session_->CloseActiveStream(stream_id_, OK); | 195 session_->CloseActiveStream(stream_id_, OK); |
| 195 DCHECK(!weak_this); | 196 DCHECK(!weak_this); |
| 196 // |pending_recv_data_| is invalid at this point. | 197 // |pending_recv_data_| is invalid at this point. |
| 197 break; | 198 break; |
| 198 } | 199 } |
| 199 } | 200 } |
| 200 } | 201 } |
| 201 | 202 |
| 202 std::unique_ptr<SpdySerializedFrame> SpdyStream::ProduceSynStreamFrame() { | 203 std::unique_ptr<SpdySerializedFrame> SpdyStream::ProduceSynStreamFrame() { |
| 203 CHECK_EQ(io_state_, STATE_IDLE); | 204 CHECK_EQ(io_state_, STATE_IDLE); |
| 204 CHECK(request_headers_); | 205 CHECK(request_headers_valid_); |
| 205 CHECK_GT(stream_id_, 0u); | 206 CHECK_GT(stream_id_, 0u); |
| 206 | 207 |
| 207 SpdyControlFlags flags = | 208 SpdyControlFlags flags = |
| 208 (pending_send_status_ == NO_MORE_DATA_TO_SEND) ? | 209 (pending_send_status_ == NO_MORE_DATA_TO_SEND) ? |
| 209 CONTROL_FLAG_FIN : CONTROL_FLAG_NONE; | 210 CONTROL_FLAG_FIN : CONTROL_FLAG_NONE; |
| 210 std::unique_ptr<SpdySerializedFrame> frame(session_->CreateSynStream( | 211 std::unique_ptr<SpdySerializedFrame> frame(session_->CreateSynStream( |
| 211 stream_id_, priority_, flags, request_headers_->Clone())); | 212 stream_id_, priority_, flags, request_headers_.Clone())); |
| 212 send_time_ = base::TimeTicks::Now(); | 213 send_time_ = base::TimeTicks::Now(); |
| 213 return frame; | 214 return frame; |
| 214 } | 215 } |
| 215 | 216 |
| 216 void SpdyStream::DetachDelegate() { | 217 void SpdyStream::DetachDelegate() { |
| 217 DCHECK(!IsClosed()); | 218 DCHECK(!IsClosed()); |
| 218 delegate_ = NULL; | 219 delegate_ = NULL; |
| 219 Cancel(); | 220 Cancel(); |
| 220 } | 221 } |
| 221 | 222 |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 457 response_headers_status_ == RESPONSE_HEADERS_ARE_COMPLETE) { | 458 response_headers_status_ == RESPONSE_HEADERS_ARE_COMPLETE) { |
| 458 session_->ResetStream( | 459 session_->ResetStream( |
| 459 stream_id_, RST_STREAM_PROTOCOL_ERROR, | 460 stream_id_, RST_STREAM_PROTOCOL_ERROR, |
| 460 "Additional headers received for push stream"); | 461 "Additional headers received for push stream"); |
| 461 return ERR_SPDY_PROTOCOL_ERROR; | 462 return ERR_SPDY_PROTOCOL_ERROR; |
| 462 } | 463 } |
| 463 return MergeWithResponseHeaders(additional_response_headers); | 464 return MergeWithResponseHeaders(additional_response_headers); |
| 464 } | 465 } |
| 465 | 466 |
| 466 void SpdyStream::OnPushPromiseHeadersReceived(const SpdyHeaderBlock& headers) { | 467 void SpdyStream::OnPushPromiseHeadersReceived(const SpdyHeaderBlock& headers) { |
| 467 CHECK(!request_headers_.get()); | 468 CHECK(!request_headers_valid_); |
| 468 CHECK_EQ(io_state_, STATE_IDLE); | 469 CHECK_EQ(io_state_, STATE_IDLE); |
| 469 CHECK_EQ(type_, SPDY_PUSH_STREAM); | 470 CHECK_EQ(type_, SPDY_PUSH_STREAM); |
| 470 DCHECK(!delegate_); | 471 DCHECK(!delegate_); |
| 471 | 472 |
| 472 io_state_ = STATE_RESERVED_REMOTE; | 473 io_state_ = STATE_RESERVED_REMOTE; |
| 473 request_headers_.reset(new SpdyHeaderBlock(headers.Clone())); | 474 request_headers_ = headers.Clone(); |
| 475 request_headers_valid_ = true; |
| 474 } | 476 } |
| 475 | 477 |
| 476 void SpdyStream::OnDataReceived(std::unique_ptr<SpdyBuffer> buffer) { | 478 void SpdyStream::OnDataReceived(std::unique_ptr<SpdyBuffer> buffer) { |
| 477 DCHECK(session_->IsStreamActive(stream_id_)); | 479 DCHECK(session_->IsStreamActive(stream_id_)); |
| 478 | 480 |
| 479 // Track our bandwidth. | 481 // Track our bandwidth. |
| 480 recv_bytes_ += buffer ? buffer->GetRemainingSize() : 0; | 482 recv_bytes_ += buffer ? buffer->GetRemainingSize() : 0; |
| 481 recv_last_byte_time_ = base::TimeTicks::Now(); | 483 recv_last_byte_time_ = base::TimeTicks::Now(); |
| 482 | 484 |
| 483 // If we're still buffering data for a push stream, we will do the | 485 // If we're still buffering data for a push stream, we will do the |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 673 } else { | 675 } else { |
| 674 session_->CloseCreatedStream(GetWeakPtr(), OK); | 676 session_->CloseCreatedStream(GetWeakPtr(), OK); |
| 675 } | 677 } |
| 676 // |this| is invalid at this point. | 678 // |this| is invalid at this point. |
| 677 } | 679 } |
| 678 | 680 |
| 679 base::WeakPtr<SpdyStream> SpdyStream::GetWeakPtr() { | 681 base::WeakPtr<SpdyStream> SpdyStream::GetWeakPtr() { |
| 680 return weak_ptr_factory_.GetWeakPtr(); | 682 return weak_ptr_factory_.GetWeakPtr(); |
| 681 } | 683 } |
| 682 | 684 |
| 683 int SpdyStream::SendRequestHeaders( | 685 int SpdyStream::SendRequestHeaders(SpdyHeaderBlock request_headers, |
| 684 std::unique_ptr<SpdyHeaderBlock> request_headers, | 686 SpdySendStatus send_status) { |
| 685 SpdySendStatus send_status) { | |
| 686 CHECK_NE(type_, SPDY_PUSH_STREAM); | 687 CHECK_NE(type_, SPDY_PUSH_STREAM); |
| 687 CHECK_EQ(pending_send_status_, MORE_DATA_TO_SEND); | 688 CHECK_EQ(pending_send_status_, MORE_DATA_TO_SEND); |
| 688 CHECK(!request_headers_); | 689 CHECK(!request_headers_valid_); |
| 689 CHECK(!pending_send_data_.get()); | 690 CHECK(!pending_send_data_.get()); |
| 690 CHECK_EQ(io_state_, STATE_IDLE); | 691 CHECK_EQ(io_state_, STATE_IDLE); |
| 691 request_headers_ = std::move(request_headers); | 692 request_headers_ = std::move(request_headers); |
| 693 request_headers_valid_ = true; |
| 692 pending_send_status_ = send_status; | 694 pending_send_status_ = send_status; |
| 693 session_->EnqueueStreamWrite(GetWeakPtr(), SYN_STREAM, | 695 session_->EnqueueStreamWrite(GetWeakPtr(), SYN_STREAM, |
| 694 std::unique_ptr<SpdyBufferProducer>( | 696 std::unique_ptr<SpdyBufferProducer>( |
| 695 new SynStreamBufferProducer(GetWeakPtr()))); | 697 new SynStreamBufferProducer(GetWeakPtr()))); |
| 696 return ERR_IO_PENDING; | 698 return ERR_IO_PENDING; |
| 697 } | 699 } |
| 698 | 700 |
| 699 void SpdyStream::SendData(IOBuffer* data, | 701 void SpdyStream::SendData(IOBuffer* data, |
| 700 int length, | 702 int length, |
| 701 SpdySendStatus send_status) { | 703 SpdySendStatus send_status) { |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 767 load_timing_info->push_start = recv_first_byte_time_; | 769 load_timing_info->push_start = recv_first_byte_time_; |
| 768 bool done_receiving = IsClosed() || (!pending_recv_data_.empty() && | 770 bool done_receiving = IsClosed() || (!pending_recv_data_.empty() && |
| 769 !pending_recv_data_.back()); | 771 !pending_recv_data_.back()); |
| 770 if (done_receiving) | 772 if (done_receiving) |
| 771 load_timing_info->push_end = recv_last_byte_time_; | 773 load_timing_info->push_end = recv_last_byte_time_; |
| 772 } | 774 } |
| 773 return result; | 775 return result; |
| 774 } | 776 } |
| 775 | 777 |
| 776 GURL SpdyStream::GetUrlFromHeaders() const { | 778 GURL SpdyStream::GetUrlFromHeaders() const { |
| 777 if (!request_headers_) | 779 if (!request_headers_valid_) |
| 778 return GURL(); | 780 return GURL(); |
| 779 | 781 |
| 780 return GetUrlFromHeaderBlock(*request_headers_); | 782 return GetUrlFromHeaderBlock(request_headers_); |
| 781 } | 783 } |
| 782 | 784 |
| 783 bool SpdyStream::HasUrlFromHeaders() const { | 785 bool SpdyStream::HasUrlFromHeaders() const { |
| 784 return !GetUrlFromHeaders().is_empty(); | 786 return !GetUrlFromHeaders().is_empty(); |
| 785 } | 787 } |
| 786 | 788 |
| 787 void SpdyStream::UpdateHistograms() { | 789 void SpdyStream::UpdateHistograms() { |
| 788 // We need at least the receive timers to be filled in, as otherwise | 790 // We need at least the receive timers to be filled in, as otherwise |
| 789 // metrics can be bogus. | 791 // metrics can be bogus. |
| 790 if (recv_first_byte_time_.is_null() || recv_last_byte_time_.is_null()) | 792 if (recv_first_byte_time_.is_null() || recv_last_byte_time_.is_null()) |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 937 description = base::StringPrintf("Unknown state 0x%08X (%u)", state, | 939 description = base::StringPrintf("Unknown state 0x%08X (%u)", state, |
| 938 state); | 940 state); |
| 939 break; | 941 break; |
| 940 } | 942 } |
| 941 return description; | 943 return description; |
| 942 } | 944 } |
| 943 | 945 |
| 944 #undef STATE_CASE | 946 #undef STATE_CASE |
| 945 | 947 |
| 946 } // namespace net | 948 } // namespace net |
| OLD | NEW |