OLD | NEW |
| (Empty) |
1 // Copyright (c) 2016 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/spdy/spdy_framer_decoder_adapter.h" | |
6 | |
7 #include <memory> | |
8 #include <utility> | |
9 | |
10 #include "base/format_macros.h" | |
11 #include "base/logging.h" | |
12 #include "net/spdy/platform/api/spdy_estimate_memory_usage.h" | |
13 #include "net/spdy/platform/api/spdy_string_utils.h" | |
14 | |
15 #if defined(COMPILER_GCC) | |
16 #define PRETTY_THIS SpdyStringPrintf("%s@%p ", __PRETTY_FUNCTION__, this) | |
17 #elif defined(COMPILER_MSVC) | |
18 #define PRETTY_THIS SpdyStringPrintf("%s@%p ", __FUNCSIG__, this) | |
19 #else | |
20 #define PRETTY_THIS SpdyStringPrintf("%s@%p ", __func__, this) | |
21 #endif | |
22 | |
23 namespace net { | |
24 | |
25 SpdyFramerDecoderAdapter::SpdyFramerDecoderAdapter() { | |
26 DVLOG(1) << PRETTY_THIS; | |
27 } | |
28 | |
29 SpdyFramerDecoderAdapter::~SpdyFramerDecoderAdapter() { | |
30 DVLOG(1) << PRETTY_THIS; | |
31 } | |
32 | |
33 void SpdyFramerDecoderAdapter::set_visitor( | |
34 SpdyFramerVisitorInterface* visitor) { | |
35 visitor_ = visitor; | |
36 } | |
37 | |
38 void SpdyFramerDecoderAdapter::set_debug_visitor( | |
39 SpdyFramerDebugVisitorInterface* debug_visitor) { | |
40 debug_visitor_ = debug_visitor; | |
41 } | |
42 | |
43 void SpdyFramerDecoderAdapter::set_process_single_input_frame(bool v) { | |
44 process_single_input_frame_ = v; | |
45 } | |
46 | |
47 void SpdyFramerVisitorAdapter::OnError(SpdyFramer* framer) { | |
48 visitor_->OnError(framer_); | |
49 } | |
50 | |
51 void SpdyFramerVisitorAdapter::OnCommonHeader(SpdyStreamId stream_id, | |
52 size_t length, | |
53 uint8_t type, | |
54 uint8_t flags) { | |
55 visitor_->OnCommonHeader(stream_id, length, type, flags); | |
56 } | |
57 | |
58 void SpdyFramerVisitorAdapter::OnDataFrameHeader(SpdyStreamId stream_id, | |
59 size_t length, | |
60 bool fin) { | |
61 visitor_->OnDataFrameHeader(stream_id, length, fin); | |
62 } | |
63 | |
64 void SpdyFramerVisitorAdapter::OnStreamFrameData(SpdyStreamId stream_id, | |
65 const char* data, | |
66 size_t len) { | |
67 visitor_->OnStreamFrameData(stream_id, data, len); | |
68 } | |
69 | |
70 void SpdyFramerVisitorAdapter::OnStreamEnd(SpdyStreamId stream_id) { | |
71 visitor_->OnStreamEnd(stream_id); | |
72 } | |
73 | |
74 void SpdyFramerVisitorAdapter::OnStreamPadding(SpdyStreamId stream_id, | |
75 size_t len) { | |
76 visitor_->OnStreamPadding(stream_id, len); | |
77 } | |
78 | |
79 SpdyHeadersHandlerInterface* SpdyFramerVisitorAdapter::OnHeaderFrameStart( | |
80 SpdyStreamId stream_id) { | |
81 return visitor_->OnHeaderFrameStart(stream_id); | |
82 } | |
83 | |
84 void SpdyFramerVisitorAdapter::OnHeaderFrameEnd(SpdyStreamId stream_id, | |
85 bool end_headers) { | |
86 visitor_->OnHeaderFrameEnd(stream_id, end_headers); | |
87 } | |
88 | |
89 void SpdyFramerVisitorAdapter::OnRstStream(SpdyStreamId stream_id, | |
90 SpdyErrorCode error_code) { | |
91 visitor_->OnRstStream(stream_id, error_code); | |
92 } | |
93 | |
94 void SpdyFramerVisitorAdapter::OnSetting(SpdySettingsIds id, | |
95 uint32_t value) { | |
96 visitor_->OnSetting(id, value); | |
97 } | |
98 | |
99 void SpdyFramerVisitorAdapter::OnPing(SpdyPingId unique_id, bool is_ack) { | |
100 visitor_->OnPing(unique_id, is_ack); | |
101 } | |
102 | |
103 void SpdyFramerVisitorAdapter::OnSettings(bool clear_persisted) { | |
104 visitor_->OnSettings(clear_persisted); | |
105 } | |
106 | |
107 void SpdyFramerVisitorAdapter::OnSettingsAck() { | |
108 visitor_->OnSettingsAck(); | |
109 } | |
110 | |
111 void SpdyFramerVisitorAdapter::OnSettingsEnd() { | |
112 visitor_->OnSettingsEnd(); | |
113 } | |
114 | |
115 void SpdyFramerVisitorAdapter::OnGoAway(SpdyStreamId last_accepted_stream_id, | |
116 SpdyErrorCode error_code) { | |
117 visitor_->OnGoAway(last_accepted_stream_id, error_code); | |
118 } | |
119 | |
120 void SpdyFramerVisitorAdapter::OnHeaders(SpdyStreamId stream_id, | |
121 bool has_priority, | |
122 int weight, | |
123 SpdyStreamId parent_stream_id, | |
124 bool exclusive, | |
125 bool fin, | |
126 bool end) { | |
127 visitor_->OnHeaders(stream_id, has_priority, weight, parent_stream_id, | |
128 exclusive, fin, end); | |
129 } | |
130 | |
131 void SpdyFramerVisitorAdapter::OnWindowUpdate(SpdyStreamId stream_id, | |
132 int delta_window_size) { | |
133 visitor_->OnWindowUpdate(stream_id, delta_window_size); | |
134 } | |
135 | |
136 bool SpdyFramerVisitorAdapter::OnGoAwayFrameData(const char* goaway_data, | |
137 size_t len) { | |
138 return visitor_->OnGoAwayFrameData(goaway_data, len); | |
139 } | |
140 | |
141 void SpdyFramerVisitorAdapter::OnPushPromise(SpdyStreamId stream_id, | |
142 SpdyStreamId promised_stream_id, | |
143 bool end) { | |
144 visitor_->OnPushPromise(stream_id, promised_stream_id, end); | |
145 } | |
146 | |
147 void SpdyFramerVisitorAdapter::OnContinuation(SpdyStreamId stream_id, | |
148 bool end) { | |
149 visitor_->OnContinuation(stream_id, end); | |
150 } | |
151 | |
152 void SpdyFramerVisitorAdapter::OnPriority(SpdyStreamId stream_id, | |
153 SpdyStreamId parent_id, | |
154 int weight, | |
155 bool exclusive) { | |
156 visitor_->OnPriority(stream_id, parent_id, weight, exclusive); | |
157 } | |
158 | |
159 void SpdyFramerVisitorAdapter::OnAltSvc( | |
160 SpdyStreamId stream_id, | |
161 SpdyStringPiece origin, | |
162 const SpdyAltSvcWireFormat::AlternativeServiceVector& altsvc_vector) { | |
163 visitor_->OnAltSvc(stream_id, origin, altsvc_vector); | |
164 } | |
165 | |
166 bool SpdyFramerVisitorAdapter::OnUnknownFrame(SpdyStreamId stream_id, | |
167 uint8_t frame_type) { | |
168 return visitor_->OnUnknownFrame(stream_id, frame_type); | |
169 } | |
170 | |
171 class NestedSpdyFramerDecoder : public SpdyFramerDecoderAdapter { | |
172 typedef SpdyFramer::SpdyState SpdyState; | |
173 typedef SpdyFramer::SpdyFramerError SpdyFramerError; | |
174 | |
175 public: | |
176 explicit NestedSpdyFramerDecoder(SpdyFramer* outer) | |
177 : framer_(nullptr, | |
178 outer->compression_enabled() ? SpdyFramer::ENABLE_COMPRESSION | |
179 : SpdyFramer::DISABLE_COMPRESSION), | |
180 outer_(outer) { | |
181 DVLOG(1) << PRETTY_THIS; | |
182 } | |
183 ~NestedSpdyFramerDecoder() override { DVLOG(1) << PRETTY_THIS; } | |
184 | |
185 // Wrap the visitor in a SpdyFramerVisitorAdapter so that the correct | |
186 // SpdyFramer instance is passed to OnError. Passes the call on to the | |
187 // base adapter class and wrapped SpdyFramer. | |
188 void set_visitor(SpdyFramerVisitorInterface* visitor) override { | |
189 visitor_adapter_.reset(new SpdyFramerVisitorAdapter(visitor, outer_)); | |
190 SpdyFramerDecoderAdapter::set_visitor(visitor_adapter_.get()); | |
191 framer_.set_visitor(visitor_adapter_.get()); | |
192 } | |
193 | |
194 void set_extension_visitor(ExtensionVisitorInterface* visitor) override { | |
195 framer_.set_extension_visitor(visitor); | |
196 } | |
197 | |
198 // Passes the call on to the base adapter class and wrapped SpdyFramer. | |
199 void set_debug_visitor( | |
200 SpdyFramerDebugVisitorInterface* debug_visitor) override { | |
201 SpdyFramerDecoderAdapter::set_debug_visitor(debug_visitor); | |
202 framer_.set_debug_visitor(debug_visitor); | |
203 } | |
204 | |
205 // Passes the call on to the wrapped SpdyFramer. | |
206 void SetDecoderHeaderTableDebugVisitor( | |
207 std::unique_ptr<HpackHeaderTable::DebugVisitorInterface> visitor) | |
208 override { | |
209 framer_.SetDecoderHeaderTableDebugVisitor(std::move(visitor)); | |
210 } | |
211 | |
212 // Passes the call on to the base adapter class and wrapped SpdyFramer. | |
213 void set_process_single_input_frame(bool v) override { | |
214 SpdyFramerDecoderAdapter::set_process_single_input_frame(v); | |
215 framer_.set_process_single_input_frame(v); | |
216 } | |
217 | |
218 size_t ProcessInput(const char* data, size_t len) override { | |
219 DVLOG(2) << "ProcessInput(data, " << len << ")"; | |
220 size_t result = framer_.ProcessInput(data, len); | |
221 DVLOG(2) << "ProcessInput(data, " << len << ") returning " << result; | |
222 return result; | |
223 } | |
224 | |
225 void Reset() override { framer_.Reset(); } | |
226 | |
227 SpdyFramer::SpdyFramerError spdy_framer_error() const override { | |
228 return framer_.spdy_framer_error(); | |
229 } | |
230 SpdyFramer::SpdyState state() const override { return framer_.state(); } | |
231 bool probable_http_response() const override { | |
232 return framer_.probable_http_response(); | |
233 } | |
234 size_t EstimateMemoryUsage() const override { | |
235 // Skip |visitor_adapter_| because it doesn't allocate. | |
236 return SpdyEstimateMemoryUsage(framer_); | |
237 } | |
238 | |
239 private: | |
240 SpdyFramer framer_; | |
241 SpdyFramer* const outer_; | |
242 std::unique_ptr<SpdyFramerVisitorAdapter> visitor_adapter_; | |
243 }; | |
244 | |
245 std::unique_ptr<SpdyFramerDecoderAdapter> CreateNestedSpdyFramerDecoder( | |
246 SpdyFramer* outer) { | |
247 return std::unique_ptr<SpdyFramerDecoderAdapter>( | |
248 new NestedSpdyFramerDecoder(outer)); | |
249 } | |
250 | |
251 } // namespace net | |
OLD | NEW |