// Copyright (c) 2012 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/test_tools/simple_quic_framer.h" #include #include "base/macros.h" #include "net/quic/core/crypto/quic_decrypter.h" #include "net/quic/core/crypto/quic_encrypter.h" #include "net/quic/platform/api/quic_ptr_util.h" #include "net/quic/platform/api/quic_string_piece.h" using std::string; namespace net { namespace test { class SimpleFramerVisitor : public QuicFramerVisitorInterface { public: SimpleFramerVisitor() : error_(QUIC_NO_ERROR) {} ~SimpleFramerVisitor() override {} void OnError(QuicFramer* framer) override { error_ = framer->error(); } bool OnProtocolVersionMismatch(ParsedQuicVersion version) override { return false; } void OnPacket() override {} void OnPublicResetPacket(const QuicPublicResetPacket& packet) override { public_reset_packet_ = QuicMakeUnique((packet)); } void OnVersionNegotiationPacket( const QuicVersionNegotiationPacket& packet) override { version_negotiation_packet_ = QuicMakeUnique((packet)); } bool OnUnauthenticatedPublicHeader(const QuicPacketHeader& header) override { return true; } bool OnUnauthenticatedHeader(const QuicPacketHeader& header) override { return true; } void OnDecryptedPacket(EncryptionLevel level) override {} bool OnPacketHeader(const QuicPacketHeader& header) override { has_header_ = true; header_ = header; return true; } bool OnStreamFrame(const QuicStreamFrame& frame) override { // Save a copy of the data so it is valid after the packet is processed. string* string_data = new string(frame.data_buffer, frame.data_length); stream_data_.push_back(QuicWrapUnique(string_data)); // TODO(ianswett): A pointer isn't necessary with emplace_back. stream_frames_.push_back(QuicMakeUnique( frame.stream_id, frame.fin, frame.offset, QuicStringPiece(*string_data))); return true; } bool OnAckFrame(const QuicAckFrame& frame) override { ack_frames_.push_back(frame); return true; } bool OnAckFrameStart(QuicPacketNumber largest_acked, QuicTime::Delta ack_delay_time) override { QuicAckFrame ack_frame; ack_frame.largest_acked = largest_acked; ack_frame.ack_delay_time = ack_delay_time; ack_frames_.push_back(ack_frame); return true; } bool OnAckRange(QuicPacketNumber start, QuicPacketNumber end, bool /*last_range*/) override { DCHECK(!ack_frames_.empty()); ack_frames_[ack_frames_.size() - 1].packets.AddRange(start, end); return true; } bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) override { stop_waiting_frames_.push_back(frame); return true; } bool OnPaddingFrame(const QuicPaddingFrame& frame) override { padding_frames_.push_back(frame); return true; } bool OnPingFrame(const QuicPingFrame& frame) override { ping_frames_.push_back(frame); return true; } bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override { rst_stream_frames_.push_back(frame); return true; } bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override { connection_close_frames_.push_back(frame); return true; } bool OnGoAwayFrame(const QuicGoAwayFrame& frame) override { goaway_frames_.push_back(frame); return true; } bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) override { window_update_frames_.push_back(frame); return true; } bool OnBlockedFrame(const QuicBlockedFrame& frame) override { blocked_frames_.push_back(frame); return true; } void OnPacketComplete() override {} bool IsValidStatelessResetToken(uint128 token) const override { return false; } void OnAuthenticatedIetfStatelessResetPacket( const QuicIetfStatelessResetPacket& packet) override { stateless_reset_packet_ = QuicMakeUnique(packet); } const QuicPacketHeader& header() const { return header_; } const std::vector& ack_frames() const { return ack_frames_; } const std::vector& connection_close_frames() const { return connection_close_frames_; } const std::vector& goaway_frames() const { return goaway_frames_; } const std::vector& rst_stream_frames() const { return rst_stream_frames_; } const std::vector>& stream_frames() const { return stream_frames_; } const std::vector& stop_waiting_frames() const { return stop_waiting_frames_; } const std::vector& ping_frames() const { return ping_frames_; } const std::vector& window_update_frames() const { return window_update_frames_; } const std::vector& padding_frames() const { return padding_frames_; } const QuicVersionNegotiationPacket* version_negotiation_packet() const { return version_negotiation_packet_.get(); } private: QuicErrorCode error_; bool has_header_; QuicPacketHeader header_; std::unique_ptr version_negotiation_packet_; std::unique_ptr public_reset_packet_; std::unique_ptr stateless_reset_packet_; std::vector ack_frames_; std::vector stop_waiting_frames_; std::vector padding_frames_; std::vector ping_frames_; std::vector> stream_frames_; std::vector rst_stream_frames_; std::vector goaway_frames_; std::vector connection_close_frames_; std::vector window_update_frames_; std::vector blocked_frames_; std::vector> stream_data_; DISALLOW_COPY_AND_ASSIGN(SimpleFramerVisitor); }; SimpleQuicFramer::SimpleQuicFramer() : framer_(AllSupportedVersions(), QuicTime::Zero(), Perspective::IS_SERVER) {} SimpleQuicFramer::SimpleQuicFramer( const ParsedQuicVersionVector& supported_versions) : framer_(supported_versions, QuicTime::Zero(), Perspective::IS_SERVER) {} SimpleQuicFramer::SimpleQuicFramer( const ParsedQuicVersionVector& supported_versions, Perspective perspective) : framer_(supported_versions, QuicTime::Zero(), perspective) {} SimpleQuicFramer::~SimpleQuicFramer() {} bool SimpleQuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { visitor_ = QuicMakeUnique(); framer_.set_visitor(visitor_.get()); return framer_.ProcessPacket(packet); } void SimpleQuicFramer::Reset() { visitor_ = QuicMakeUnique(); } const QuicPacketHeader& SimpleQuicFramer::header() const { return visitor_->header(); } const QuicVersionNegotiationPacket* SimpleQuicFramer::version_negotiation_packet() const { return visitor_->version_negotiation_packet(); } QuicFramer* SimpleQuicFramer::framer() { return &framer_; } size_t SimpleQuicFramer::num_frames() const { return ack_frames().size() + goaway_frames().size() + rst_stream_frames().size() + stop_waiting_frames().size() + stream_frames().size() + ping_frames().size() + connection_close_frames().size() + padding_frames().size(); } const std::vector& SimpleQuicFramer::ack_frames() const { return visitor_->ack_frames(); } const std::vector& SimpleQuicFramer::stop_waiting_frames() const { return visitor_->stop_waiting_frames(); } const std::vector& SimpleQuicFramer::ping_frames() const { return visitor_->ping_frames(); } const std::vector& SimpleQuicFramer::window_update_frames() const { return visitor_->window_update_frames(); } const std::vector>& SimpleQuicFramer::stream_frames() const { return visitor_->stream_frames(); } const std::vector& SimpleQuicFramer::rst_stream_frames() const { return visitor_->rst_stream_frames(); } const std::vector& SimpleQuicFramer::goaway_frames() const { return visitor_->goaway_frames(); } const std::vector& SimpleQuicFramer::connection_close_frames() const { return visitor_->connection_close_frames(); } const std::vector& SimpleQuicFramer::padding_frames() const { return visitor_->padding_frames(); } } // namespace test } // namespace net