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

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

Issue 202403002: Land recent SPDY changes (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Sync and rebase. Back out commits included for trybot benefit, but separately landed upstream. Created 6 years, 9 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
« no previous file with comments | « net/spdy/spdy_protocol.h ('k') | net/spdy/spdy_session.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/spdy_protocol.h" 5 #include "net/spdy/spdy_protocol.h"
6 6
7 namespace net { 7 namespace net {
8 8
9 SpdyFrameWithNameValueBlockIR::SpdyFrameWithNameValueBlockIR( 9 SpdyFrameWithNameValueBlockIR::SpdyFrameWithNameValueBlockIR(
10 SpdyStreamId stream_id) : SpdyFrameWithFinIR(stream_id) {} 10 SpdyStreamId stream_id) : SpdyFrameWithFinIR(stream_id) {}
11 11
12 SpdyFrameWithNameValueBlockIR::~SpdyFrameWithNameValueBlockIR() {} 12 SpdyFrameWithNameValueBlockIR::~SpdyFrameWithNameValueBlockIR() {}
13 13
14 SpdyDataIR::SpdyDataIR(SpdyStreamId stream_id, const base::StringPiece& data) 14 SpdyDataIR::SpdyDataIR(SpdyStreamId stream_id, const base::StringPiece& data)
15 : SpdyFrameWithFinIR(stream_id) { 15 : SpdyFrameWithFinIR(stream_id),
16 pad_low_(false),
17 pad_high_(false),
18 padding_payload_len_(0) {
16 SetDataDeep(data); 19 SetDataDeep(data);
17 } 20 }
18 21
19 SpdyDataIR::SpdyDataIR(SpdyStreamId stream_id) 22 SpdyDataIR::SpdyDataIR(SpdyStreamId stream_id)
20 : SpdyFrameWithFinIR(stream_id) {} 23 : SpdyFrameWithFinIR(stream_id),
24 pad_low_(false),
25 pad_high_(false),
26 padding_payload_len_(0) {}
21 27
22 SpdyDataIR::~SpdyDataIR() {} 28 SpdyDataIR::~SpdyDataIR() {}
23 29
30 bool SpdyConstants::IsValidFrameType(SpdyMajorVersion version,
31 int frame_type_field) {
32 switch (version) {
33 case SPDY2:
34 case SPDY3:
35 // SYN_STREAM is the first valid frame.
36 if (frame_type_field < SerializeFrameType(version, SYN_STREAM)) {
37 return false;
38 }
39
40 // WINDOW_UPDATE is the last valid frame.
41 if (frame_type_field > SerializeFrameType(version, WINDOW_UPDATE)) {
42 return false;
43 }
44
45 // The valid range is non-contiguous.
46 if (frame_type_field == NOOP) {
47 return false;
48 }
49
50 return true;
51 case SPDY4:
52 // DATA is the first valid frame.
53 if (frame_type_field < SerializeFrameType(version, DATA)) {
54 return false;
55 }
56
57 // BLOCKED is the last valid frame.
58 if (frame_type_field > SerializeFrameType(version, BLOCKED)) {
59 return false;
60 }
61
62 return true;
63 }
64
65 LOG(DFATAL) << "Unhandled SPDY version " << version;
66 return false;
67 }
68
69 SpdyFrameType SpdyConstants::ParseFrameType(SpdyMajorVersion version,
70 int frame_type_field) {
71 switch (version) {
72 case SPDY2:
73 case SPDY3:
74 switch (frame_type_field) {
75 case 1:
76 return SYN_STREAM;
77 case 2:
78 return SYN_REPLY;
79 case 3:
80 return RST_STREAM;
81 case 4:
82 return SETTINGS;
83 case 6:
84 return PING;
85 case 7:
86 return GOAWAY;
87 case 8:
88 return HEADERS;
89 case 9:
90 return WINDOW_UPDATE;
91 }
92 break;
93 case SPDY4:
94 switch (frame_type_field) {
95 case 0:
96 return DATA;
97 case 1:
98 return HEADERS;
99 // TODO(hkhalil): Add PRIORITY.
100 case 3:
101 return RST_STREAM;
102 case 4:
103 return SETTINGS;
104 case 5:
105 return PUSH_PROMISE;
106 case 6:
107 return PING;
108 case 7:
109 return GOAWAY;
110 case 8:
111 return WINDOW_UPDATE;
112 case 9:
113 return CONTINUATION;
114 case 10:
115 return BLOCKED;
116 }
117 break;
118 }
119
120 LOG(DFATAL) << "Unhandled frame type " << frame_type_field;
121 return DATA;
122 }
123
124 int SpdyConstants::SerializeFrameType(SpdyMajorVersion version,
125 SpdyFrameType frame_type) {
126 switch (version) {
127 case SPDY2:
128 case SPDY3:
129 switch (frame_type) {
130 case SYN_STREAM:
131 return 1;
132 case SYN_REPLY:
133 return 2;
134 case RST_STREAM:
135 return 3;
136 case SETTINGS:
137 return 4;
138 case PING:
139 return 6;
140 case GOAWAY:
141 return 7;
142 case HEADERS:
143 return 8;
144 case WINDOW_UPDATE:
145 return 9;
146 default:
147 LOG(DFATAL) << "Serializing unhandled frame type " << frame_type;
148 return -1;
149 }
150 case SPDY4:
151 switch (frame_type) {
152 case DATA:
153 return 0;
154 case HEADERS:
155 return 1;
156 // TODO(hkhalil): Add PRIORITY.
157 case RST_STREAM:
158 return 3;
159 case SETTINGS:
160 return 4;
161 case PUSH_PROMISE:
162 return 5;
163 case PING:
164 return 6;
165 case GOAWAY:
166 return 7;
167 case WINDOW_UPDATE:
168 return 8;
169 case CONTINUATION:
170 return 9;
171 case BLOCKED:
172 return 10;
173 default:
174 LOG(DFATAL) << "Serializing unhandled frame type " << frame_type;
175 return -1;
176 }
177 }
178
179 LOG(DFATAL) << "Unhandled SPDY version " << version;
180 return -1;
181 }
182
183 bool SpdyConstants::IsValidSettingId(SpdyMajorVersion version,
184 int setting_id_field) {
185 switch (version) {
186 case SPDY2:
187 case SPDY3:
188 // UPLOAD_BANDWIDTH is the first valid setting id.
189 if (setting_id_field <
190 SerializeSettingId(version, SETTINGS_UPLOAD_BANDWIDTH)) {
191 return false;
192 }
193
194 // INITIAL_WINDOW_SIZE is the last valid setting id.
195 if (setting_id_field >
196 SerializeSettingId(version, SETTINGS_INITIAL_WINDOW_SIZE)) {
197 return false;
198 }
199
200 return true;
201 case SPDY4:
202 // HEADER_TABLE_SIZE is the first valid setting id.
203 if (setting_id_field <
204 SerializeSettingId(version, SETTINGS_HEADER_TABLE_SIZE)) {
205 return false;
206 }
207
208 // INITIAL_WINDOW_SIZE is the last valid setting id.
209 if (setting_id_field >
210 SerializeSettingId(version, SETTINGS_INITIAL_WINDOW_SIZE)) {
211 return false;
212 }
213
214 return true;
215 }
216
217 LOG(DFATAL) << "Unhandled SPDY version " << version;
218 return false;
219 }
220
221 SpdySettingsIds SpdyConstants::ParseSettingId(SpdyMajorVersion version,
222 int setting_id_field) {
223 switch (version) {
224 case SPDY2:
225 case SPDY3:
226 switch (setting_id_field) {
227 case 1:
228 return SETTINGS_UPLOAD_BANDWIDTH;
229 case 2:
230 return SETTINGS_DOWNLOAD_BANDWIDTH;
231 case 3:
232 return SETTINGS_ROUND_TRIP_TIME;
233 case 4:
234 return SETTINGS_MAX_CONCURRENT_STREAMS;
235 case 5:
236 return SETTINGS_CURRENT_CWND;
237 case 6:
238 return SETTINGS_DOWNLOAD_RETRANS_RATE;
239 case 7:
240 return SETTINGS_INITIAL_WINDOW_SIZE;
241 }
242 break;
243 case SPDY4:
244 switch (setting_id_field) {
245 case 1:
246 return SETTINGS_HEADER_TABLE_SIZE;
247 case 2:
248 return SETTINGS_ENABLE_PUSH;
249 case 3:
250 return SETTINGS_MAX_CONCURRENT_STREAMS;
251 case 4:
252 return SETTINGS_INITIAL_WINDOW_SIZE;
253 }
254 break;
255 }
256
257 LOG(DFATAL) << "Unhandled setting ID " << setting_id_field;
258 return SETTINGS_UPLOAD_BANDWIDTH;
259 }
260
261 int SpdyConstants::SerializeSettingId(SpdyMajorVersion version,
262 SpdySettingsIds id) {
263 switch (version) {
264 case SPDY2:
265 case SPDY3:
266 switch (id) {
267 case SETTINGS_UPLOAD_BANDWIDTH:
268 return 1;
269 case SETTINGS_DOWNLOAD_BANDWIDTH:
270 return 2;
271 case SETTINGS_ROUND_TRIP_TIME:
272 return 3;
273 case SETTINGS_MAX_CONCURRENT_STREAMS:
274 return 4;
275 case SETTINGS_CURRENT_CWND:
276 return 5;
277 case SETTINGS_DOWNLOAD_RETRANS_RATE:
278 return 6;
279 case SETTINGS_INITIAL_WINDOW_SIZE:
280 return 7;
281 default:
282 LOG(DFATAL) << "Serializing unhandled setting id " << id;
283 return -1;
284 }
285 case SPDY4:
286 switch (id) {
287 case SETTINGS_HEADER_TABLE_SIZE:
288 return 1;
289 case SETTINGS_ENABLE_PUSH:
290 return 2;
291 case SETTINGS_MAX_CONCURRENT_STREAMS:
292 return 3;
293 case SETTINGS_INITIAL_WINDOW_SIZE:
294 return 4;
295 default:
296 LOG(DFATAL) << "Serializing unhandled setting id " << id;
297 return -1;
298 }
299 }
300 LOG(DFATAL) << "Unhandled SPDY version " << version;
301 return -1;
302 }
303
24 void SpdyDataIR::Visit(SpdyFrameVisitor* visitor) const { 304 void SpdyDataIR::Visit(SpdyFrameVisitor* visitor) const {
25 return visitor->VisitData(*this); 305 return visitor->VisitData(*this);
26 } 306 }
27 307
28 void SpdySynStreamIR::Visit(SpdyFrameVisitor* visitor) const { 308 void SpdySynStreamIR::Visit(SpdyFrameVisitor* visitor) const {
29 return visitor->VisitSynStream(*this); 309 return visitor->VisitSynStream(*this);
30 } 310 }
31 311
32 void SpdySynReplyIR::Visit(SpdyFrameVisitor* visitor) const { 312 void SpdySynReplyIR::Visit(SpdyFrameVisitor* visitor) const {
33 return visitor->VisitSynReply(*this); 313 return visitor->VisitSynReply(*this);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 373
94 void SpdyPushPromiseIR::Visit(SpdyFrameVisitor* visitor) const { 374 void SpdyPushPromiseIR::Visit(SpdyFrameVisitor* visitor) const {
95 return visitor->VisitPushPromise(*this); 375 return visitor->VisitPushPromise(*this);
96 } 376 }
97 377
98 void SpdyContinuationIR::Visit(SpdyFrameVisitor* visitor) const { 378 void SpdyContinuationIR::Visit(SpdyFrameVisitor* visitor) const {
99 return visitor->VisitContinuation(*this); 379 return visitor->VisitContinuation(*this);
100 } 380 }
101 381
102 } // namespace net 382 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/spdy_protocol.h ('k') | net/spdy/spdy_session.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698