| 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/reliable_quic_stream.h" | 5 #include "net/quic/reliable_quic_stream.h" |
| 6 | 6 |
| 7 #include "net/quic/quic_session.h" | 7 #include "net/quic/quic_session.h" |
| 8 | 8 |
| 9 using base::StringPiece; | 9 using base::StringPiece; |
| 10 | 10 |
| 11 namespace net { | 11 namespace net { |
| 12 | 12 |
| 13 ReliableQuicStream::ReliableQuicStream(QuicStreamId id, | 13 ReliableQuicStream::ReliableQuicStream(QuicStreamId id, |
| 14 QuicSession* session) | 14 QuicSession* session) |
| 15 : sequencer_(this), | 15 : sequencer_(this), |
| 16 id_(id), | 16 id_(id), |
| 17 offset_(0), | |
| 18 session_(session), | 17 session_(session), |
| 19 visitor_(NULL), | 18 visitor_(NULL), |
| 20 stream_bytes_read_(0), | 19 stream_bytes_read_(0), |
| 21 stream_bytes_written_(0), | 20 stream_bytes_written_(0), |
| 22 error_(QUIC_NO_ERROR), | 21 error_(QUIC_NO_ERROR), |
| 23 read_side_closed_(false), | 22 read_side_closed_(false), |
| 24 write_side_closed_(false), | 23 write_side_closed_(false), |
| 25 fin_buffered_(false), | 24 fin_buffered_(false), |
| 26 fin_sent_(false) { | 25 fin_sent_(false) { |
| 27 } | 26 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 41 return sequencer_.WillAcceptStreamFrame(frame); | 40 return sequencer_.WillAcceptStreamFrame(frame); |
| 42 } | 41 } |
| 43 | 42 |
| 44 bool ReliableQuicStream::OnStreamFrame(const QuicStreamFrame& frame) { | 43 bool ReliableQuicStream::OnStreamFrame(const QuicStreamFrame& frame) { |
| 45 DCHECK_EQ(frame.stream_id, id_); | 44 DCHECK_EQ(frame.stream_id, id_); |
| 46 if (read_side_closed_) { | 45 if (read_side_closed_) { |
| 47 DLOG(INFO) << "Ignoring frame " << frame.stream_id; | 46 DLOG(INFO) << "Ignoring frame " << frame.stream_id; |
| 48 // We don't want to be reading: blackhole the data. | 47 // We don't want to be reading: blackhole the data. |
| 49 return true; | 48 return true; |
| 50 } | 49 } |
| 50 // Note: This count include duplicate data received. |
| 51 stream_bytes_read_ += frame.data.length(); |
| 51 | 52 |
| 52 bool accepted = sequencer_.OnStreamFrame(frame); | 53 bool accepted = sequencer_.OnStreamFrame(frame); |
| 53 | 54 |
| 54 if (frame.fin) { | 55 if (frame.fin) { |
| 55 sequencer_.CloseStreamAtOffset(frame.offset + frame.data.size(), | 56 sequencer_.CloseStreamAtOffset(frame.offset + frame.data.size(), true); |
| 56 true); | |
| 57 } | 57 } |
| 58 | 58 |
| 59 return accepted; | 59 return accepted; |
| 60 } | 60 } |
| 61 | 61 |
| 62 void ReliableQuicStream::OnStreamReset(QuicErrorCode error, | 62 void ReliableQuicStream::OnStreamReset(QuicErrorCode error) { |
| 63 QuicStreamOffset offset) { | |
| 64 error_ = error; | 63 error_ = error; |
| 65 sequencer_.CloseStreamAtOffset(offset, false); // Full close. | 64 TerminateFromPeer(false); // Full close. |
| 66 } | 65 } |
| 67 | 66 |
| 68 void ReliableQuicStream::ConnectionClose(QuicErrorCode error, bool from_peer) { | 67 void ReliableQuicStream::ConnectionClose(QuicErrorCode error, bool from_peer) { |
| 69 error_ = error; | 68 error_ = error; |
| 70 if (from_peer) { | 69 if (from_peer) { |
| 71 TerminateFromPeer(false); | 70 TerminateFromPeer(false); |
| 72 } else { | 71 } else { |
| 73 CloseWriteSide(); | 72 CloseWriteSide(); |
| 74 CloseReadSide(); | 73 CloseReadSide(); |
| 75 } | 74 } |
| 76 } | 75 } |
| 77 | 76 |
| 78 void ReliableQuicStream::TerminateFromPeer(bool half_close) { | 77 void ReliableQuicStream::TerminateFromPeer(bool half_close) { |
| 79 if (!half_close) { | 78 if (!half_close) { |
| 80 CloseWriteSide(); | 79 CloseWriteSide(); |
| 81 } | 80 } |
| 82 CloseReadSide(); | 81 CloseReadSide(); |
| 83 } | 82 } |
| 84 | 83 |
| 85 void ReliableQuicStream::Close(QuicErrorCode error) { | 84 void ReliableQuicStream::Close(QuicErrorCode error) { |
| 86 error_ = error; | 85 error_ = error; |
| 87 session()->SendRstStream(id(), error, offset_); | 86 session()->SendRstStream(id(), error); |
| 88 } | 87 } |
| 89 | 88 |
| 90 bool ReliableQuicStream::IsHalfClosed() const { | 89 bool ReliableQuicStream::IsHalfClosed() const { |
| 91 return sequencer_.IsHalfClosed(); | 90 return sequencer_.IsHalfClosed(); |
| 92 } | 91 } |
| 93 | 92 |
| 94 bool ReliableQuicStream::HasBytesToRead() const { | 93 bool ReliableQuicStream::HasBytesToRead() const { |
| 95 return sequencer_.HasBytesToRead(); | 94 return sequencer_.HasBytesToRead(); |
| 96 } | 95 } |
| 97 | 96 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 } | 143 } |
| 145 | 144 |
| 146 QuicConsumedData ReliableQuicStream::WriteDataInternal( | 145 QuicConsumedData ReliableQuicStream::WriteDataInternal( |
| 147 StringPiece data, bool fin) { | 146 StringPiece data, bool fin) { |
| 148 if (write_side_closed_) { | 147 if (write_side_closed_) { |
| 149 DLOG(ERROR) << "Attempt to write when the write side is closed"; | 148 DLOG(ERROR) << "Attempt to write when the write side is closed"; |
| 150 return QuicConsumedData(0, false); | 149 return QuicConsumedData(0, false); |
| 151 } | 150 } |
| 152 | 151 |
| 153 QuicConsumedData consumed_data = | 152 QuicConsumedData consumed_data = |
| 154 session()->WriteData(id(), data, offset_, fin); | 153 session()->WriteData(id(), data, stream_bytes_written_, fin); |
| 155 offset_ += consumed_data.bytes_consumed; | |
| 156 stream_bytes_written_ += consumed_data.bytes_consumed; | 154 stream_bytes_written_ += consumed_data.bytes_consumed; |
| 157 if (consumed_data.bytes_consumed == data.length()) { | 155 if (consumed_data.bytes_consumed == data.length()) { |
| 158 if (fin && consumed_data.fin_consumed) { | 156 if (fin && consumed_data.fin_consumed) { |
| 159 fin_sent_ = true; | 157 fin_sent_ = true; |
| 160 CloseWriteSide(); | 158 CloseWriteSide(); |
| 161 } | 159 } |
| 162 } else { | 160 } else { |
| 163 session_->MarkWriteBlocked(id()); | 161 session_->MarkWriteBlocked(id()); |
| 164 } | 162 } |
| 165 return consumed_data; | 163 return consumed_data; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 195 if (visitor_) { | 193 if (visitor_) { |
| 196 Visitor* visitor = visitor_; | 194 Visitor* visitor = visitor_; |
| 197 // Calling Visitor::OnClose() may result the destruction of the visitor, | 195 // Calling Visitor::OnClose() may result the destruction of the visitor, |
| 198 // so we need to ensure we don't call it again. | 196 // so we need to ensure we don't call it again. |
| 199 visitor_ = NULL; | 197 visitor_ = NULL; |
| 200 visitor->OnClose(this); | 198 visitor->OnClose(this); |
| 201 } | 199 } |
| 202 } | 200 } |
| 203 | 201 |
| 204 } // namespace net | 202 } // namespace net |
| OLD | NEW |