OLD | NEW |
| (Empty) |
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. | |
4 | |
5 #include "net/quic/test_tools/simple_quic_framer.h" | |
6 | |
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" | |
11 | |
12 using base::StringPiece; | |
13 using std::string; | |
14 using std::vector; | |
15 | |
16 namespace net { | |
17 namespace test { | |
18 | |
19 class SimpleFramerVisitor : public QuicFramerVisitorInterface { | |
20 public: | |
21 SimpleFramerVisitor() | |
22 : error_(QUIC_NO_ERROR) { | |
23 } | |
24 | |
25 ~SimpleFramerVisitor() override { STLDeleteElements(&stream_data_); } | |
26 | |
27 void OnError(QuicFramer* framer) override { error_ = framer->error(); } | |
28 | |
29 bool OnProtocolVersionMismatch(QuicVersion version) override { return false; } | |
30 | |
31 void OnPacket() override {} | |
32 void OnPublicResetPacket(const QuicPublicResetPacket& packet) override { | |
33 public_reset_packet_.reset(new QuicPublicResetPacket(packet)); | |
34 } | |
35 void OnVersionNegotiationPacket( | |
36 const QuicVersionNegotiationPacket& packet) override { | |
37 version_negotiation_packet_.reset( | |
38 new QuicVersionNegotiationPacket(packet)); | |
39 } | |
40 void OnRevivedPacket() override {} | |
41 | |
42 bool OnUnauthenticatedPublicHeader( | |
43 const QuicPacketPublicHeader& header) override { | |
44 return true; | |
45 } | |
46 bool OnUnauthenticatedHeader(const QuicPacketHeader& header) override { | |
47 return true; | |
48 } | |
49 void OnDecryptedPacket(EncryptionLevel level) override {} | |
50 bool OnPacketHeader(const QuicPacketHeader& header) override { | |
51 has_header_ = true; | |
52 header_ = header; | |
53 return true; | |
54 } | |
55 | |
56 void OnFecProtectedPayload(StringPiece payload) override {} | |
57 | |
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); | |
67 return true; | |
68 } | |
69 | |
70 bool OnAckFrame(const QuicAckFrame& frame) override { | |
71 ack_frames_.push_back(frame); | |
72 return true; | |
73 } | |
74 | |
75 bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) override { | |
76 stop_waiting_frames_.push_back(frame); | |
77 return true; | |
78 } | |
79 | |
80 bool OnPingFrame(const QuicPingFrame& frame) override { | |
81 ping_frames_.push_back(frame); | |
82 return true; | |
83 } | |
84 | |
85 void OnFecData(const QuicFecData& fec) override { | |
86 fec_data_ = fec; | |
87 fec_redundancy_ = fec_data_.redundancy.as_string(); | |
88 fec_data_.redundancy = fec_redundancy_; | |
89 } | |
90 | |
91 bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override { | |
92 rst_stream_frames_.push_back(frame); | |
93 return true; | |
94 } | |
95 | |
96 bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override { | |
97 connection_close_frames_.push_back(frame); | |
98 return true; | |
99 } | |
100 | |
101 bool OnGoAwayFrame(const QuicGoAwayFrame& frame) override { | |
102 goaway_frames_.push_back(frame); | |
103 return true; | |
104 } | |
105 | |
106 bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) override { | |
107 window_update_frames_.push_back(frame); | |
108 return true; | |
109 } | |
110 | |
111 bool OnBlockedFrame(const QuicBlockedFrame& frame) override { | |
112 blocked_frames_.push_back(frame); | |
113 return true; | |
114 } | |
115 | |
116 void OnPacketComplete() override {} | |
117 | |
118 const QuicPacketHeader& header() const { return header_; } | |
119 const vector<QuicAckFrame>& ack_frames() const { return ack_frames_; } | |
120 const vector<QuicConnectionCloseFrame>& connection_close_frames() const { | |
121 return connection_close_frames_; | |
122 } | |
123 const vector<QuicGoAwayFrame>& goaway_frames() const { | |
124 return goaway_frames_; | |
125 } | |
126 const vector<QuicRstStreamFrame>& rst_stream_frames() const { | |
127 return rst_stream_frames_; | |
128 } | |
129 const vector<QuicStreamFrame>& stream_frames() const { | |
130 return stream_frames_; | |
131 } | |
132 const vector<QuicStopWaitingFrame>& stop_waiting_frames() const { | |
133 return stop_waiting_frames_; | |
134 } | |
135 const vector<QuicPingFrame>& ping_frames() const { | |
136 return ping_frames_; | |
137 } | |
138 const QuicFecData& fec_data() const { | |
139 return fec_data_; | |
140 } | |
141 const QuicVersionNegotiationPacket* version_negotiation_packet() const { | |
142 return version_negotiation_packet_.get(); | |
143 } | |
144 const QuicPublicResetPacket* public_reset_packet() const { | |
145 return public_reset_packet_.get(); | |
146 } | |
147 | |
148 private: | |
149 QuicErrorCode error_; | |
150 bool has_header_; | |
151 QuicPacketHeader header_; | |
152 QuicFecData fec_data_; | |
153 scoped_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_; | |
154 scoped_ptr<QuicPublicResetPacket> public_reset_packet_; | |
155 string fec_redundancy_; | |
156 vector<QuicAckFrame> ack_frames_; | |
157 vector<QuicStopWaitingFrame> stop_waiting_frames_; | |
158 vector<QuicPingFrame> ping_frames_; | |
159 vector<QuicStreamFrame> stream_frames_; | |
160 vector<QuicRstStreamFrame> rst_stream_frames_; | |
161 vector<QuicGoAwayFrame> goaway_frames_; | |
162 vector<QuicConnectionCloseFrame> connection_close_frames_; | |
163 vector<QuicWindowUpdateFrame> window_update_frames_; | |
164 vector<QuicBlockedFrame> blocked_frames_; | |
165 vector<string*> stream_data_; | |
166 | |
167 DISALLOW_COPY_AND_ASSIGN(SimpleFramerVisitor); | |
168 }; | |
169 | |
170 SimpleQuicFramer::SimpleQuicFramer() | |
171 : framer_(QuicSupportedVersions(), QuicTime::Zero(), true) { | |
172 } | |
173 | |
174 SimpleQuicFramer::SimpleQuicFramer(const QuicVersionVector& supported_versions) | |
175 : framer_(supported_versions, QuicTime::Zero(), true) { | |
176 } | |
177 | |
178 SimpleQuicFramer::~SimpleQuicFramer() { | |
179 } | |
180 | |
181 bool SimpleQuicFramer::ProcessPacket(const QuicPacket& packet) { | |
182 scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket( | |
183 ENCRYPTION_NONE, 0, packet)); | |
184 return ProcessPacket(*encrypted); | |
185 } | |
186 | |
187 bool SimpleQuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { | |
188 visitor_.reset(new SimpleFramerVisitor); | |
189 framer_.set_visitor(visitor_.get()); | |
190 return framer_.ProcessPacket(packet); | |
191 } | |
192 | |
193 void SimpleQuicFramer::Reset() { | |
194 visitor_.reset(new SimpleFramerVisitor); | |
195 } | |
196 | |
197 | |
198 const QuicPacketHeader& SimpleQuicFramer::header() const { | |
199 return visitor_->header(); | |
200 } | |
201 | |
202 const QuicFecData& SimpleQuicFramer::fec_data() const { | |
203 return visitor_->fec_data(); | |
204 } | |
205 | |
206 const QuicVersionNegotiationPacket* | |
207 SimpleQuicFramer::version_negotiation_packet() const { | |
208 return visitor_->version_negotiation_packet(); | |
209 } | |
210 | |
211 const QuicPublicResetPacket* SimpleQuicFramer::public_reset_packet() const { | |
212 return visitor_->public_reset_packet(); | |
213 } | |
214 | |
215 QuicFramer* SimpleQuicFramer::framer() { | |
216 return &framer_; | |
217 } | |
218 | |
219 size_t SimpleQuicFramer::num_frames() const { | |
220 return ack_frames().size() + | |
221 goaway_frames().size() + | |
222 rst_stream_frames().size() + | |
223 stop_waiting_frames().size() + | |
224 stream_frames().size() + | |
225 ping_frames().size() + | |
226 connection_close_frames().size(); | |
227 } | |
228 | |
229 const vector<QuicAckFrame>& SimpleQuicFramer::ack_frames() const { | |
230 return visitor_->ack_frames(); | |
231 } | |
232 | |
233 const vector<QuicStopWaitingFrame>& | |
234 SimpleQuicFramer::stop_waiting_frames() const { | |
235 return visitor_->stop_waiting_frames(); | |
236 } | |
237 | |
238 const vector<QuicPingFrame>& SimpleQuicFramer::ping_frames() const { | |
239 return visitor_->ping_frames(); | |
240 } | |
241 | |
242 const vector<QuicStreamFrame>& SimpleQuicFramer::stream_frames() const { | |
243 return visitor_->stream_frames(); | |
244 } | |
245 | |
246 const vector<QuicRstStreamFrame>& SimpleQuicFramer::rst_stream_frames() const { | |
247 return visitor_->rst_stream_frames(); | |
248 } | |
249 | |
250 const vector<QuicGoAwayFrame>& | |
251 SimpleQuicFramer::goaway_frames() const { | |
252 return visitor_->goaway_frames(); | |
253 } | |
254 | |
255 const vector<QuicConnectionCloseFrame>& | |
256 SimpleQuicFramer::connection_close_frames() const { | |
257 return visitor_->connection_close_frames(); | |
258 } | |
259 | |
260 } // namespace test | |
261 } // namespace net | |
OLD | NEW |