// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef NET_QUIC_QUIC_HEADERS_STREAM_H_ #define NET_QUIC_QUIC_HEADERS_STREAM_H_ #include "base/basictypes.h" #include "base/memory/scoped_ptr.h" #include "net/base/net_export.h" #include "net/quic/quic_protocol.h" #include "net/quic/reliable_quic_stream.h" #include "net/spdy/spdy_framer.h" namespace net { // Headers in QUIC are sent as SPDY SYN_STREAM or SYN_REPLY frames // over a reserved reliable stream with the id 2. Each endpoint (client // and server) will allocate an instance of QuicHeadersStream to send // and receive headers. class NET_EXPORT_PRIVATE QuicHeadersStream : public ReliableQuicStream { public: explicit QuicHeadersStream(QuicSession* session); virtual ~QuicHeadersStream(); // Writes |headers| for |stream_id| in a SYN_STREAM or SYN_REPLY // frame to the peer. If |fin| is true, the fin flag will be set on // the SPDY frame. Returns the size, in bytes, of the resulting // SPDY frame. size_t WriteHeaders( QuicStreamId stream_id, const SpdyHeaderBlock& headers, bool fin, QuicAckNotifier::DelegateInterface* ack_notifier_delegate); // ReliableQuicStream implementation virtual uint32 ProcessRawData(const char* data, uint32 data_len) OVERRIDE; virtual QuicPriority EffectivePriority() const OVERRIDE; // Headers stream is special and is not flow controlled. virtual bool IsFlowControlEnabled() const OVERRIDE; private: class SpdyFramerVisitor; // The following methods are called by the SimpleVisitor. // Called when a SYN_STREAM frame has been received. void OnSynStream(SpdyStreamId stream_id, SpdyPriority priority, bool fin); // Called when a SYN_REPLY frame been received. void OnSynReply(SpdyStreamId stream_id, bool fin); // Called when a chunk of header data is available. This is called // after OnSynStream, or OnSynReply. // |stream_id| The stream receiving the header data. // |header_data| A buffer containing the header data chunk received. // |len| The length of the header data buffer. A length of zero indicates // that the header data block has been completely sent. void OnControlFrameHeaderData(SpdyStreamId stream_id, const char* header_data, size_t len); // Called when the size of the compressed frame payload is available. void OnCompressedFrameSize(size_t frame_len); // Returns true if the session is still connected. bool IsConnected(); // Data about the stream whose headers are being processed. QuicStreamId stream_id_; bool fin_; size_t frame_len_; SpdyFramer spdy_framer_; scoped_ptr<SpdyFramerVisitor> spdy_framer_visitor_; DISALLOW_COPY_AND_ASSIGN(QuicHeadersStream); }; } // namespace net #endif // NET_QUIC_QUIC_HEADERS_STREAM_H_