blob: f05ae768f0fcd0bff0107d0b27d82e93e90ce358 [file] [log] [blame]
// 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 <stddef.h>
#include <memory>
#include "base/macros.h"
#include "net/base/net_export.h"
#include "net/quic/quic_header_list.h"
#include "net/quic/quic_protocol.h"
#include "net/quic/reliable_quic_stream.h"
#include "net/spdy/spdy_framer.h"
namespace net {
class QuicSpdySession;
// Headers in QUIC are sent as HTTP/2 HEADERS or PUSH_PROMISE frames
// over a reserved reliable stream with the id 3. Each endpoint
// (client and server) will allocate an instance of QuicHeadersStream
// to send and receive headers.
class NET_EXPORT_PRIVATE QuicHeadersStream : public ReliableQuicStream {
public:
class NET_EXPORT_PRIVATE HpackDebugVisitor {
public:
HpackDebugVisitor();
virtual ~HpackDebugVisitor();
// For each HPACK indexed representation processed, |elapsed| is
// the time since the corresponding entry was added to the dynamic
// table.
virtual void OnUseEntry(QuicTime::Delta elapsed) = 0;
private:
DISALLOW_COPY_AND_ASSIGN(HpackDebugVisitor);
};
explicit QuicHeadersStream(QuicSpdySession* session);
~QuicHeadersStream() override;
// Writes |headers| for |stream_id| in an HTTP/2 HEADERS frame to the peer.
// If |fin| is true, the fin flag will be set on the HEADERS frame. Returns
// the size, in bytes, of the resulting HEADERS frame.
virtual size_t WriteHeaders(QuicStreamId stream_id,
SpdyHeaderBlock headers,
bool fin,
SpdyPriority priority,
QuicAckListenerInterface* ack_listener);
// Write |headers| for |promised_stream_id| on |original_stream_id| in a
// PUSH_PROMISE frame to peer.
// Return the size, in bytes, of the resulting PUSH_PROMISE frame.
virtual size_t WritePushPromise(QuicStreamId original_stream_id,
QuicStreamId promised_stream_id,
SpdyHeaderBlock headers,
QuicAckListenerInterface* ack_listener);
// ReliableQuicStream implementation
void OnDataAvailable() override;
bool supports_push_promise() { return supports_push_promise_; }
// Experimental: force HPACK to use static table and huffman coding
// only. Part of exploring improvements related to headers stream
// induced HOL blocking in QUIC.
void DisableHpackDynamicTable();
// Optional, enables instrumentation related to go/quic-hpack.
void SetHpackEncoderDebugVisitor(std::unique_ptr<HpackDebugVisitor> visitor);
void SetHpackDecoderDebugVisitor(std::unique_ptr<HpackDebugVisitor> visitor);
private:
class SpdyFramerVisitor;
// The following methods are called by the SimpleVisitor.
// Called when a HEADERS frame has been received.
void OnHeaders(SpdyStreamId stream_id,
bool has_priority,
SpdyPriority priority,
bool fin);
// Called when a PUSH_PROMISE frame has been received.
void OnPushPromise(SpdyStreamId stream_id,
SpdyStreamId promised_stream_id,
bool end);
// Called when a chunk of header data is available. This is called
// after OnHeaders.
// |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 complete list of headers is available.
void OnHeaderList(const QuicHeaderList& header_list);
// 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();
QuicSpdySession* spdy_session_;
// Data about the stream whose headers are being processed.
QuicStreamId stream_id_;
QuicStreamId promised_stream_id_;
bool fin_;
size_t frame_len_;
size_t uncompressed_frame_len_;
// Helper variables that cache the corresponding feature flag.
bool measure_headers_hol_blocking_time_;
bool supports_push_promise_;
// Timestamps used to measure HOL blocking, these are recorded by
// the sequencer approximate to the time of arrival off the wire.
// |cur_max_timestamp_| tracks the most recent arrival time of
// frames for current (at the headers stream level) processed
// stream's headers, and |prev_max_timestamp_| tracks the most
// recent arrival time of lower numbered streams.
QuicTime cur_max_timestamp_;
QuicTime prev_max_timestamp_;
SpdyFramer spdy_framer_;
std::unique_ptr<SpdyFramerVisitor> spdy_framer_visitor_;
// Either empty, or contains the complete list of headers.
QuicHeaderList header_list_;
DISALLOW_COPY_AND_ASSIGN(QuicHeadersStream);
};
} // namespace net
#endif // NET_QUIC_QUIC_HEADERS_STREAM_H_