1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "net/quic/test_tools/simple_quic_framer.h"
7 #include "base/stl_util.h"
8 #include "net/quic/crypto/crypto_framer.h"
9 #include "net/quic/crypto/quic_decrypter.h"
10 #include "net/quic/crypto/quic_encrypter.h"
12 using base::StringPiece
;
19 class SimpleFramerVisitor
: public QuicFramerVisitorInterface
{
22 : error_(QUIC_NO_ERROR
) {
25 ~SimpleFramerVisitor() override
{ STLDeleteElements(&stream_data_
); }
27 void OnError(QuicFramer
* framer
) override
{ error_
= framer
->error(); }
29 bool OnProtocolVersionMismatch(QuicVersion version
) override
{ return false; }
31 void OnPacket() override
{}
32 void OnPublicResetPacket(const QuicPublicResetPacket
& packet
) override
{
33 public_reset_packet_
.reset(new QuicPublicResetPacket(packet
));
35 void OnVersionNegotiationPacket(
36 const QuicVersionNegotiationPacket
& packet
) override
{
37 version_negotiation_packet_
.reset(
38 new QuicVersionNegotiationPacket(packet
));
40 void OnRevivedPacket() override
{}
42 bool OnUnauthenticatedPublicHeader(
43 const QuicPacketPublicHeader
& header
) override
{
46 bool OnUnauthenticatedHeader(const QuicPacketHeader
& header
) override
{
49 void OnDecryptedPacket(EncryptionLevel level
) override
{}
50 bool OnPacketHeader(const QuicPacketHeader
& header
) override
{
56 void OnFecProtectedPayload(StringPiece payload
) override
{}
58 bool OnStreamFrame(const QuicStreamFrame
& frame
) override
{
59 // Save a copy of the data so it is valid after the packet is processed.
60 stream_data_
.push_back(frame
.GetDataAsString());
61 QuicStreamFrame
stream_frame(frame
);
62 // Make sure that the stream frame points to this data.
63 stream_frame
.data
.Clear();
64 stream_frame
.data
.Append(const_cast<char*>(stream_data_
.back()->data()),
65 stream_data_
.back()->size());
66 stream_frames_
.push_back(stream_frame
);
70 bool OnAckFrame(const QuicAckFrame
& frame
) override
{
71 ack_frames_
.push_back(frame
);
75 bool OnCongestionFeedbackFrame(
76 const QuicCongestionFeedbackFrame
& frame
) override
{
77 feedback_frames_
.push_back(frame
);
81 bool OnStopWaitingFrame(const QuicStopWaitingFrame
& frame
) override
{
82 stop_waiting_frames_
.push_back(frame
);
86 bool OnPingFrame(const QuicPingFrame
& frame
) override
{
87 ping_frames_
.push_back(frame
);
91 void OnFecData(const QuicFecData
& fec
) override
{
93 fec_redundancy_
= fec_data_
.redundancy
.as_string();
94 fec_data_
.redundancy
= fec_redundancy_
;
97 bool OnRstStreamFrame(const QuicRstStreamFrame
& frame
) override
{
98 rst_stream_frames_
.push_back(frame
);
102 bool OnConnectionCloseFrame(const QuicConnectionCloseFrame
& frame
) override
{
103 connection_close_frames_
.push_back(frame
);
107 bool OnGoAwayFrame(const QuicGoAwayFrame
& frame
) override
{
108 goaway_frames_
.push_back(frame
);
112 bool OnWindowUpdateFrame(const QuicWindowUpdateFrame
& frame
) override
{
113 window_update_frames_
.push_back(frame
);
117 bool OnBlockedFrame(const QuicBlockedFrame
& frame
) override
{
118 blocked_frames_
.push_back(frame
);
122 void OnPacketComplete() override
{}
124 const QuicPacketHeader
& header() const { return header_
; }
125 const vector
<QuicAckFrame
>& ack_frames() const { return ack_frames_
; }
126 const vector
<QuicConnectionCloseFrame
>& connection_close_frames() const {
127 return connection_close_frames_
;
129 const vector
<QuicCongestionFeedbackFrame
>& feedback_frames() const {
130 return feedback_frames_
;
132 const vector
<QuicGoAwayFrame
>& goaway_frames() const {
133 return goaway_frames_
;
135 const vector
<QuicRstStreamFrame
>& rst_stream_frames() const {
136 return rst_stream_frames_
;
138 const vector
<QuicStreamFrame
>& stream_frames() const {
139 return stream_frames_
;
141 const vector
<QuicStopWaitingFrame
>& stop_waiting_frames() const {
142 return stop_waiting_frames_
;
144 const vector
<QuicPingFrame
>& ping_frames() const {
147 const QuicFecData
& fec_data() const {
150 const QuicVersionNegotiationPacket
* version_negotiation_packet() const {
151 return version_negotiation_packet_
.get();
153 const QuicPublicResetPacket
* public_reset_packet() const {
154 return public_reset_packet_
.get();
158 QuicErrorCode error_
;
160 QuicPacketHeader header_
;
161 QuicFecData fec_data_
;
162 scoped_ptr
<QuicVersionNegotiationPacket
> version_negotiation_packet_
;
163 scoped_ptr
<QuicPublicResetPacket
> public_reset_packet_
;
164 string fec_redundancy_
;
165 vector
<QuicAckFrame
> ack_frames_
;
166 vector
<QuicCongestionFeedbackFrame
> feedback_frames_
;
167 vector
<QuicStopWaitingFrame
> stop_waiting_frames_
;
168 vector
<QuicPingFrame
> ping_frames_
;
169 vector
<QuicStreamFrame
> stream_frames_
;
170 vector
<QuicRstStreamFrame
> rst_stream_frames_
;
171 vector
<QuicGoAwayFrame
> goaway_frames_
;
172 vector
<QuicConnectionCloseFrame
> connection_close_frames_
;
173 vector
<QuicWindowUpdateFrame
> window_update_frames_
;
174 vector
<QuicBlockedFrame
> blocked_frames_
;
175 vector
<string
*> stream_data_
;
177 DISALLOW_COPY_AND_ASSIGN(SimpleFramerVisitor
);
180 SimpleQuicFramer::SimpleQuicFramer()
181 : framer_(QuicSupportedVersions(), QuicTime::Zero(), true) {
184 SimpleQuicFramer::SimpleQuicFramer(const QuicVersionVector
& supported_versions
)
185 : framer_(supported_versions
, QuicTime::Zero(), true) {
188 SimpleQuicFramer::~SimpleQuicFramer() {
191 bool SimpleQuicFramer::ProcessPacket(const QuicPacket
& packet
) {
192 scoped_ptr
<QuicEncryptedPacket
> encrypted(framer_
.EncryptPacket(
193 ENCRYPTION_NONE
, 0, packet
));
194 return ProcessPacket(*encrypted
);
197 bool SimpleQuicFramer::ProcessPacket(const QuicEncryptedPacket
& packet
) {
198 visitor_
.reset(new SimpleFramerVisitor
);
199 framer_
.set_visitor(visitor_
.get());
200 return framer_
.ProcessPacket(packet
);
203 void SimpleQuicFramer::Reset() {
204 visitor_
.reset(new SimpleFramerVisitor
);
208 const QuicPacketHeader
& SimpleQuicFramer::header() const {
209 return visitor_
->header();
212 const QuicFecData
& SimpleQuicFramer::fec_data() const {
213 return visitor_
->fec_data();
216 const QuicVersionNegotiationPacket
*
217 SimpleQuicFramer::version_negotiation_packet() const {
218 return visitor_
->version_negotiation_packet();
221 const QuicPublicResetPacket
* SimpleQuicFramer::public_reset_packet() const {
222 return visitor_
->public_reset_packet();
225 QuicFramer
* SimpleQuicFramer::framer() {
229 size_t SimpleQuicFramer::num_frames() const {
230 return ack_frames().size() +
231 feedback_frames().size() +
232 goaway_frames().size() +
233 rst_stream_frames().size() +
234 stop_waiting_frames().size() +
235 stream_frames().size() +
236 ping_frames().size() +
237 connection_close_frames().size();
240 const vector
<QuicAckFrame
>& SimpleQuicFramer::ack_frames() const {
241 return visitor_
->ack_frames();
244 const vector
<QuicStopWaitingFrame
>&
245 SimpleQuicFramer::stop_waiting_frames() const {
246 return visitor_
->stop_waiting_frames();
249 const vector
<QuicPingFrame
>& SimpleQuicFramer::ping_frames() const {
250 return visitor_
->ping_frames();
253 const vector
<QuicStreamFrame
>& SimpleQuicFramer::stream_frames() const {
254 return visitor_
->stream_frames();
257 const vector
<QuicRstStreamFrame
>& SimpleQuicFramer::rst_stream_frames() const {
258 return visitor_
->rst_stream_frames();
261 const vector
<QuicCongestionFeedbackFrame
>&
262 SimpleQuicFramer::feedback_frames() const {
263 return visitor_
->feedback_frames();
266 const vector
<QuicGoAwayFrame
>&
267 SimpleQuicFramer::goaway_frames() const {
268 return visitor_
->goaway_frames();
271 const vector
<QuicConnectionCloseFrame
>&
272 SimpleQuicFramer::connection_close_frames() const {
273 return visitor_
->connection_close_frames();