Chromium Code Reviews| 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 | 8 |
| 9 namespace spdy { | 9 namespace spdy { |
| 10 | 10 |
| 11 BufferedSpdyFramer::BufferedSpdyFramer() | 11 BufferedSpdyFramer::BufferedSpdyFramer() |
| 12 : visitor_(NULL), | 12 : visitor_(NULL), |
| 13 header_buffer_used_(0), | 13 header_buffer_used_(0), |
| 14 header_buffer_valid_(false), | 14 header_buffer_valid_(false), |
| 15 header_stream_id_(SpdyFramer::kInvalidStream) { | 15 header_stream_id_(SpdyFramer::kInvalidStream) { |
| 16 memset(header_buffer_, 0, sizeof(header_buffer_)); | 16 memset(header_buffer_, 0, sizeof(header_buffer_)); |
| 17 } | 17 } |
| 18 | 18 |
| 19 BufferedSpdyFramer::~BufferedSpdyFramer() { | 19 BufferedSpdyFramer::~BufferedSpdyFramer() { |
| 20 } | 20 } |
| 21 | 21 |
| 22 void BufferedSpdyFramer::set_visitor( | 22 void BufferedSpdyFramer::set_visitor( |
| 23 BufferedSpdyFramerVisitorInterface* visitor) { | 23 BufferedSpdyFramerVisitorInterface* visitor) { |
| 24 visitor_ = visitor; | 24 visitor_ = visitor; |
| 25 spdy_framer_.set_visitor(visitor); | 25 spdy_framer_.set_visitor(this); |
| 26 } | |
| 27 | |
| 28 void BufferedSpdyFramer::OnError(spdy::SpdyFramer* /*framer*/) { | |
| 29 visitor_->OnError(); | |
| 26 } | 30 } |
| 27 | 31 |
| 28 void BufferedSpdyFramer::OnControl(const SpdyControlFrame* frame) { | 32 void BufferedSpdyFramer::OnControl(const SpdyControlFrame* frame) { |
| 33 frames_received_++; | |
|
James Hawkins
2012/02/20 21:45:43
|frames_received_| is uninitialized.
| |
| 29 switch (frame->type()) { | 34 switch (frame->type()) { |
| 30 case SYN_STREAM: | 35 case SYN_STREAM: |
| 31 case SYN_REPLY: | 36 case SYN_REPLY: |
| 32 case HEADERS: | 37 case HEADERS: |
| 33 InitHeaderStreaming(frame); | 38 InitHeaderStreaming(frame); |
| 34 break; | 39 break; |
| 40 case spdy::GOAWAY: | |
| 41 visitor_->OnGoAway( | |
| 42 *reinterpret_cast<const spdy::SpdyGoAwayControlFrame*>(frame)); | |
| 43 break; | |
| 44 case spdy::PING: | |
| 45 visitor_->OnPing( | |
| 46 *reinterpret_cast<const spdy::SpdyPingControlFrame*>(frame)); | |
| 47 break; | |
| 48 case spdy::SETTINGS: | |
| 49 visitor_->OnSettings( | |
| 50 *reinterpret_cast<const spdy::SpdySettingsControlFrame*>(frame)); | |
| 51 break; | |
| 52 case spdy::RST_STREAM: | |
| 53 visitor_->OnRstStream( | |
| 54 *reinterpret_cast<const spdy::SpdyRstStreamControlFrame*>(frame)); | |
| 55 break; | |
| 56 case spdy::WINDOW_UPDATE: | |
| 57 visitor_->OnWindowUpdate( | |
| 58 *reinterpret_cast<const spdy::SpdyWindowUpdateControlFrame*>(frame)); | |
| 59 break; | |
| 35 default: | 60 default: |
| 36 DCHECK(false); // Error! | 61 NOTREACHED(); // Error! |
| 37 break; | |
| 38 } | 62 } |
| 39 } | 63 } |
| 40 | 64 |
| 65 bool BufferedSpdyFramer::OnCredentialFrameData(const char* frame_data, | |
| 66 size_t len) { | |
| 67 DCHECK(false); | |
| 68 return false; | |
| 69 } | |
| 70 | |
| 41 bool BufferedSpdyFramer::OnControlFrameHeaderData(SpdyStreamId stream_id, | 71 bool BufferedSpdyFramer::OnControlFrameHeaderData(SpdyStreamId stream_id, |
| 42 const char* header_data, | 72 const char* header_data, |
| 43 size_t len) { | 73 size_t len) { |
| 44 CHECK_EQ(header_stream_id_, stream_id); | 74 CHECK_EQ(header_stream_id_, stream_id); |
| 45 | 75 |
| 46 if (len == 0) { | 76 if (len == 0) { |
| 47 // Indicates end-of-header-block. | 77 // Indicates end-of-header-block. |
| 48 CHECK(header_buffer_valid_); | 78 CHECK(header_buffer_valid_); |
| 49 | 79 |
| 50 const linked_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock); | 80 const linked_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock); |
| 51 bool parsed_headers = SpdyFramer::ParseHeaderBlockInBuffer( | 81 bool parsed_headers = SpdyFramer::ParseHeaderBlockInBuffer( |
| 52 header_buffer_, header_buffer_used_, headers.get()); | 82 header_buffer_, header_buffer_used_, headers.get()); |
| 53 if (!parsed_headers) { | 83 if (!parsed_headers) { |
| 54 LOG(WARNING) << "Could not parse Spdy Control Frame Header."; | 84 LOG(WARNING) << "Could not parse Spdy Control Frame Header."; |
| 85 visitor_->OnStreamError(stream_id); | |
| 55 return false; | 86 return false; |
| 56 } | 87 } |
| 57 SpdyControlFrame* control_frame = | 88 SpdyControlFrame* control_frame = |
| 58 reinterpret_cast<SpdyControlFrame*>(control_frame_.get()); | 89 reinterpret_cast<SpdyControlFrame*>(control_frame_.get()); |
| 59 switch (control_frame->type()) { | 90 switch (control_frame->type()) { |
| 60 case SYN_STREAM: | 91 case SYN_STREAM: |
| 61 visitor_->OnSyn( | 92 visitor_->OnSynStream( |
| 62 *reinterpret_cast<const SpdySynStreamControlFrame*>( | 93 *reinterpret_cast<const SpdySynStreamControlFrame*>( |
| 63 control_frame), headers); | 94 control_frame), headers); |
| 64 break; | 95 break; |
| 65 case SYN_REPLY: | 96 case SYN_REPLY: |
| 66 visitor_->OnSynReply( | 97 visitor_->OnSynReply( |
| 67 *reinterpret_cast<const SpdySynReplyControlFrame*>( | 98 *reinterpret_cast<const SpdySynReplyControlFrame*>( |
| 68 control_frame), headers); | 99 control_frame), headers); |
| 69 break; | 100 break; |
| 70 case HEADERS: | 101 case HEADERS: |
| 71 visitor_->OnHeaders( | 102 visitor_->OnHeaders( |
| 72 *reinterpret_cast<const SpdyHeadersControlFrame*>( | 103 *reinterpret_cast<const SpdyHeadersControlFrame*>( |
| 73 control_frame), headers); | 104 control_frame), headers); |
| 74 break; | 105 break; |
| 75 default: | 106 default: |
| 76 DCHECK(false); // Error! | 107 DCHECK(false); // Error! |
| 77 break; | 108 break; |
| 78 } | 109 } |
| 79 return true; | 110 return true; |
| 80 } | 111 } |
| 81 | 112 |
| 82 const size_t available = kHeaderBufferSize - header_buffer_used_; | 113 const size_t available = kHeaderBufferSize - header_buffer_used_; |
| 83 if (len > available) { | 114 if (len > available) { |
| 84 header_buffer_valid_ = false; | 115 header_buffer_valid_ = false; |
| 116 visitor_->OnStreamError(stream_id); | |
| 85 return false; | 117 return false; |
| 86 } | 118 } |
| 87 memcpy(header_buffer_ + header_buffer_used_, header_data, len); | 119 memcpy(header_buffer_ + header_buffer_used_, header_data, len); |
| 88 header_buffer_used_ += len; | 120 header_buffer_used_ += len; |
| 89 return true; | 121 return true; |
| 90 } | 122 } |
| 91 | 123 |
| 92 void BufferedSpdyFramer::OnDataFrameHeader(const SpdyDataFrame* frame) { | 124 void BufferedSpdyFramer::OnDataFrameHeader(const SpdyDataFrame* frame) { |
| 125 frames_received_++; | |
| 93 header_stream_id_ = frame->stream_id(); | 126 header_stream_id_ = frame->stream_id(); |
| 94 } | 127 } |
| 95 | 128 |
| 129 void BufferedSpdyFramer::OnStreamFrameData(SpdyStreamId stream_id, | |
| 130 const char* data, | |
| 131 size_t len) { | |
| 132 visitor_->OnStreamFrameData(stream_id, data, len); | |
| 133 } | |
| 134 | |
| 135 | |
| 96 size_t BufferedSpdyFramer::ProcessInput(const char* data, size_t len) { | 136 size_t BufferedSpdyFramer::ProcessInput(const char* data, size_t len) { |
| 97 return spdy_framer_.ProcessInput(data, len); | 137 return spdy_framer_.ProcessInput(data, len); |
| 98 } | 138 } |
| 99 | 139 |
| 100 void BufferedSpdyFramer::Reset() { | 140 void BufferedSpdyFramer::Reset() { |
| 101 spdy_framer_.Reset(); | 141 spdy_framer_.Reset(); |
| 102 } | 142 } |
| 103 | 143 |
| 104 SpdyFramer::SpdyError BufferedSpdyFramer::error_code() const { | 144 SpdyFramer::SpdyError BufferedSpdyFramer::error_code() const { |
| 105 return spdy_framer_.error_code(); | 145 return spdy_framer_.error_code(); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 185 default: | 225 default: |
| 186 DCHECK(false); // Error! | 226 DCHECK(false); // Error! |
| 187 break; | 227 break; |
| 188 } | 228 } |
| 189 control_frame_.reset(new SpdyFrame(frame_size_without_header_block)); | 229 control_frame_.reset(new SpdyFrame(frame_size_without_header_block)); |
| 190 memcpy(control_frame_.get()->data(), frame->data(), | 230 memcpy(control_frame_.get()->data(), frame->data(), |
| 191 frame_size_without_header_block); | 231 frame_size_without_header_block); |
| 192 } | 232 } |
| 193 | 233 |
| 194 } // namespace spdy | 234 } // namespace spdy |
| OLD | NEW |