// 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;
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_