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