summaryrefslogtreecommitdiff
path: root/chromium/net/quic/core/quic_headers_stream.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/quic/core/quic_headers_stream.h')
-rw-r--r--chromium/net/quic/core/quic_headers_stream.h175
1 files changed, 175 insertions, 0 deletions
diff --git a/chromium/net/quic/core/quic_headers_stream.h b/chromium/net/quic/core/quic_headers_stream.h
new file mode 100644
index 00000000000..603dd45677b
--- /dev/null
+++ b/chromium/net/quic/core/quic_headers_stream.h
@@ -0,0 +1,175 @@
+// 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/core/quic_header_list.h"
+#include "net/quic/core/quic_protocol.h"
+#include "net/quic/core/reliable_quic_stream.h"
+#include "net/spdy/spdy_framer.h"
+
+namespace net {
+
+class QuicSpdySession;
+
+namespace test {
+class QuicHeadersStreamPeer;
+} // namespace test
+
+// 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);
+
+ // For forcing HOL blocking. This encapsulates data from other
+ // streams into HTTP/2 data frames on the headers stream.
+ QuicConsumedData WritevStreamData(
+ QuicStreamId id,
+ QuicIOVector iov,
+ QuicStreamOffset offset,
+ bool fin,
+ QuicAckListenerInterface* ack_notifier_delegate);
+
+ // 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);
+
+ // Sets the maximum size of the header compression table spdy_framer_ is
+ // willing to use to decode header blocks.
+ void UpdateHeaderEncoderTableSize(uint32_t value);
+
+ // Called when SETTINGS_ENABLE_PUSH is received, only supported on
+ // server side.
+ void UpdateEnableServerPush(bool value);
+
+ // Sets how much encoded data the hpack decoder of spdy_framer_ is willing to
+ // buffer.
+ void set_max_decode_buffer_size_bytes(size_t max_decode_buffer_size_bytes) {
+ spdy_framer_.set_max_decode_buffer_size_bytes(max_decode_buffer_size_bytes);
+ }
+
+ private:
+ friend class test::QuicHeadersStreamPeer;
+
+ 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);
+
+ // For force HOL blocking, where stream frames from all streams are
+ // plumbed through headers stream as HTTP/2 data frames. Return false
+ // if force_hol_blocking_ is false;
+ bool OnDataFrameHeader(QuicStreamId stream_id, size_t length, bool fin);
+ bool OnStreamFrameData(QuicStreamId stream_id, const char* data, size_t 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_;
+
+ 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_;
+
+ DISALLOW_COPY_AND_ASSIGN(QuicHeadersStream);
+};
+
+} // namespace net
+
+#endif // NET_QUIC_QUIC_HEADERS_STREAM_H_