OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/spdy/buffered_spdy_framer.h" | 5 #include "net/spdy/buffered_spdy_framer.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/strings/string_util.h" |
8 | 9 |
9 namespace net { | 10 namespace net { |
10 | 11 |
11 namespace { | 12 namespace { |
12 | 13 |
13 // GOAWAY frame debug data is only buffered up to this many bytes. | 14 // GOAWAY frame debug data is only buffered up to this many bytes. |
14 size_t kGoAwayDebugDataMaxSize = 1024; | 15 size_t kGoAwayDebugDataMaxSize = 1024; |
15 | 16 |
16 // Initial and maximum sizes for header block buffer. | 17 // Initial and maximum sizes for header block buffer. |
17 size_t kHeaderBufferInitialSize = 8 * 1024; | 18 size_t kHeaderBufferInitialSize = 8 * 1024; |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 void BufferedSpdyFramer::OnStreamEnd(SpdyStreamId stream_id) { | 204 void BufferedSpdyFramer::OnStreamEnd(SpdyStreamId stream_id) { |
204 visitor_->OnStreamEnd(stream_id); | 205 visitor_->OnStreamEnd(stream_id); |
205 } | 206 } |
206 | 207 |
207 void BufferedSpdyFramer::OnStreamPadding(SpdyStreamId stream_id, size_t len) { | 208 void BufferedSpdyFramer::OnStreamPadding(SpdyStreamId stream_id, size_t len) { |
208 visitor_->OnStreamPadding(stream_id, len); | 209 visitor_->OnStreamPadding(stream_id, len); |
209 } | 210 } |
210 | 211 |
211 SpdyHeadersHandlerInterface* BufferedSpdyFramer::OnHeaderFrameStart( | 212 SpdyHeadersHandlerInterface* BufferedSpdyFramer::OnHeaderFrameStart( |
212 SpdyStreamId stream_id) { | 213 SpdyStreamId stream_id) { |
213 return visitor_->OnHeaderFrameStart(stream_id); | 214 coalescer_.reset(new HeaderCoalescer()); |
| 215 return coalescer_.get(); |
214 } | 216 } |
215 | 217 |
216 void BufferedSpdyFramer::OnHeaderFrameEnd(SpdyStreamId stream_id, | 218 void BufferedSpdyFramer::OnHeaderFrameEnd(SpdyStreamId stream_id, |
217 bool end_headers) { | 219 bool end_headers) { |
218 visitor_->OnHeaderFrameEnd(stream_id, end_headers); | 220 if (coalescer_->error_seen()) { |
| 221 visitor_->OnStreamError(stream_id, |
| 222 "Could not parse Spdy Control Frame Header."); |
| 223 return; |
| 224 } |
| 225 DCHECK(control_frame_fields_.get()); |
| 226 switch (control_frame_fields_->type) { |
| 227 case SYN_STREAM: |
| 228 visitor_->OnSynStream( |
| 229 control_frame_fields_->stream_id, |
| 230 control_frame_fields_->associated_stream_id, |
| 231 control_frame_fields_->priority, control_frame_fields_->fin, |
| 232 control_frame_fields_->unidirectional, coalescer_->headers()); |
| 233 break; |
| 234 case SYN_REPLY: |
| 235 visitor_->OnSynReply(control_frame_fields_->stream_id, |
| 236 control_frame_fields_->fin, coalescer_->headers()); |
| 237 break; |
| 238 case HEADERS: |
| 239 visitor_->OnHeaders(control_frame_fields_->stream_id, |
| 240 control_frame_fields_->has_priority, |
| 241 control_frame_fields_->priority, |
| 242 control_frame_fields_->parent_stream_id, |
| 243 control_frame_fields_->exclusive, |
| 244 control_frame_fields_->fin, coalescer_->headers()); |
| 245 break; |
| 246 case PUSH_PROMISE: |
| 247 DCHECK_LT(SPDY3, protocol_version()); |
| 248 visitor_->OnPushPromise(control_frame_fields_->stream_id, |
| 249 control_frame_fields_->promised_stream_id, |
| 250 coalescer_->headers()); |
| 251 break; |
| 252 default: |
| 253 DCHECK(false) << "Unexpect control frame type: " |
| 254 << control_frame_fields_->type; |
| 255 break; |
| 256 } |
| 257 control_frame_fields_.reset(NULL); |
219 } | 258 } |
220 | 259 |
221 void BufferedSpdyFramer::OnSettings(bool clear_persisted) { | 260 void BufferedSpdyFramer::OnSettings(bool clear_persisted) { |
222 visitor_->OnSettings(clear_persisted); | 261 visitor_->OnSettings(clear_persisted); |
223 } | 262 } |
224 | 263 |
225 void BufferedSpdyFramer::OnSetting(SpdySettingsIds id, | 264 void BufferedSpdyFramer::OnSetting(SpdySettingsIds id, |
226 uint8_t flags, | 265 uint8_t flags, |
227 uint32_t value) { | 266 uint32_t value) { |
228 visitor_->OnSetting(id, flags, value); | 267 visitor_->OnSetting(id, flags, value); |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
449 } | 488 } |
450 | 489 |
451 void BufferedSpdyFramer::InitHeaderStreaming(SpdyStreamId stream_id) { | 490 void BufferedSpdyFramer::InitHeaderStreaming(SpdyStreamId stream_id) { |
452 header_buffer_.clear(); | 491 header_buffer_.clear(); |
453 header_buffer_valid_ = true; | 492 header_buffer_valid_ = true; |
454 header_stream_id_ = stream_id; | 493 header_stream_id_ = stream_id; |
455 DCHECK_NE(header_stream_id_, SpdyFramer::kInvalidStream); | 494 DCHECK_NE(header_stream_id_, SpdyFramer::kInvalidStream); |
456 } | 495 } |
457 | 496 |
458 } // namespace net | 497 } // namespace net |
OLD | NEW |