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 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) {} |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 return false; | 42 return false; |
43 } | 43 } |
44 | 44 |
45 // The valid range is non-contiguous. | 45 // The valid range is non-contiguous. |
46 if (frame_type_field == NOOP) { | 46 if (frame_type_field == NOOP) { |
47 return false; | 47 return false; |
48 } | 48 } |
49 | 49 |
50 return true; | 50 return true; |
51 case SPDY4: | 51 case SPDY4: |
| 52 case SPDY5: |
52 // DATA is the first valid frame. | 53 // DATA is the first valid frame. |
53 if (frame_type_field < SerializeFrameType(version, DATA)) { | 54 if (frame_type_field < SerializeFrameType(version, DATA)) { |
54 return false; | 55 return false; |
55 } | 56 } |
56 | 57 |
57 // BLOCKED is the last valid frame. | 58 // BLOCKED is the last valid frame. |
58 if (frame_type_field > SerializeFrameType(version, BLOCKED)) { | 59 if (frame_type_field > SerializeFrameType(version, BLOCKED)) { |
59 return false; | 60 return false; |
60 } | 61 } |
61 | 62 |
(...skipping 22 matching lines...) Expand all Loading... |
84 return PING; | 85 return PING; |
85 case 7: | 86 case 7: |
86 return GOAWAY; | 87 return GOAWAY; |
87 case 8: | 88 case 8: |
88 return HEADERS; | 89 return HEADERS; |
89 case 9: | 90 case 9: |
90 return WINDOW_UPDATE; | 91 return WINDOW_UPDATE; |
91 } | 92 } |
92 break; | 93 break; |
93 case SPDY4: | 94 case SPDY4: |
| 95 case SPDY5: |
94 switch (frame_type_field) { | 96 switch (frame_type_field) { |
95 case 0: | 97 case 0: |
96 return DATA; | 98 return DATA; |
97 case 1: | 99 case 1: |
98 return HEADERS; | 100 return HEADERS; |
99 // TODO(hkhalil): Add PRIORITY. | 101 // TODO(hkhalil): Add PRIORITY. |
100 case 3: | 102 case 3: |
101 return RST_STREAM; | 103 return RST_STREAM; |
102 case 4: | 104 case 4: |
103 return SETTINGS; | 105 return SETTINGS; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 return 7; | 143 return 7; |
142 case HEADERS: | 144 case HEADERS: |
143 return 8; | 145 return 8; |
144 case WINDOW_UPDATE: | 146 case WINDOW_UPDATE: |
145 return 9; | 147 return 9; |
146 default: | 148 default: |
147 LOG(DFATAL) << "Serializing unhandled frame type " << frame_type; | 149 LOG(DFATAL) << "Serializing unhandled frame type " << frame_type; |
148 return -1; | 150 return -1; |
149 } | 151 } |
150 case SPDY4: | 152 case SPDY4: |
| 153 case SPDY5: |
151 switch (frame_type) { | 154 switch (frame_type) { |
152 case DATA: | 155 case DATA: |
153 return 0; | 156 return 0; |
154 case HEADERS: | 157 case HEADERS: |
155 return 1; | 158 return 1; |
156 // TODO(hkhalil): Add PRIORITY. | 159 // TODO(hkhalil): Add PRIORITY. |
157 case RST_STREAM: | 160 case RST_STREAM: |
158 return 3; | 161 return 3; |
159 case SETTINGS: | 162 case SETTINGS: |
160 return 4; | 163 return 4; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
192 } | 195 } |
193 | 196 |
194 // INITIAL_WINDOW_SIZE is the last valid setting id. | 197 // INITIAL_WINDOW_SIZE is the last valid setting id. |
195 if (setting_id_field > | 198 if (setting_id_field > |
196 SerializeSettingId(version, SETTINGS_INITIAL_WINDOW_SIZE)) { | 199 SerializeSettingId(version, SETTINGS_INITIAL_WINDOW_SIZE)) { |
197 return false; | 200 return false; |
198 } | 201 } |
199 | 202 |
200 return true; | 203 return true; |
201 case SPDY4: | 204 case SPDY4: |
| 205 case SPDY5: |
202 // HEADER_TABLE_SIZE is the first valid setting id. | 206 // HEADER_TABLE_SIZE is the first valid setting id. |
203 if (setting_id_field < | 207 if (setting_id_field < |
204 SerializeSettingId(version, SETTINGS_HEADER_TABLE_SIZE)) { | 208 SerializeSettingId(version, SETTINGS_HEADER_TABLE_SIZE)) { |
205 return false; | 209 return false; |
206 } | 210 } |
207 | 211 |
208 // INITIAL_WINDOW_SIZE is the last valid setting id. | 212 // INITIAL_WINDOW_SIZE is the last valid setting id. |
209 if (setting_id_field > | 213 if (setting_id_field > |
210 SerializeSettingId(version, SETTINGS_INITIAL_WINDOW_SIZE)) { | 214 SerializeSettingId(version, SETTINGS_INITIAL_WINDOW_SIZE)) { |
211 return false; | 215 return false; |
(...skipping 22 matching lines...) Expand all Loading... |
234 return SETTINGS_MAX_CONCURRENT_STREAMS; | 238 return SETTINGS_MAX_CONCURRENT_STREAMS; |
235 case 5: | 239 case 5: |
236 return SETTINGS_CURRENT_CWND; | 240 return SETTINGS_CURRENT_CWND; |
237 case 6: | 241 case 6: |
238 return SETTINGS_DOWNLOAD_RETRANS_RATE; | 242 return SETTINGS_DOWNLOAD_RETRANS_RATE; |
239 case 7: | 243 case 7: |
240 return SETTINGS_INITIAL_WINDOW_SIZE; | 244 return SETTINGS_INITIAL_WINDOW_SIZE; |
241 } | 245 } |
242 break; | 246 break; |
243 case SPDY4: | 247 case SPDY4: |
| 248 case SPDY5: |
244 switch (setting_id_field) { | 249 switch (setting_id_field) { |
245 case 1: | 250 case 1: |
246 return SETTINGS_HEADER_TABLE_SIZE; | 251 return SETTINGS_HEADER_TABLE_SIZE; |
247 case 2: | 252 case 2: |
248 return SETTINGS_ENABLE_PUSH; | 253 return SETTINGS_ENABLE_PUSH; |
249 case 3: | 254 case 3: |
250 return SETTINGS_MAX_CONCURRENT_STREAMS; | 255 return SETTINGS_MAX_CONCURRENT_STREAMS; |
251 case 4: | 256 case 4: |
252 return SETTINGS_INITIAL_WINDOW_SIZE; | 257 return SETTINGS_INITIAL_WINDOW_SIZE; |
253 } | 258 } |
(...skipping 22 matching lines...) Expand all Loading... |
276 return 5; | 281 return 5; |
277 case SETTINGS_DOWNLOAD_RETRANS_RATE: | 282 case SETTINGS_DOWNLOAD_RETRANS_RATE: |
278 return 6; | 283 return 6; |
279 case SETTINGS_INITIAL_WINDOW_SIZE: | 284 case SETTINGS_INITIAL_WINDOW_SIZE: |
280 return 7; | 285 return 7; |
281 default: | 286 default: |
282 LOG(DFATAL) << "Serializing unhandled setting id " << id; | 287 LOG(DFATAL) << "Serializing unhandled setting id " << id; |
283 return -1; | 288 return -1; |
284 } | 289 } |
285 case SPDY4: | 290 case SPDY4: |
| 291 case SPDY5: |
286 switch (id) { | 292 switch (id) { |
287 case SETTINGS_HEADER_TABLE_SIZE: | 293 case SETTINGS_HEADER_TABLE_SIZE: |
288 return 1; | 294 return 1; |
289 case SETTINGS_ENABLE_PUSH: | 295 case SETTINGS_ENABLE_PUSH: |
290 return 2; | 296 return 2; |
291 case SETTINGS_MAX_CONCURRENT_STREAMS: | 297 case SETTINGS_MAX_CONCURRENT_STREAMS: |
292 return 3; | 298 return 3; |
293 case SETTINGS_INITIAL_WINDOW_SIZE: | 299 case SETTINGS_INITIAL_WINDOW_SIZE: |
294 return 4; | 300 return 4; |
295 default: | 301 default: |
(...skipping 17 matching lines...) Expand all Loading... |
313 } | 319 } |
314 | 320 |
315 // FRAME_TOO_LARGE is the valid last status code. | 321 // FRAME_TOO_LARGE is the valid last status code. |
316 if (rst_stream_status_field > | 322 if (rst_stream_status_field > |
317 SerializeRstStreamStatus(version, RST_STREAM_FRAME_TOO_LARGE)) { | 323 SerializeRstStreamStatus(version, RST_STREAM_FRAME_TOO_LARGE)) { |
318 return false; | 324 return false; |
319 } | 325 } |
320 | 326 |
321 return true; | 327 return true; |
322 case SPDY4: | 328 case SPDY4: |
| 329 case SPDY5: |
323 // NO_ERROR is the first valid status code. | 330 // NO_ERROR is the first valid status code. |
324 if (rst_stream_status_field < | 331 if (rst_stream_status_field < |
325 SerializeRstStreamStatus(version, RST_STREAM_PROTOCOL_ERROR)) { | 332 SerializeRstStreamStatus(version, RST_STREAM_PROTOCOL_ERROR)) { |
326 return false; | 333 return false; |
327 } | 334 } |
328 | 335 |
329 // TODO(hkhalil): Omit COMPRESSION_ERROR and SETTINGS_TIMEOUT | 336 // TODO(hkhalil): Omit COMPRESSION_ERROR and SETTINGS_TIMEOUT |
330 /* | 337 /* |
331 // This works because GOAWAY and RST_STREAM share a namespace. | 338 // This works because GOAWAY and RST_STREAM share a namespace. |
332 if (rst_stream_status_field == | 339 if (rst_stream_status_field == |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
372 return RST_STREAM_STREAM_IN_USE; | 379 return RST_STREAM_STREAM_IN_USE; |
373 case 9: | 380 case 9: |
374 return RST_STREAM_STREAM_ALREADY_CLOSED; | 381 return RST_STREAM_STREAM_ALREADY_CLOSED; |
375 case 10: | 382 case 10: |
376 return RST_STREAM_INVALID_CREDENTIALS; | 383 return RST_STREAM_INVALID_CREDENTIALS; |
377 case 11: | 384 case 11: |
378 return RST_STREAM_FRAME_TOO_LARGE; | 385 return RST_STREAM_FRAME_TOO_LARGE; |
379 } | 386 } |
380 break; | 387 break; |
381 case SPDY4: | 388 case SPDY4: |
| 389 case SPDY5: |
382 switch (rst_stream_status_field) { | 390 switch (rst_stream_status_field) { |
383 case 1: | 391 case 1: |
384 return RST_STREAM_PROTOCOL_ERROR; | 392 return RST_STREAM_PROTOCOL_ERROR; |
385 case 2: | 393 case 2: |
386 return RST_STREAM_INTERNAL_ERROR; | 394 return RST_STREAM_INTERNAL_ERROR; |
387 case 3: | 395 case 3: |
388 return RST_STREAM_FLOW_CONTROL_ERROR; | 396 return RST_STREAM_FLOW_CONTROL_ERROR; |
389 case 5: | 397 case 5: |
390 return RST_STREAM_STREAM_CLOSED; | 398 return RST_STREAM_STREAM_CLOSED; |
391 case 6: | 399 case 6: |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
434 case RST_STREAM_INVALID_CREDENTIALS: | 442 case RST_STREAM_INVALID_CREDENTIALS: |
435 return 10; | 443 return 10; |
436 case RST_STREAM_FRAME_TOO_LARGE: | 444 case RST_STREAM_FRAME_TOO_LARGE: |
437 return 11; | 445 return 11; |
438 default: | 446 default: |
439 LOG(DFATAL) << "Unhandled RST_STREAM status " | 447 LOG(DFATAL) << "Unhandled RST_STREAM status " |
440 << rst_stream_status; | 448 << rst_stream_status; |
441 return -1; | 449 return -1; |
442 } | 450 } |
443 case SPDY4: | 451 case SPDY4: |
| 452 case SPDY5: |
444 switch (rst_stream_status) { | 453 switch (rst_stream_status) { |
445 case RST_STREAM_PROTOCOL_ERROR: | 454 case RST_STREAM_PROTOCOL_ERROR: |
446 return 1; | 455 return 1; |
447 case RST_STREAM_INTERNAL_ERROR: | 456 case RST_STREAM_INTERNAL_ERROR: |
448 return 2; | 457 return 2; |
449 case RST_STREAM_FLOW_CONTROL_ERROR: | 458 case RST_STREAM_FLOW_CONTROL_ERROR: |
450 return 3; | 459 return 3; |
451 case RST_STREAM_STREAM_CLOSED: | 460 case RST_STREAM_STREAM_CLOSED: |
452 return 5; | 461 return 5; |
453 case RST_STREAM_FRAME_SIZE_ERROR: | 462 case RST_STREAM_FRAME_SIZE_ERROR: |
(...skipping 25 matching lines...) Expand all Loading... |
479 } | 488 } |
480 | 489 |
481 // GOAWAY_INTERNAL_ERROR is the last valid status. | 490 // GOAWAY_INTERNAL_ERROR is the last valid status. |
482 if (goaway_status_field > SerializeGoAwayStatus(version, | 491 if (goaway_status_field > SerializeGoAwayStatus(version, |
483 GOAWAY_INTERNAL_ERROR)) { | 492 GOAWAY_INTERNAL_ERROR)) { |
484 return false; | 493 return false; |
485 } | 494 } |
486 | 495 |
487 return true; | 496 return true; |
488 case SPDY4: | 497 case SPDY4: |
| 498 case SPDY5: |
489 // GOAWAY_NO_ERROR is the first valid status. | 499 // GOAWAY_NO_ERROR is the first valid status. |
490 if (goaway_status_field < SerializeGoAwayStatus(version, | 500 if (goaway_status_field < SerializeGoAwayStatus(version, |
491 GOAWAY_NO_ERROR)) { | 501 GOAWAY_NO_ERROR)) { |
492 return false; | 502 return false; |
493 } | 503 } |
494 | 504 |
495 // GOAWAY_INADEQUATE_SECURITY is the last valid status. | 505 // GOAWAY_INADEQUATE_SECURITY is the last valid status. |
496 if (goaway_status_field > | 506 if (goaway_status_field > |
497 SerializeGoAwayStatus(version, GOAWAY_INADEQUATE_SECURITY)) { | 507 SerializeGoAwayStatus(version, GOAWAY_INADEQUATE_SECURITY)) { |
498 return false; | 508 return false; |
(...skipping 11 matching lines...) Expand all Loading... |
510 switch (goaway_status_field) { | 520 switch (goaway_status_field) { |
511 case 0: | 521 case 0: |
512 return GOAWAY_OK; | 522 return GOAWAY_OK; |
513 case 1: | 523 case 1: |
514 return GOAWAY_PROTOCOL_ERROR; | 524 return GOAWAY_PROTOCOL_ERROR; |
515 case 2: | 525 case 2: |
516 return GOAWAY_INTERNAL_ERROR; | 526 return GOAWAY_INTERNAL_ERROR; |
517 } | 527 } |
518 break; | 528 break; |
519 case SPDY4: | 529 case SPDY4: |
| 530 case SPDY5: |
520 switch (goaway_status_field) { | 531 switch (goaway_status_field) { |
521 case 0: | 532 case 0: |
522 return GOAWAY_NO_ERROR; | 533 return GOAWAY_NO_ERROR; |
523 case 1: | 534 case 1: |
524 return GOAWAY_PROTOCOL_ERROR; | 535 return GOAWAY_PROTOCOL_ERROR; |
525 case 2: | 536 case 2: |
526 return GOAWAY_INTERNAL_ERROR; | 537 return GOAWAY_INTERNAL_ERROR; |
527 case 3: | 538 case 3: |
528 return GOAWAY_FLOW_CONTROL_ERROR; | 539 return GOAWAY_FLOW_CONTROL_ERROR; |
529 case 4: | 540 case 4: |
(...skipping 15 matching lines...) Expand all Loading... |
545 case 12: | 556 case 12: |
546 return GOAWAY_INADEQUATE_SECURITY; | 557 return GOAWAY_INADEQUATE_SECURITY; |
547 } | 558 } |
548 break; | 559 break; |
549 } | 560 } |
550 | 561 |
551 LOG(DFATAL) << "Unhandled GOAWAY status " << goaway_status_field; | 562 LOG(DFATAL) << "Unhandled GOAWAY status " << goaway_status_field; |
552 return GOAWAY_PROTOCOL_ERROR; | 563 return GOAWAY_PROTOCOL_ERROR; |
553 } | 564 } |
554 | 565 |
| 566 SpdyMajorVersion SpdyConstants::ParseMajorVersion(int version_number) { |
| 567 switch (version_number) { |
| 568 case 2: |
| 569 return SPDY2; |
| 570 case 3: |
| 571 return SPDY3; |
| 572 case 4: |
| 573 return SPDY4; |
| 574 case 5: |
| 575 return SPDY5; |
| 576 default: |
| 577 LOG(DFATAL) << "Unsupported SPDY version number: " << version_number; |
| 578 return SPDY3; |
| 579 } |
| 580 } |
| 581 |
| 582 int SpdyConstants::SerializeMajorVersion(SpdyMajorVersion version) { |
| 583 switch (version) { |
| 584 case SPDY2: |
| 585 return 2; |
| 586 case SPDY3: |
| 587 return 3; |
| 588 case SPDY4: |
| 589 return 4; |
| 590 case SPDY5: |
| 591 return 5; |
| 592 default: |
| 593 LOG(DFATAL) << "Unsupported SPDY major version: " << version; |
| 594 return -1; |
| 595 } |
| 596 } |
| 597 |
| 598 std::string SpdyConstants::GetVersionString(SpdyMajorVersion version) { |
| 599 switch (version) { |
| 600 case SPDY2: |
| 601 return "spdy/2"; |
| 602 case SPDY3: |
| 603 return "spdy/3"; |
| 604 case SPDY4: |
| 605 return "spdy/4"; |
| 606 case SPDY5: |
| 607 return "spdy/5"; |
| 608 default: |
| 609 LOG(DFATAL) << "Unsupported SPDY major version: " << version; |
| 610 return "spdy/3"; |
| 611 } |
| 612 } |
| 613 |
555 int SpdyConstants::SerializeGoAwayStatus(SpdyMajorVersion version, | 614 int SpdyConstants::SerializeGoAwayStatus(SpdyMajorVersion version, |
556 SpdyGoAwayStatus status) { | 615 SpdyGoAwayStatus status) { |
557 switch (version) { | 616 switch (version) { |
558 case SPDY2: | 617 case SPDY2: |
559 case SPDY3: | 618 case SPDY3: |
560 switch (status) { | 619 switch (status) { |
561 case GOAWAY_OK: | 620 case GOAWAY_OK: |
562 return 0; | 621 return 0; |
563 case GOAWAY_PROTOCOL_ERROR: | 622 case GOAWAY_PROTOCOL_ERROR: |
564 return 1; | 623 return 1; |
565 case GOAWAY_INTERNAL_ERROR: | 624 case GOAWAY_INTERNAL_ERROR: |
566 return 2; | 625 return 2; |
567 default: | 626 default: |
568 LOG(DFATAL) << "Serializing unhandled GOAWAY status " << status; | 627 LOG(DFATAL) << "Serializing unhandled GOAWAY status " << status; |
569 return -1; | 628 return -1; |
570 } | 629 } |
571 case SPDY4: | 630 case SPDY4: |
| 631 case SPDY5: |
572 switch (status) { | 632 switch (status) { |
573 case GOAWAY_NO_ERROR: | 633 case GOAWAY_NO_ERROR: |
574 return 0; | 634 return 0; |
575 case GOAWAY_PROTOCOL_ERROR: | 635 case GOAWAY_PROTOCOL_ERROR: |
576 return 1; | 636 return 1; |
577 case GOAWAY_INTERNAL_ERROR: | 637 case GOAWAY_INTERNAL_ERROR: |
578 return 2; | 638 return 2; |
579 case GOAWAY_FLOW_CONTROL_ERROR: | 639 case GOAWAY_FLOW_CONTROL_ERROR: |
580 return 3; | 640 return 3; |
581 case GOAWAY_SETTINGS_TIMEOUT: | 641 case GOAWAY_SETTINGS_TIMEOUT: |
(...skipping 23 matching lines...) Expand all Loading... |
605 | 665 |
606 size_t SpdyConstants::GetDataFrameMinimumSize() { | 666 size_t SpdyConstants::GetDataFrameMinimumSize() { |
607 return 8; | 667 return 8; |
608 } | 668 } |
609 | 669 |
610 size_t SpdyConstants::GetControlFrameHeaderSize(SpdyMajorVersion version) { | 670 size_t SpdyConstants::GetControlFrameHeaderSize(SpdyMajorVersion version) { |
611 switch (version) { | 671 switch (version) { |
612 case SPDY2: | 672 case SPDY2: |
613 case SPDY3: | 673 case SPDY3: |
614 case SPDY4: | 674 case SPDY4: |
| 675 case SPDY5: |
615 return 8; | 676 return 8; |
616 } | 677 } |
617 LOG(DFATAL) << "Unhandled SPDY version."; | 678 LOG(DFATAL) << "Unhandled SPDY version."; |
618 return 0; | 679 return 0; |
619 } | 680 } |
620 | 681 |
621 size_t SpdyConstants::GetPrefixLength(SpdyFrameType type, | 682 size_t SpdyConstants::GetPrefixLength(SpdyFrameType type, |
622 SpdyMajorVersion version) { | 683 SpdyMajorVersion version) { |
623 if (type != DATA) { | 684 if (type != DATA) { |
624 return GetControlFrameHeaderSize(version); | 685 return GetControlFrameHeaderSize(version); |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
709 | 770 |
710 void SpdyPushPromiseIR::Visit(SpdyFrameVisitor* visitor) const { | 771 void SpdyPushPromiseIR::Visit(SpdyFrameVisitor* visitor) const { |
711 return visitor->VisitPushPromise(*this); | 772 return visitor->VisitPushPromise(*this); |
712 } | 773 } |
713 | 774 |
714 void SpdyContinuationIR::Visit(SpdyFrameVisitor* visitor) const { | 775 void SpdyContinuationIR::Visit(SpdyFrameVisitor* visitor) const { |
715 return visitor->VisitContinuation(*this); | 776 return visitor->VisitContinuation(*this); |
716 } | 777 } |
717 | 778 |
718 } // namespace net | 779 } // namespace net |
OLD | NEW |