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*) { |
| 29 visitor_->OnError(); |
26 } | 30 } |
27 | 31 |
28 void BufferedSpdyFramer::OnControl(const SpdyControlFrame* frame) { | 32 void BufferedSpdyFramer::OnControl(const SpdyControlFrame* frame) { |
| 33 frames_received_++; |
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 |