| 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 |