Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(96)

Side by Side Diff: net/spdy/buffered_spdy_framer.cc

Issue 9425023: Refactor BufferedSpdyFramer so that SpdySession is not a visitor of (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Move frame count tracking from SpdySession to BuffereSpdyFramer Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698