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

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

Issue 2515143002: Removing SPDY3 from the code base. (Closed)
Patch Set: Addressed a failure on windows. Created 4 years, 1 month 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
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 #include "base/memory/ptr_util.h" 7 #include "base/memory/ptr_util.h"
8 #include "net/spdy/spdy_bug_tracker.h" 8 #include "net/spdy/spdy_bug_tracker.h"
9 9
10 namespace net { 10 namespace net {
(...skipping 29 matching lines...) Expand all
40 } 40 }
41 41
42 SpdyPriority Http2WeightToSpdy3Priority(int weight) { 42 SpdyPriority Http2WeightToSpdy3Priority(int weight) {
43 weight = ClampHttp2Weight(weight); 43 weight = ClampHttp2Weight(weight);
44 const float kSteps = 255.9f / 7.f; 44 const float kSteps = 255.9f / 7.f;
45 return static_cast<SpdyPriority>(7.f - (weight - 1) / kSteps); 45 return static_cast<SpdyPriority>(7.f - (weight - 1) / kSteps);
46 } 46 }
47 47
48 bool SpdyConstants::IsValidFrameType(SpdyMajorVersion version, 48 bool SpdyConstants::IsValidFrameType(SpdyMajorVersion version,
49 int frame_type_field) { 49 int frame_type_field) {
50 switch (version) { 50 // Check for recognized extensions.
51 case SPDY3: 51 if (frame_type_field == SerializeFrameType(version, ALTSVC) ||
52 // SYN_STREAM is the first valid frame. 52 frame_type_field == SerializeFrameType(version, BLOCKED)) {
53 if (frame_type_field < SerializeFrameType(version, SYN_STREAM)) { 53 return true;
54 return false;
55 }
56
57 // WINDOW_UPDATE is the last valid frame.
58 if (frame_type_field > SerializeFrameType(version, WINDOW_UPDATE)) {
59 return false;
60 }
61
62 return true;
63 case HTTP2:
64 // Check for recognized extensions.
65 if (frame_type_field == SerializeFrameType(version, ALTSVC) ||
66 frame_type_field == SerializeFrameType(version, BLOCKED)) {
67 return true;
68 }
69
70 // DATA is the first valid frame.
71 if (frame_type_field < SerializeFrameType(version, DATA)) {
72 return false;
73 }
74
75 // CONTINUATION is the last valid frame.
76 if (frame_type_field > SerializeFrameType(version, CONTINUATION)) {
77 return false;
78 }
79
80 return true;
81 } 54 }
82 55
83 SPDY_BUG << "Unhandled SPDY version " << version; 56 // DATA is the first valid frame.
84 return false; 57 if (frame_type_field < SerializeFrameType(version, DATA)) {
58 return false;
59 }
60
61 // CONTINUATION is the last valid frame.
62 if (frame_type_field > SerializeFrameType(version, CONTINUATION)) {
63 return false;
64 }
65
66 return true;
85 } 67 }
86 68
87 SpdyFrameType SpdyConstants::ParseFrameType(SpdyMajorVersion version, 69 SpdyFrameType SpdyConstants::ParseFrameType(SpdyMajorVersion /*version*/,
88 int frame_type_field) { 70 int frame_type_field) {
89 switch (version) { 71 switch (frame_type_field) {
90 case SPDY3: 72 case 0:
91 switch (frame_type_field) { 73 return DATA;
92 case 1: 74 case 1:
93 return SYN_STREAM; 75 return HEADERS;
94 case 2: 76 case 2:
95 return SYN_REPLY; 77 return PRIORITY;
96 case 3: 78 case 3:
97 return RST_STREAM; 79 return RST_STREAM;
98 case 4: 80 case 4:
99 return SETTINGS; 81 return SETTINGS;
100 case 6: 82 case 5:
101 return PING; 83 return PUSH_PROMISE;
102 case 7: 84 case 6:
103 return GOAWAY; 85 return PING;
104 case 8: 86 case 7:
105 return HEADERS; 87 return GOAWAY;
106 case 9: 88 case 8:
107 return WINDOW_UPDATE; 89 return WINDOW_UPDATE;
108 } 90 case 9:
109 break; 91 return CONTINUATION;
110 case HTTP2: 92 case 10:
111 switch (frame_type_field) { 93 return ALTSVC;
112 case 0: 94 case 11:
113 return DATA; 95 return BLOCKED;
114 case 1:
115 return HEADERS;
116 case 2:
117 return PRIORITY;
118 case 3:
119 return RST_STREAM;
120 case 4:
121 return SETTINGS;
122 case 5:
123 return PUSH_PROMISE;
124 case 6:
125 return PING;
126 case 7:
127 return GOAWAY;
128 case 8:
129 return WINDOW_UPDATE;
130 case 9:
131 return CONTINUATION;
132 case 10:
133 return ALTSVC;
134 case 11:
135 return BLOCKED;
136 }
137 break;
138 } 96 }
139
140 SPDY_BUG << "Unhandled frame type " << frame_type_field; 97 SPDY_BUG << "Unhandled frame type " << frame_type_field;
141 return DATA; 98 return DATA;
142 } 99 }
143 100
144 int SpdyConstants::SerializeFrameType(SpdyMajorVersion version, 101 int SpdyConstants::SerializeFrameType(SpdyMajorVersion /*version*/,
145 SpdyFrameType frame_type) { 102 SpdyFrameType frame_type) {
146 switch (version) { 103 switch (frame_type) {
147 case SPDY3: 104 case DATA:
148 switch (frame_type) { 105 return 0;
149 case SYN_STREAM: 106 case HEADERS:
150 return 1; 107 return 1;
151 case SYN_REPLY: 108 case PRIORITY:
152 return 2; 109 return 2;
153 case RST_STREAM: 110 case RST_STREAM:
154 return 3; 111 return 3;
155 case SETTINGS: 112 case SETTINGS:
156 return 4; 113 return 4;
157 case PING: 114 case PUSH_PROMISE:
158 return 6; 115 return 5;
159 case GOAWAY: 116 case PING:
160 return 7; 117 return 6;
161 case HEADERS: 118 case GOAWAY:
162 return 8; 119 return 7;
163 case WINDOW_UPDATE: 120 case WINDOW_UPDATE:
164 return 9; 121 return 8;
165 default: 122 case CONTINUATION:
166 SPDY_BUG << "Serializing unhandled frame type " << frame_type; 123 return 9;
167 return -1; 124 // ALTSVC and BLOCKED are extensions.
168 } 125 case ALTSVC:
169 case HTTP2: 126 return 10;
170 switch (frame_type) { 127 case BLOCKED:
171 case DATA: 128 return 11;
172 return 0; 129 default:
173 case HEADERS: 130 SPDY_BUG << "Serializing unhandled frame type " << frame_type;
174 return 1; 131 return -1;
175 case PRIORITY:
176 return 2;
177 case RST_STREAM:
178 return 3;
179 case SETTINGS:
180 return 4;
181 case PUSH_PROMISE:
182 return 5;
183 case PING:
184 return 6;
185 case GOAWAY:
186 return 7;
187 case WINDOW_UPDATE:
188 return 8;
189 case CONTINUATION:
190 return 9;
191 // ALTSVC and BLOCKED are extensions.
192 case ALTSVC:
193 return 10;
194 case BLOCKED:
195 return 11;
196 default:
197 SPDY_BUG << "Serializing unhandled frame type " << frame_type;
198 return -1;
199 }
200 } 132 }
201
202 SPDY_BUG << "Unhandled SPDY version " << version;
203 return -1;
204 } 133 }
205 134
206 int SpdyConstants::DataFrameType(SpdyMajorVersion version) { 135 int SpdyConstants::DataFrameType(SpdyMajorVersion version) {
207 switch (version) { 136 return SerializeFrameType(version, DATA);
208 case SPDY3:
209 return 0;
210 case HTTP2:
211 return SerializeFrameType(version, DATA);
212 }
213
214 SPDY_BUG << "Unhandled SPDY version " << version;
215 return 0;
216 } 137 }
217 138
218 bool SpdyConstants::IsValidHTTP2FrameStreamId( 139 bool SpdyConstants::IsValidHTTP2FrameStreamId(
219 SpdyStreamId current_frame_stream_id, 140 SpdyStreamId current_frame_stream_id,
220 SpdyFrameType frame_type_field) { 141 SpdyFrameType frame_type_field) {
221 if (current_frame_stream_id == 0) { 142 if (current_frame_stream_id == 0) {
222 switch (frame_type_field) { 143 switch (frame_type_field) {
223 case DATA: 144 case DATA:
224 case HEADERS: 145 case HEADERS:
225 case PRIORITY: 146 case PRIORITY:
(...skipping 13 matching lines...) Expand all
239 // These frame types must not specify a stream 160 // These frame types must not specify a stream
240 return false; 161 return false;
241 default: 162 default:
242 return true; 163 return true;
243 } 164 }
244 } 165 }
245 } 166 }
246 167
247 bool SpdyConstants::IsValidSettingId(SpdyMajorVersion version, 168 bool SpdyConstants::IsValidSettingId(SpdyMajorVersion version,
248 int setting_id_field) { 169 int setting_id_field) {
249 switch (version) { 170 // HEADER_TABLE_SIZE is the first valid setting id.
250 case SPDY3: 171 if (setting_id_field <
251 // UPLOAD_BANDWIDTH is the first valid setting id. 172 SerializeSettingId(version, SETTINGS_HEADER_TABLE_SIZE)) {
252 if (setting_id_field < 173 return false;
253 SerializeSettingId(version, SETTINGS_UPLOAD_BANDWIDTH)) {
254 return false;
255 }
256
257 // INITIAL_WINDOW_SIZE is the last valid setting id.
258 if (setting_id_field >
259 SerializeSettingId(version, SETTINGS_INITIAL_WINDOW_SIZE)) {
260 return false;
261 }
262
263 return true;
264 case HTTP2:
265 // HEADER_TABLE_SIZE is the first valid setting id.
266 if (setting_id_field <
267 SerializeSettingId(version, SETTINGS_HEADER_TABLE_SIZE)) {
268 return false;
269 }
270
271 // MAX_HEADER_LIST_SIZE is the last valid setting id.
272 if (setting_id_field >
273 SerializeSettingId(version, SETTINGS_MAX_HEADER_LIST_SIZE)) {
274 return false;
275 }
276
277 return true;
278 } 174 }
279 175
280 SPDY_BUG << "Unhandled SPDY version " << version; 176 // MAX_HEADER_LIST_SIZE is the last valid setting id.
281 return false; 177 if (setting_id_field >
178 SerializeSettingId(version, SETTINGS_MAX_HEADER_LIST_SIZE)) {
179 return false;
180 }
181
182 return true;
282 } 183 }
283 184
284 SpdySettingsIds SpdyConstants::ParseSettingId(SpdyMajorVersion version, 185 SpdySettingsIds SpdyConstants::ParseSettingId(SpdyMajorVersion /*version*/,
285 int setting_id_field) { 186 int setting_id_field) {
286 switch (version) { 187 switch (setting_id_field) {
287 case SPDY3: 188 case 1:
288 switch (setting_id_field) { 189 return SETTINGS_HEADER_TABLE_SIZE;
289 case 1: 190 case 2:
290 return SETTINGS_UPLOAD_BANDWIDTH; 191 return SETTINGS_ENABLE_PUSH;
291 case 2: 192 case 3:
292 return SETTINGS_DOWNLOAD_BANDWIDTH; 193 return SETTINGS_MAX_CONCURRENT_STREAMS;
293 case 3: 194 case 4:
294 return SETTINGS_ROUND_TRIP_TIME; 195 return SETTINGS_INITIAL_WINDOW_SIZE;
295 case 4: 196 case 5:
296 return SETTINGS_MAX_CONCURRENT_STREAMS; 197 return SETTINGS_MAX_FRAME_SIZE;
297 case 5: 198 case 6:
298 return SETTINGS_CURRENT_CWND; 199 return SETTINGS_MAX_HEADER_LIST_SIZE;
299 case 6:
300 return SETTINGS_DOWNLOAD_RETRANS_RATE;
301 case 7:
302 return SETTINGS_INITIAL_WINDOW_SIZE;
303 }
304 break;
305 case HTTP2:
306 switch (setting_id_field) {
307 case 1:
308 return SETTINGS_HEADER_TABLE_SIZE;
309 case 2:
310 return SETTINGS_ENABLE_PUSH;
311 case 3:
312 return SETTINGS_MAX_CONCURRENT_STREAMS;
313 case 4:
314 return SETTINGS_INITIAL_WINDOW_SIZE;
315 case 5:
316 return SETTINGS_MAX_FRAME_SIZE;
317 case 6:
318 return SETTINGS_MAX_HEADER_LIST_SIZE;
319 }
320 break;
321 } 200 }
322
323 SPDY_BUG << "Unhandled setting ID " << setting_id_field; 201 SPDY_BUG << "Unhandled setting ID " << setting_id_field;
324 return SETTINGS_UPLOAD_BANDWIDTH; 202 return SETTINGS_UPLOAD_BANDWIDTH;
325 } 203 }
326 204
327 int SpdyConstants::SerializeSettingId(SpdyMajorVersion version, 205 int SpdyConstants::SerializeSettingId(SpdyMajorVersion /*version*/,
328 SpdySettingsIds id) { 206 SpdySettingsIds id) {
329 switch (version) { 207 switch (id) {
330 case SPDY3: 208 case SETTINGS_HEADER_TABLE_SIZE:
331 switch (id) { 209 return 1;
332 case SETTINGS_UPLOAD_BANDWIDTH: 210 case SETTINGS_ENABLE_PUSH:
333 return 1; 211 return 2;
334 case SETTINGS_DOWNLOAD_BANDWIDTH: 212 case SETTINGS_MAX_CONCURRENT_STREAMS:
335 return 2; 213 return 3;
336 case SETTINGS_ROUND_TRIP_TIME: 214 case SETTINGS_INITIAL_WINDOW_SIZE:
337 return 3; 215 return 4;
338 case SETTINGS_MAX_CONCURRENT_STREAMS: 216 case SETTINGS_MAX_FRAME_SIZE:
339 return 4; 217 return 5;
340 case SETTINGS_CURRENT_CWND: 218 case SETTINGS_MAX_HEADER_LIST_SIZE:
341 return 5; 219 return 6;
342 case SETTINGS_DOWNLOAD_RETRANS_RATE: 220 default:
343 return 6; 221 SPDY_BUG << "Serializing unhandled setting id " << id;
344 case SETTINGS_INITIAL_WINDOW_SIZE: 222 return -1;
345 return 7;
346 default:
347 SPDY_BUG << "Serializing unhandled setting id " << id;
348 return -1;
349 }
350 case HTTP2:
351 switch (id) {
352 case SETTINGS_HEADER_TABLE_SIZE:
353 return 1;
354 case SETTINGS_ENABLE_PUSH:
355 return 2;
356 case SETTINGS_MAX_CONCURRENT_STREAMS:
357 return 3;
358 case SETTINGS_INITIAL_WINDOW_SIZE:
359 return 4;
360 case SETTINGS_MAX_FRAME_SIZE:
361 return 5;
362 case SETTINGS_MAX_HEADER_LIST_SIZE:
363 return 6;
364 default:
365 SPDY_BUG << "Serializing unhandled setting id " << id;
366 return -1;
367 }
368 } 223 }
369 SPDY_BUG << "Unhandled SPDY version " << version;
370 return -1;
371 } 224 }
372 225
373 bool SpdyConstants::IsValidRstStreamStatus(SpdyMajorVersion version, 226 bool SpdyConstants::IsValidRstStreamStatus(SpdyMajorVersion version,
374 int rst_stream_status_field) { 227 int rst_stream_status_field) {
375 switch (version) { 228 // NO_ERROR is the first valid status code.
376 case SPDY3: 229 if (rst_stream_status_field <
377 // PROTOCOL_ERROR is the valid first status code. 230 SerializeRstStreamStatus(version, RST_STREAM_NO_ERROR)) {
378 if (rst_stream_status_field < 231 return false;
379 SerializeRstStreamStatus(version, RST_STREAM_PROTOCOL_ERROR)) { 232 }
380 return false;
381 }
382 233
383 // FRAME_TOO_LARGE is the valid last status code. 234 // TODO(hkhalil): Omit COMPRESSION_ERROR and SETTINGS_TIMEOUT
384 if (rst_stream_status_field > 235 /*
385 SerializeRstStreamStatus(version, RST_STREAM_FRAME_TOO_LARGE)) { 236 // This works because GOAWAY and RST_STREAM share a namespace.
386 return false; 237 if (rst_stream_status_field ==
387 } 238 SerializeGoAwayStatus(version, GOAWAY_COMPRESSION_ERROR) ||
239 rst_stream_status_field ==
240 SerializeGoAwayStatus(version, GOAWAY_SETTINGS_TIMEOUT)) {
241 return false;
242 }
243 */
388 244
389 return true; 245 // HTTP_1_1_REQUIRED is the last valid status code.
390 case HTTP2: 246 if (rst_stream_status_field >
391 // NO_ERROR is the first valid status code. 247 SerializeRstStreamStatus(version, RST_STREAM_HTTP_1_1_REQUIRED)) {
392 if (rst_stream_status_field < 248 return false;
393 SerializeRstStreamStatus(version, RST_STREAM_NO_ERROR)) { 249 }
394 return false;
395 }
396 250
397 // TODO(hkhalil): Omit COMPRESSION_ERROR and SETTINGS_TIMEOUT 251 return true;
398 /*
399 // This works because GOAWAY and RST_STREAM share a namespace.
400 if (rst_stream_status_field ==
401 SerializeGoAwayStatus(version, GOAWAY_COMPRESSION_ERROR) ||
402 rst_stream_status_field ==
403 SerializeGoAwayStatus(version, GOAWAY_SETTINGS_TIMEOUT)) {
404 return false;
405 }
406 */
407
408 // HTTP_1_1_REQUIRED is the last valid status code.
409 if (rst_stream_status_field >
410 SerializeRstStreamStatus(version, RST_STREAM_HTTP_1_1_REQUIRED)) {
411 return false;
412 }
413
414 return true;
415 }
416 SPDY_BUG << "Unhandled SPDY version " << version;
417 return false;
418 } 252 }
419 253
420 SpdyRstStreamStatus SpdyConstants::ParseRstStreamStatus( 254 SpdyRstStreamStatus SpdyConstants::ParseRstStreamStatus(
421 SpdyMajorVersion version, 255 SpdyMajorVersion /*version*/,
422 int rst_stream_status_field) { 256 int rst_stream_status_field) {
423 switch (version) { 257 switch (rst_stream_status_field) {
424 case SPDY3: 258 case 0:
425 switch (rst_stream_status_field) { 259 return RST_STREAM_NO_ERROR;
426 case 1: 260 case 1:
427 return RST_STREAM_PROTOCOL_ERROR; 261 return RST_STREAM_PROTOCOL_ERROR;
428 case 2: 262 case 2:
429 return RST_STREAM_INVALID_STREAM; 263 return RST_STREAM_INTERNAL_ERROR;
430 case 3: 264 case 3:
431 return RST_STREAM_REFUSED_STREAM; 265 return RST_STREAM_FLOW_CONTROL_ERROR;
432 case 4: 266 case 5:
433 return RST_STREAM_UNSUPPORTED_VERSION; 267 return RST_STREAM_STREAM_CLOSED;
434 case 5: 268 case 6:
435 return RST_STREAM_CANCEL; 269 return RST_STREAM_FRAME_SIZE_ERROR;
436 case 6: 270 case 7:
437 return RST_STREAM_INTERNAL_ERROR; 271 return RST_STREAM_REFUSED_STREAM;
438 case 7: 272 case 8:
439 return RST_STREAM_FLOW_CONTROL_ERROR; 273 return RST_STREAM_CANCEL;
440 case 8: 274 case 10:
441 return RST_STREAM_STREAM_IN_USE; 275 return RST_STREAM_CONNECT_ERROR;
442 case 9: 276 case 11:
443 return RST_STREAM_STREAM_ALREADY_CLOSED; 277 return RST_STREAM_ENHANCE_YOUR_CALM;
444 case 11: 278 case 12:
445 return RST_STREAM_FRAME_TOO_LARGE; 279 return RST_STREAM_INADEQUATE_SECURITY;
446 } 280 case 13:
447 break; 281 return RST_STREAM_HTTP_1_1_REQUIRED;
448 case HTTP2:
449 switch (rst_stream_status_field) {
450 case 0:
451 return RST_STREAM_NO_ERROR;
452 case 1:
453 return RST_STREAM_PROTOCOL_ERROR;
454 case 2:
455 return RST_STREAM_INTERNAL_ERROR;
456 case 3:
457 return RST_STREAM_FLOW_CONTROL_ERROR;
458 case 5:
459 return RST_STREAM_STREAM_CLOSED;
460 case 6:
461 return RST_STREAM_FRAME_SIZE_ERROR;
462 case 7:
463 return RST_STREAM_REFUSED_STREAM;
464 case 8:
465 return RST_STREAM_CANCEL;
466 case 10:
467 return RST_STREAM_CONNECT_ERROR;
468 case 11:
469 return RST_STREAM_ENHANCE_YOUR_CALM;
470 case 12:
471 return RST_STREAM_INADEQUATE_SECURITY;
472 case 13:
473 return RST_STREAM_HTTP_1_1_REQUIRED;
474 }
475 break;
476 } 282 }
477 283
478 SPDY_BUG << "Invalid RST_STREAM status " << rst_stream_status_field; 284 SPDY_BUG << "Invalid RST_STREAM status " << rst_stream_status_field;
479 return RST_STREAM_PROTOCOL_ERROR; 285 return RST_STREAM_PROTOCOL_ERROR;
480 } 286 }
481 287
482 int SpdyConstants::SerializeRstStreamStatus( 288 int SpdyConstants::SerializeRstStreamStatus(
483 SpdyMajorVersion version, 289 SpdyMajorVersion /*version*/,
484 SpdyRstStreamStatus rst_stream_status) { 290 SpdyRstStreamStatus rst_stream_status) {
485 switch (version) { 291 switch (rst_stream_status) {
486 case SPDY3: 292 case RST_STREAM_NO_ERROR:
487 switch (rst_stream_status) { 293 return 0;
488 case RST_STREAM_PROTOCOL_ERROR: 294 case RST_STREAM_PROTOCOL_ERROR:
489 return 1; 295 return 1;
490 case RST_STREAM_INVALID_STREAM: 296 case RST_STREAM_INTERNAL_ERROR:
491 return 2; 297 return 2;
492 case RST_STREAM_REFUSED_STREAM: 298 case RST_STREAM_FLOW_CONTROL_ERROR:
493 return 3; 299 return 3;
494 case RST_STREAM_UNSUPPORTED_VERSION: 300 case RST_STREAM_STREAM_CLOSED:
495 return 4; 301 return 5;
496 case RST_STREAM_CANCEL: 302 case RST_STREAM_FRAME_SIZE_ERROR:
497 return 5; 303 return 6;
498 case RST_STREAM_INTERNAL_ERROR: 304 case RST_STREAM_REFUSED_STREAM:
499 return 6; 305 return 7;
500 case RST_STREAM_FLOW_CONTROL_ERROR: 306 case RST_STREAM_CANCEL:
501 return 7; 307 return 8;
502 case RST_STREAM_STREAM_IN_USE: 308 case RST_STREAM_CONNECT_ERROR:
503 return 8; 309 return 10;
504 case RST_STREAM_STREAM_ALREADY_CLOSED: 310 case RST_STREAM_ENHANCE_YOUR_CALM:
505 return 9; 311 return 11;
506 case RST_STREAM_FRAME_TOO_LARGE: 312 case RST_STREAM_INADEQUATE_SECURITY:
507 return 11; 313 return 12;
508 default: 314 case RST_STREAM_HTTP_1_1_REQUIRED:
509 SPDY_BUG << "Unhandled RST_STREAM status " << rst_stream_status; 315 return 13;
510 return -1; 316 default:
511 } 317 SPDY_BUG << "Unhandled RST_STREAM status " << rst_stream_status;
512 case HTTP2: 318 return -1;
513 switch (rst_stream_status) {
514 case RST_STREAM_NO_ERROR:
515 return 0;
516 case RST_STREAM_PROTOCOL_ERROR:
517 return 1;
518 case RST_STREAM_INTERNAL_ERROR:
519 return 2;
520 case RST_STREAM_FLOW_CONTROL_ERROR:
521 return 3;
522 case RST_STREAM_STREAM_CLOSED:
523 return 5;
524 case RST_STREAM_FRAME_SIZE_ERROR:
525 return 6;
526 case RST_STREAM_REFUSED_STREAM:
527 return 7;
528 case RST_STREAM_CANCEL:
529 return 8;
530 case RST_STREAM_CONNECT_ERROR:
531 return 10;
532 case RST_STREAM_ENHANCE_YOUR_CALM:
533 return 11;
534 case RST_STREAM_INADEQUATE_SECURITY:
535 return 12;
536 case RST_STREAM_HTTP_1_1_REQUIRED:
537 return 13;
538 default:
539 SPDY_BUG << "Unhandled RST_STREAM status " << rst_stream_status;
540 return -1;
541 }
542 } 319 }
543 SPDY_BUG << "Unhandled SPDY version " << version;
544 return -1;
545 } 320 }
546 321
547 bool SpdyConstants::IsValidGoAwayStatus(SpdyMajorVersion version, 322 bool SpdyConstants::IsValidGoAwayStatus(SpdyMajorVersion version,
548 int goaway_status_field) { 323 int goaway_status_field) {
549 switch (version) { 324 // GOAWAY_NO_ERROR is the first valid status.
550 case SPDY3: 325 if (goaway_status_field < SerializeGoAwayStatus(version, GOAWAY_NO_ERROR)) {
551 // GOAWAY_OK is the first valid status. 326 return false;
552 if (goaway_status_field < SerializeGoAwayStatus(version, GOAWAY_OK)) { 327 }
553 return false;
554 }
555 328
556 // GOAWAY_INTERNAL_ERROR is the last valid status. 329 // GOAWAY_HTTP_1_1_REQUIRED is the last valid status.
557 if (goaway_status_field > SerializeGoAwayStatus(version, 330 if (goaway_status_field >
558 GOAWAY_INTERNAL_ERROR)) { 331 SerializeGoAwayStatus(version, GOAWAY_HTTP_1_1_REQUIRED)) {
559 return false; 332 return false;
560 } 333 }
561 334
562 return true; 335 return true;
563 case HTTP2:
564 // GOAWAY_NO_ERROR is the first valid status.
565 if (goaway_status_field < SerializeGoAwayStatus(version,
566 GOAWAY_NO_ERROR)) {
567 return false;
568 }
569
570 // GOAWAY_HTTP_1_1_REQUIRED is the last valid status.
571 if (goaway_status_field >
572 SerializeGoAwayStatus(version, GOAWAY_HTTP_1_1_REQUIRED)) {
573 return false;
574 }
575
576 return true;
577 }
578 SPDY_BUG << "Unknown SpdyMajorVersion " << version;
579 return false;
580 } 336 }
581 337
582 SpdyGoAwayStatus SpdyConstants::ParseGoAwayStatus(SpdyMajorVersion version, 338 SpdyGoAwayStatus SpdyConstants::ParseGoAwayStatus(SpdyMajorVersion /*version*/,
583 int goaway_status_field) { 339 int goaway_status_field) {
584 switch (version) { 340 switch (goaway_status_field) {
585 case SPDY3: 341 case 0:
586 switch (goaway_status_field) { 342 return GOAWAY_NO_ERROR;
587 case 0: 343 case 1:
588 return GOAWAY_OK; 344 return GOAWAY_PROTOCOL_ERROR;
589 case 1: 345 case 2:
590 return GOAWAY_PROTOCOL_ERROR; 346 return GOAWAY_INTERNAL_ERROR;
591 case 2: 347 case 3:
592 return GOAWAY_INTERNAL_ERROR; 348 return GOAWAY_FLOW_CONTROL_ERROR;
593 } 349 case 4:
594 break; 350 return GOAWAY_SETTINGS_TIMEOUT;
595 case HTTP2: 351 case 5:
596 switch (goaway_status_field) { 352 return GOAWAY_STREAM_CLOSED;
597 case 0: 353 case 6:
598 return GOAWAY_NO_ERROR; 354 return GOAWAY_FRAME_SIZE_ERROR;
599 case 1: 355 case 7:
600 return GOAWAY_PROTOCOL_ERROR; 356 return GOAWAY_REFUSED_STREAM;
601 case 2: 357 case 8:
602 return GOAWAY_INTERNAL_ERROR; 358 return GOAWAY_CANCEL;
603 case 3: 359 case 9:
604 return GOAWAY_FLOW_CONTROL_ERROR; 360 return GOAWAY_COMPRESSION_ERROR;
605 case 4: 361 case 10:
606 return GOAWAY_SETTINGS_TIMEOUT; 362 return GOAWAY_CONNECT_ERROR;
607 case 5: 363 case 11:
608 return GOAWAY_STREAM_CLOSED; 364 return GOAWAY_ENHANCE_YOUR_CALM;
609 case 6: 365 case 12:
610 return GOAWAY_FRAME_SIZE_ERROR; 366 return GOAWAY_INADEQUATE_SECURITY;
611 case 7: 367 case 13:
612 return GOAWAY_REFUSED_STREAM; 368 return GOAWAY_HTTP_1_1_REQUIRED;
613 case 8:
614 return GOAWAY_CANCEL;
615 case 9:
616 return GOAWAY_COMPRESSION_ERROR;
617 case 10:
618 return GOAWAY_CONNECT_ERROR;
619 case 11:
620 return GOAWAY_ENHANCE_YOUR_CALM;
621 case 12:
622 return GOAWAY_INADEQUATE_SECURITY;
623 case 13:
624 return GOAWAY_HTTP_1_1_REQUIRED;
625 }
626 break;
627 } 369 }
628 370
629 SPDY_BUG << "Unhandled GOAWAY status " << goaway_status_field; 371 SPDY_BUG << "Unhandled GOAWAY status " << goaway_status_field;
630 return GOAWAY_PROTOCOL_ERROR; 372 return GOAWAY_PROTOCOL_ERROR;
631 } 373 }
632 374
633 int SpdyConstants::SerializeGoAwayStatus(SpdyMajorVersion version, 375 int SpdyConstants::SerializeGoAwayStatus(SpdyMajorVersion /*version*/,
634 SpdyGoAwayStatus status) { 376 SpdyGoAwayStatus status) {
635 switch (version) { 377 switch (status) {
636 case SPDY3: 378 case GOAWAY_NO_ERROR:
637 // TODO(jgraettinger): Merge this back to server-side. 379 return 0;
638 switch (status) { 380 case GOAWAY_PROTOCOL_ERROR:
639 case GOAWAY_NO_ERROR: 381 return 1;
640 return 0; 382 case GOAWAY_INTERNAL_ERROR:
641 case GOAWAY_PROTOCOL_ERROR: 383 return 2;
642 case GOAWAY_INTERNAL_ERROR: 384 case GOAWAY_FLOW_CONTROL_ERROR:
643 case GOAWAY_FLOW_CONTROL_ERROR: 385 return 3;
644 case GOAWAY_SETTINGS_TIMEOUT: 386 case GOAWAY_SETTINGS_TIMEOUT:
645 case GOAWAY_STREAM_CLOSED: 387 return 4;
646 case GOAWAY_FRAME_SIZE_ERROR: 388 case GOAWAY_STREAM_CLOSED:
647 case GOAWAY_REFUSED_STREAM: 389 return 5;
648 case GOAWAY_CANCEL: 390 case GOAWAY_FRAME_SIZE_ERROR:
649 case GOAWAY_COMPRESSION_ERROR: 391 return 6;
650 case GOAWAY_CONNECT_ERROR: 392 case GOAWAY_REFUSED_STREAM:
651 case GOAWAY_ENHANCE_YOUR_CALM: 393 return 7;
652 case GOAWAY_INADEQUATE_SECURITY: 394 case GOAWAY_CANCEL:
653 case GOAWAY_HTTP_1_1_REQUIRED: 395 return 8;
654 return 1; // PROTOCOL_ERROR. 396 case GOAWAY_COMPRESSION_ERROR:
655 default: 397 return 9;
656 SPDY_BUG << "Serializing unhandled GOAWAY status " << status; 398 case GOAWAY_CONNECT_ERROR:
657 return -1; 399 return 10;
658 } 400 case GOAWAY_ENHANCE_YOUR_CALM:
659 case HTTP2: 401 return 11;
660 switch (status) { 402 case GOAWAY_INADEQUATE_SECURITY:
661 case GOAWAY_NO_ERROR: 403 return 12;
662 return 0; 404 case GOAWAY_HTTP_1_1_REQUIRED:
663 case GOAWAY_PROTOCOL_ERROR: 405 return 13;
664 return 1; 406 default:
665 case GOAWAY_INTERNAL_ERROR: 407 SPDY_BUG << "Serializing unhandled GOAWAY status " << status;
666 return 2; 408 return -1;
667 case GOAWAY_FLOW_CONTROL_ERROR:
668 return 3;
669 case GOAWAY_SETTINGS_TIMEOUT:
670 return 4;
671 case GOAWAY_STREAM_CLOSED:
672 return 5;
673 case GOAWAY_FRAME_SIZE_ERROR:
674 return 6;
675 case GOAWAY_REFUSED_STREAM:
676 return 7;
677 case GOAWAY_CANCEL:
678 return 8;
679 case GOAWAY_COMPRESSION_ERROR:
680 return 9;
681 case GOAWAY_CONNECT_ERROR:
682 return 10;
683 case GOAWAY_ENHANCE_YOUR_CALM:
684 return 11;
685 case GOAWAY_INADEQUATE_SECURITY:
686 return 12;
687 case GOAWAY_HTTP_1_1_REQUIRED:
688 return 13;
689 default:
690 SPDY_BUG << "Serializing unhandled GOAWAY status " << status;
691 return -1;
692 }
693 } 409 }
694 SPDY_BUG << "Unknown SpdyMajorVersion " << version;
695 return -1;
696 } 410 }
697 411
698 size_t SpdyConstants::GetFrameHeaderSize(SpdyMajorVersion version) { 412 size_t SpdyConstants::GetFrameHeaderSize(SpdyMajorVersion /*version*/) {
699 switch (version) { 413 return 9;
700 case SPDY3:
701 return 8;
702 case HTTP2:
703 return 9;
704 }
705 SPDY_BUG << "Unhandled SPDY version: " << version;
706 return 0;
707 } 414 }
708 415
709 size_t SpdyConstants::GetDataFrameMinimumSize(SpdyMajorVersion version) { 416 size_t SpdyConstants::GetDataFrameMinimumSize(SpdyMajorVersion version) {
710 return GetFrameHeaderSize(version); 417 return GetFrameHeaderSize(version);
711 } 418 }
712 419
713 size_t SpdyConstants::GetMaxFrameSizeLimit(SpdyMajorVersion version) { 420 size_t SpdyConstants::GetMaxFrameSizeLimit(SpdyMajorVersion version) {
714 return kSpdyMaxFrameSizeLimit + GetFrameHeaderSize(version); 421 return kSpdyMaxFrameSizeLimit + GetFrameHeaderSize(version);
715 } 422 }
716 423
717 size_t SpdyConstants::GetSizeOfSizeField() { 424 size_t SpdyConstants::GetSizeOfSizeField() {
718 return sizeof(uint32_t); 425 return sizeof(uint32_t);
719 } 426 }
720 427
721 size_t SpdyConstants::GetPerHeaderOverhead(SpdyMajorVersion version) { 428 size_t SpdyConstants::GetPerHeaderOverhead(SpdyMajorVersion version) {
722 return (version == net::HTTP2) ? 32 : 0; 429 return (version == net::HTTP2) ? 32 : 0;
723 } 430 }
724 431
725 size_t SpdyConstants::GetSettingSize(SpdyMajorVersion version) { 432 size_t SpdyConstants::GetSettingSize(SpdyMajorVersion version) {
726 return version == SPDY3 ? 8 : 6; 433 return 6;
727 } 434 }
728 435
729 int32_t SpdyConstants::GetInitialStreamWindowSize(SpdyMajorVersion version) { 436 int32_t SpdyConstants::GetInitialStreamWindowSize(SpdyMajorVersion version) {
730 return (version == SPDY3) ? (64 * 1024) : (64 * 1024 - 1); 437 return 64 * 1024 - 1;
731 } 438 }
732 439
733 int32_t SpdyConstants::GetInitialSessionWindowSize(SpdyMajorVersion version) { 440 int32_t SpdyConstants::GetInitialSessionWindowSize(SpdyMajorVersion version) {
734 return (version == SPDY3) ? (64 * 1024) : (64 * 1024 - 1); 441 return 64 * 1024 - 1;
735 } 442 }
736 443
737 std::string SpdyConstants::GetVersionString(SpdyMajorVersion version) { 444 std::string SpdyConstants::GetVersionString(SpdyMajorVersion version) {
738 switch (version) { 445 switch (version) {
739 case SPDY3:
740 return "spdy/3.1";
741 case HTTP2: 446 case HTTP2:
742 return "h2"; 447 return "h2";
743 default: 448 default:
744 SPDY_BUG << "Unsupported SPDY major version: " << version; 449 SPDY_BUG << "Unsupported SPDY major version: " << version;
745 return "spdy/3.1"; 450 return "h2";
746 } 451 }
747 } 452 }
748 453
749 SpdyFrameWithHeaderBlockIR::SpdyFrameWithHeaderBlockIR( 454 SpdyFrameWithHeaderBlockIR::SpdyFrameWithHeaderBlockIR(
750 SpdyStreamId stream_id, 455 SpdyStreamId stream_id,
751 SpdyHeaderBlock header_block) 456 SpdyHeaderBlock header_block)
752 : SpdyFrameWithFinIR(stream_id), header_block_(std::move(header_block)) {} 457 : SpdyFrameWithFinIR(stream_id), header_block_(std::move(header_block)) {}
753 458
754 SpdyFrameWithHeaderBlockIR::~SpdyFrameWithHeaderBlockIR() {} 459 SpdyFrameWithHeaderBlockIR::~SpdyFrameWithHeaderBlockIR() {}
755 460
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
886 591
887 void SpdyAltSvcIR::Visit(SpdyFrameVisitor* visitor) const { 592 void SpdyAltSvcIR::Visit(SpdyFrameVisitor* visitor) const {
888 return visitor->VisitAltSvc(*this); 593 return visitor->VisitAltSvc(*this);
889 } 594 }
890 595
891 void SpdyPriorityIR::Visit(SpdyFrameVisitor* visitor) const { 596 void SpdyPriorityIR::Visit(SpdyFrameVisitor* visitor) const {
892 return visitor->VisitPriority(*this); 597 return visitor->VisitPriority(*this);
893 } 598 }
894 599
895 } // namespace net 600 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698