| Index: net/quic/quic_headers_stream.cc
|
| diff --git a/net/quic/quic_headers_stream.cc b/net/quic/quic_headers_stream.cc
|
| deleted file mode 100644
|
| index b40142db16605874f568b555e1d94f0dfe3643b9..0000000000000000000000000000000000000000
|
| --- a/net/quic/quic_headers_stream.cc
|
| +++ /dev/null
|
| @@ -1,333 +0,0 @@
|
| -// 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.
|
| -
|
| -#include "net/quic/quic_headers_stream.h"
|
| -
|
| -#include "base/strings/stringprintf.h"
|
| -#include "net/quic/quic_session.h"
|
| -
|
| -using base::StringPiece;
|
| -using std::string;
|
| -
|
| -namespace net {
|
| -
|
| -namespace {
|
| -
|
| -const QuicStreamId kInvalidStreamId = 0;
|
| -
|
| -} // namespace
|
| -
|
| -// A SpdyFramer visitor which passed SYN_STREAM and SYN_REPLY frames to
|
| -// the QuicDataStream, and closes the connection if any unexpected frames
|
| -// are received.
|
| -class QuicHeadersStream::SpdyFramerVisitor
|
| - : public SpdyFramerVisitorInterface,
|
| - public SpdyFramerDebugVisitorInterface {
|
| - public:
|
| - SpdyFramerVisitor(SpdyMajorVersion spdy_version, QuicHeadersStream* stream)
|
| - : spdy_version_(spdy_version), stream_(stream) {}
|
| -
|
| - // SpdyFramerVisitorInterface implementation
|
| - void OnSynStream(SpdyStreamId stream_id,
|
| - SpdyStreamId associated_stream_id,
|
| - SpdyPriority priority,
|
| - bool fin,
|
| - bool unidirectional) override {
|
| - if (spdy_version_ != SPDY3) {
|
| - CloseConnection("SPDY SYN_STREAM frame received.");
|
| - return;
|
| - }
|
| -
|
| - if (!stream_->IsConnected()) {
|
| - return;
|
| - }
|
| -
|
| - if (associated_stream_id != 0) {
|
| - CloseConnection("associated_stream_id != 0");
|
| - return;
|
| - }
|
| -
|
| - if (unidirectional != 0) {
|
| - CloseConnection("unidirectional != 0");
|
| - return;
|
| - }
|
| -
|
| - stream_->OnSynStream(stream_id, priority, fin);
|
| - }
|
| -
|
| - void OnSynReply(SpdyStreamId stream_id, bool fin) override {
|
| - if (spdy_version_ != SPDY3) {
|
| - CloseConnection("SPDY SYN_REPLY frame received.");
|
| - return;
|
| - }
|
| -
|
| - if (!stream_->IsConnected()) {
|
| - return;
|
| - }
|
| -
|
| - stream_->OnSynReply(stream_id, fin);
|
| - }
|
| -
|
| - bool OnControlFrameHeaderData(SpdyStreamId stream_id,
|
| - const char* header_data,
|
| - size_t len) override {
|
| - if (!stream_->IsConnected()) {
|
| - return false;
|
| - }
|
| - stream_->OnControlFrameHeaderData(stream_id, header_data, len);
|
| - return true;
|
| - }
|
| -
|
| - void OnStreamFrameData(SpdyStreamId stream_id,
|
| - const char* data,
|
| - size_t len,
|
| - bool fin) override {
|
| - if (fin && len == 0) {
|
| - // The framer invokes OnStreamFrameData with zero-length data and
|
| - // fin = true after processing a SYN_STREAM or SYN_REPLY frame
|
| - // that had the fin bit set.
|
| - return;
|
| - }
|
| - CloseConnection("SPDY DATA frame received.");
|
| - }
|
| -
|
| - void OnError(SpdyFramer* framer) override {
|
| - CloseConnection(base::StringPrintf(
|
| - "SPDY framing error: %s",
|
| - SpdyFramer::ErrorCodeToString(framer->error_code())));
|
| - }
|
| -
|
| - void OnDataFrameHeader(SpdyStreamId stream_id,
|
| - size_t length,
|
| - bool fin) override {
|
| - CloseConnection("SPDY DATA frame received.");
|
| - }
|
| -
|
| - void OnRstStream(SpdyStreamId stream_id,
|
| - SpdyRstStreamStatus status) override {
|
| - CloseConnection("SPDY RST_STREAM frame received.");
|
| - }
|
| -
|
| - void OnSetting(SpdySettingsIds id, uint8 flags, uint32 value) override {
|
| - CloseConnection("SPDY SETTINGS frame received.");
|
| - }
|
| -
|
| - void OnSettingsAck() override {
|
| - CloseConnection("SPDY SETTINGS frame received.");
|
| - }
|
| -
|
| - void OnSettingsEnd() override {
|
| - CloseConnection("SPDY SETTINGS frame received.");
|
| - }
|
| -
|
| - void OnPing(SpdyPingId unique_id, bool is_ack) override {
|
| - CloseConnection("SPDY PING frame received.");
|
| - }
|
| -
|
| - void OnGoAway(SpdyStreamId last_accepted_stream_id,
|
| - SpdyGoAwayStatus status) override {
|
| - CloseConnection("SPDY GOAWAY frame received.");
|
| - }
|
| -
|
| - void OnHeaders(SpdyStreamId stream_id,
|
| - bool has_priority,
|
| - SpdyPriority priority,
|
| - bool fin,
|
| - bool end) override {
|
| - if (spdy_version_ == SPDY3) {
|
| - CloseConnection("SPDY HEADERS frame received.");
|
| - return;
|
| - }
|
| - if (!stream_->IsConnected()) {
|
| - return;
|
| - }
|
| - if (has_priority) {
|
| - stream_->OnSynStream(stream_id, priority, fin);
|
| - } else {
|
| - stream_->OnSynReply(stream_id, fin);
|
| - }
|
| - }
|
| -
|
| - void OnWindowUpdate(SpdyStreamId stream_id,
|
| - uint32 delta_window_size) override {
|
| - CloseConnection("SPDY WINDOW_UPDATE frame received.");
|
| - }
|
| -
|
| - void OnPushPromise(SpdyStreamId stream_id,
|
| - SpdyStreamId promised_stream_id,
|
| - bool end) override {
|
| - LOG(DFATAL) << "PUSH_PROMISE frame received from a SPDY/3 framer";
|
| - CloseConnection("SPDY PUSH_PROMISE frame received.");
|
| - }
|
| -
|
| - void OnContinuation(SpdyStreamId stream_id, bool end) override {
|
| - if (spdy_version_ == SPDY3) {
|
| - LOG(DFATAL) << "CONTINUATION frame received from a SPDY/3 framer";
|
| - CloseConnection("SPDY CONTINUATION frame received.");
|
| - }
|
| - }
|
| -
|
| - bool OnUnknownFrame(SpdyStreamId stream_id, int frame_type) override {
|
| - CloseConnection("Unknown frame type received.");
|
| - return false;
|
| - }
|
| -
|
| - // SpdyFramerDebugVisitorInterface implementation
|
| - void OnSendCompressedFrame(SpdyStreamId stream_id,
|
| - SpdyFrameType type,
|
| - size_t payload_len,
|
| - size_t frame_len) override {}
|
| -
|
| - void OnReceiveCompressedFrame(SpdyStreamId stream_id,
|
| - SpdyFrameType type,
|
| - size_t frame_len) override {
|
| - if (stream_->IsConnected()) {
|
| - stream_->OnCompressedFrameSize(frame_len);
|
| - }
|
| - }
|
| -
|
| - private:
|
| - void CloseConnection(const string& details) {
|
| - if (stream_->IsConnected()) {
|
| - stream_->CloseConnectionWithDetails(
|
| - QUIC_INVALID_HEADERS_STREAM_DATA, details);
|
| - }
|
| - }
|
| -
|
| - private:
|
| - SpdyMajorVersion spdy_version_;
|
| - QuicHeadersStream* stream_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(SpdyFramerVisitor);
|
| -};
|
| -
|
| -QuicHeadersStream::QuicHeadersStream(QuicSession* session)
|
| - : ReliableQuicStream(kHeadersStreamId, session),
|
| - stream_id_(kInvalidStreamId),
|
| - fin_(false),
|
| - frame_len_(0) {
|
| - InitializeFramer(session->connection()->version());
|
| - // The headers stream is exempt from connection level flow control.
|
| - DisableConnectionFlowControlForThisStream();
|
| -}
|
| -
|
| -QuicHeadersStream::~QuicHeadersStream() {}
|
| -
|
| -size_t QuicHeadersStream::WriteHeaders(
|
| - QuicStreamId stream_id,
|
| - const SpdyHeaderBlock& headers,
|
| - bool fin,
|
| - QuicPriority priority,
|
| - QuicAckNotifier::DelegateInterface* ack_notifier_delegate) {
|
| - scoped_ptr<SpdySerializedFrame> frame;
|
| - if (spdy_framer_->protocol_version() == SPDY3) {
|
| - if (session()->is_server()) {
|
| - SpdySynReplyIR syn_reply(stream_id);
|
| - syn_reply.set_name_value_block(headers);
|
| - syn_reply.set_fin(fin);
|
| - frame.reset(spdy_framer_->SerializeFrame(syn_reply));
|
| - } else {
|
| - SpdySynStreamIR syn_stream(stream_id);
|
| - syn_stream.set_name_value_block(headers);
|
| - syn_stream.set_fin(fin);
|
| - syn_stream.set_priority(priority);
|
| - frame.reset(spdy_framer_->SerializeFrame(syn_stream));
|
| - }
|
| - } else {
|
| - SpdyHeadersIR headers_frame(stream_id);
|
| - headers_frame.set_name_value_block(headers);
|
| - headers_frame.set_fin(fin);
|
| - if (!session()->is_server()) {
|
| - headers_frame.set_has_priority(true);
|
| - headers_frame.set_priority(priority);
|
| - }
|
| - frame.reset(spdy_framer_->SerializeFrame(headers_frame));
|
| - }
|
| - WriteOrBufferData(StringPiece(frame->data(), frame->size()), false,
|
| - ack_notifier_delegate);
|
| - return frame->size();
|
| -}
|
| -
|
| -uint32 QuicHeadersStream::ProcessRawData(const char* data,
|
| - uint32 data_len) {
|
| - return spdy_framer_->ProcessInput(data, data_len);
|
| -}
|
| -
|
| -QuicPriority QuicHeadersStream::EffectivePriority() const { return 0; }
|
| -
|
| -void QuicHeadersStream::OnSuccessfulVersionNegotiation(QuicVersion version) {
|
| - InitializeFramer(version);
|
| -}
|
| -
|
| -void QuicHeadersStream::InitializeFramer(QuicVersion version) {
|
| - SpdyMajorVersion spdy_version = version > QUIC_VERSION_23 ? SPDY4 : SPDY3;
|
| - if (spdy_framer_.get() != nullptr &&
|
| - spdy_framer_->protocol_version() == spdy_version) {
|
| - return;
|
| - }
|
| - spdy_framer_.reset(new SpdyFramer(spdy_version));
|
| - spdy_framer_visitor_.reset(new SpdyFramerVisitor(spdy_version, this));
|
| - spdy_framer_->set_visitor(spdy_framer_visitor_.get());
|
| - spdy_framer_->set_debug_visitor(spdy_framer_visitor_.get());
|
| -}
|
| -
|
| -void QuicHeadersStream::OnSynStream(SpdyStreamId stream_id,
|
| - SpdyPriority priority,
|
| - bool fin) {
|
| - if (!session()->is_server()) {
|
| - CloseConnectionWithDetails(
|
| - QUIC_INVALID_HEADERS_STREAM_DATA,
|
| - "SPDY SYN_STREAM frame received at the client");
|
| - return;
|
| - }
|
| - DCHECK_EQ(kInvalidStreamId, stream_id_);
|
| - stream_id_ = stream_id;
|
| - fin_ = fin;
|
| - session()->OnStreamHeadersPriority(stream_id, priority);
|
| -}
|
| -
|
| -void QuicHeadersStream::OnSynReply(SpdyStreamId stream_id, bool fin) {
|
| - if (session()->is_server()) {
|
| - CloseConnectionWithDetails(
|
| - QUIC_INVALID_HEADERS_STREAM_DATA,
|
| - "SPDY SYN_REPLY frame received at the server");
|
| - return;
|
| - }
|
| - DCHECK_EQ(kInvalidStreamId, stream_id_);
|
| - stream_id_ = stream_id;
|
| - fin_ = fin;
|
| -}
|
| -
|
| -void QuicHeadersStream::OnControlFrameHeaderData(SpdyStreamId stream_id,
|
| - const char* header_data,
|
| - size_t len) {
|
| - DCHECK_EQ(stream_id_, stream_id);
|
| - if (len == 0) {
|
| - DCHECK_NE(0u, stream_id_);
|
| - DCHECK_NE(0u, frame_len_);
|
| - session()->OnStreamHeadersComplete(stream_id_, fin_, frame_len_);
|
| - // Reset state for the next frame.
|
| - stream_id_ = kInvalidStreamId;
|
| - fin_ = false;
|
| - frame_len_ = 0;
|
| - } else {
|
| - session()->OnStreamHeaders(stream_id_, StringPiece(header_data, len));
|
| - }
|
| -}
|
| -
|
| -void QuicHeadersStream::OnCompressedFrameSize(size_t frame_len) {
|
| - if (spdy_framer_->protocol_version() == SPDY3) {
|
| - // SPDY/3 headers always fit into a single frame, so the previous headers
|
| - // should be completely processed when a new frame is received.
|
| - DCHECK_EQ(kInvalidStreamId, stream_id_);
|
| - DCHECK_EQ(0u, frame_len_);
|
| - }
|
| - frame_len_ += frame_len;
|
| -}
|
| -
|
| -bool QuicHeadersStream::IsConnected() {
|
| - return session()->connection()->connected();
|
| -}
|
| -
|
| -} // namespace net
|
|
|