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/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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |