reliable_quic_stream.h revision 2385ea399aae016c0806a4f9ef3c9cfe3d2a39df
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The base class for client/server reliable streams. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_QUIC_RELIABLE_QUIC_STREAM_H_ 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_QUIC_RELIABLE_QUIC_STREAM_H_ 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <sys/types.h> 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <list> 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/strings/string_piece.h" 15b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/base/iovec.h" 16b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/base/net_export.h" 1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "net/quic/quic_spdy_compressor.h" 18b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/quic/quic_spdy_decompressor.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/quic_stream_sequencer.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace test { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ReliableQuicStreamPeer; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace test 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class IPEndPoint; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class QuicSession; 297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass SSLInfo; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// All this does right now is send data to subclasses via the sequencer. 32b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class NET_EXPORT_PRIVATE ReliableQuicStream : public 33b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) QuicSpdyDecompressor::Visitor { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Visitor receives callbacks from the stream. 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class Visitor { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Visitor() {} 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called when the stream is closed. 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnClose(ReliableQuicStream* stream) = 0; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~Visitor() {} 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Visitor); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReliableQuicStream(QuicStreamId id, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuicSession* session); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ReliableQuicStream(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool WillAcceptStreamFrame(const QuicStreamFrame& frame) const; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool OnStreamFrame(const QuicStreamFrame& frame); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnCanWrite(); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called by the session just before the stream is deleted. 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnClose(); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when we get a stream reset from the client. 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnStreamReset(QuicRstStreamErrorCode error); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when we get or send a connection close, and should immediately 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // close the stream. This is not passed through the sequencer, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // but is handled immediately. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ConnectionClose(QuicErrorCode error, bool from_peer); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Called when we should process a stream termination or 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // stream close from the peer. 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TerminateFromPeer(bool half_close); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual uint32 ProcessRawData(const char* data, uint32 data_len); 76b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual uint32 ProcessHeaderData(); 77b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual uint32 ProcessData(const char* data, uint32 data_len) = 0; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 80b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual bool OnDecompressedData(base::StringPiece data) OVERRIDE; 8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void OnDecompressionError() OVERRIDE; 82b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called to close the stream from this end. 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void Close(QuicRstStreamErrorCode error); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This block of functions wraps the sequencer's functions of the same 87b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // name. These methods return uncompressed data until that has 88b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // been fully processed. Then they simply delegate to the sequencer. 895e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) virtual size_t Readv(const struct iovec* iov, size_t iov_len); 90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual int GetReadableRegions(iovec* iov, size_t iov_len); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsHalfClosed() const; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool HasBytesToRead() const; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 94b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Called by the session when a decompression blocked stream 95b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // becomes unblocked. 96b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void OnDecompressorAvailable(); 97b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuicStreamId id() const { return id_; } 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicRstStreamErrorCode stream_error() const { return stream_error_; } 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicErrorCode connection_error() const { return connection_error_; } 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool read_side_closed() const { return read_side_closed_; } 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool write_side_closed() const { return write_side_closed_; } 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 106b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) uint64 stream_bytes_read() { return stream_bytes_read_; } 107b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) uint64 stream_bytes_written() { return stream_bytes_written_; } 108b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const IPEndPoint& GetPeerAddress() const; 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Visitor* visitor() { return visitor_; } 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void set_visitor(Visitor* visitor) { visitor_ = visitor; } 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) QuicSpdyCompressor* compressor(); 11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Gets the SSL connection information. 1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool GetSSLInfo(SSLInfo* ssl_info); 1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1192385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch bool headers_decompressed() const { return headers_decompressed_; } 1202385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns a pair with the number of bytes consumed from data, and a boolean 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // indicating if the fin bit was consumed. This does not indicate the data 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // has been sent on the wire: it may have been turned into a packet and queued 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // if the socket was unexpectedly blocked. 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The default implementation always consumed all bytes and any fin, but 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // this behavior is not guaranteed for subclasses so callers should check the 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // return value. 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual QuicConsumedData WriteData(base::StringPiece data, bool fin); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the read side of the socket. Further frames will not be accepted. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CloseReadSide(); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the write side of the socket. Further writes will fail. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CloseWriteSide(); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 138b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) bool fin_buffered() { return fin_buffered_; } 139b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuicSession* session() { return session_; } 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sends as much of 'data' to the connection as the connection will consume, 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and then buffers any remaining data in queued_data_. 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns (data.size(), true) as it always consumed all data: it returns for 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // convenience to have the same return type as WriteDataInternal. 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuicConsumedData WriteOrBuffer(base::StringPiece data, bool fin); 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sends as much of 'data' to the connection as the connection will consume. 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the number of bytes consumed by the connection. 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuicConsumedData WriteDataInternal(base::StringPiece data, bool fin); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class test::ReliableQuicStreamPeer; 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class QuicStreamUtils; 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::list<string> queued_data_; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuicStreamSequencer sequencer_; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuicStreamId id_; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuicSession* session_; 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Optional visitor of this stream to be notified when the stream is closed. 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Visitor* visitor_; 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Bytes read and written refer to payload bytes only: they do not include 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // framing, encryption overhead etc. 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint64 stream_bytes_read_; 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint64 stream_bytes_written_; 167b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // True if the headers have been completely decompresssed. 168b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) bool headers_decompressed_; 169b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // ID of the header block sent by the peer, once parsed. 170b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) QuicHeaderId headers_id_; 171b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Buffer into which we write bytes from the headers_id_ 172b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // until it is fully parsed. 173b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) string headers_id_buffer_; 174b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Contains a copy of the decompressed headers_ until they are consumed 175b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // via ProcessData or Readv. 176b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) string decompressed_headers_; 177558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // True if an error was encountered during decompression. 178558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch bool decompression_failed_; 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Stream error code received from a RstStreamFrame or error code sent by the 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // visitor or sequencer in the RstStreamFrame. 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicRstStreamErrorCode stream_error_; 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Connection error code due to which the stream was closed. |stream_error_| 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // is set to |QUIC_STREAM_CONNECTION_ERROR| when this happens and consumers 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // should check |connection_error_|. 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicErrorCode connection_error_; 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if the read side is closed and further frames should be rejected. 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool read_side_closed_; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if the write side is closed, and further writes should fail. 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool write_side_closed_; 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool fin_buffered_; 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool fin_sent_; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // NET_QUIC_RELIABLE_QUIC_STREAM_H_ 200