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 // This file contains some protocol structures for use with SPDY 2 and 3 | 5 // This file contains some protocol structures for use with SPDY 3 and HTTP 2 |
6 // The SPDY 2 spec can be found at: | |
7 // http://dev.chromium.org/spdy/spdy-protocol/spdy-protocol-draft2 | |
8 // The SPDY 3 spec can be found at: | 6 // The SPDY 3 spec can be found at: |
9 // http://dev.chromium.org/spdy/spdy-protocol/spdy-protocol-draft3 | 7 // http://dev.chromium.org/spdy/spdy-protocol/spdy-protocol-draft3 |
10 | 8 |
11 #ifndef NET_SPDY_SPDY_PROTOCOL_H_ | 9 #ifndef NET_SPDY_SPDY_PROTOCOL_H_ |
12 #define NET_SPDY_SPDY_PROTOCOL_H_ | 10 #define NET_SPDY_SPDY_PROTOCOL_H_ |
13 | 11 |
14 #include <stddef.h> | 12 #include <stddef.h> |
15 #include <stdint.h> | 13 #include <stdint.h> |
16 | 14 |
17 #include <limits> | 15 #include <limits> |
18 #include <map> | 16 #include <map> |
19 #include <string> | 17 #include <string> |
20 | 18 |
21 #include "base/compiler_specific.h" | 19 #include "base/compiler_specific.h" |
22 #include "base/logging.h" | 20 #include "base/logging.h" |
23 #include "base/macros.h" | 21 #include "base/macros.h" |
24 #include "base/memory/scoped_ptr.h" | 22 #include "base/memory/scoped_ptr.h" |
25 #include "base/strings/string_piece.h" | 23 #include "base/strings/string_piece.h" |
26 #include "base/sys_byteorder.h" | 24 #include "base/sys_byteorder.h" |
27 #include "net/base/net_export.h" | 25 #include "net/base/net_export.h" |
28 #include "net/spdy/spdy_alt_svc_wire_format.h" | 26 #include "net/spdy/spdy_alt_svc_wire_format.h" |
29 #include "net/spdy/spdy_bitmasks.h" | 27 #include "net/spdy/spdy_bitmasks.h" |
30 #include "net/spdy/spdy_header_block.h" | 28 #include "net/spdy/spdy_header_block.h" |
31 | 29 |
32 namespace net { | 30 namespace net { |
33 | 31 |
34 // The major versions of SPDY. Major version differences indicate | 32 // The major versions of SPDY. Major version differences indicate |
35 // framer-layer incompatibility, as opposed to minor version numbers | 33 // framer-layer incompatibility, as opposed to minor version numbers |
36 // which indicate application-layer incompatibility. Do not rely on | 34 // which indicate application-layer incompatibility. It is NOT guaranteed |
37 // the mapping from enum value SPDYn to the integer n. | 35 // that the enum value SPDYn maps to the integer n. |
38 enum SpdyMajorVersion { | 36 enum SpdyMajorVersion { |
39 SPDY2 = 2, | 37 SPDY3 = 1, |
40 SPDY_MIN_VERSION = SPDY2, | 38 SPDY_MIN_VERSION = SPDY3, |
41 SPDY3 = 3, | 39 HTTP2, |
42 HTTP2 = 4, | |
43 SPDY_MAX_VERSION = HTTP2 | 40 SPDY_MAX_VERSION = HTTP2 |
44 }; | 41 }; |
45 | 42 |
46 // A SPDY stream id is a 31 bit entity. | 43 // A SPDY stream id is a 31 bit entity. |
47 typedef uint32_t SpdyStreamId; | 44 typedef uint32_t SpdyStreamId; |
48 | 45 |
49 // Specifies the stream ID used to denote the current session (for | 46 // Specifies the stream ID used to denote the current session (for |
50 // flow control). | 47 // flow control). |
51 const SpdyStreamId kSessionFlowControlStreamId = 0; | 48 const SpdyStreamId kSessionFlowControlStreamId = 0; |
52 | 49 |
53 // The maxmium possible control frame size allowed by the spec. | 50 // The maxmium possible control frame size allowed by the spec. |
54 const int32_t kSpdyMaxControlFrameSize = (1 << 24) - 1; | 51 const int32_t kSpdyMaxControlFrameSize = (1 << 24) - 1; |
55 | 52 |
56 // The maximum control frame size we accept. | 53 // The maximum control frame size we accept. |
57 const int32_t kControlFrameSizeLimit = 1 << 14; | 54 const int32_t kControlFrameSizeLimit = 1 << 14; |
58 | 55 |
59 // Maximum window size for a Spdy stream or session. | 56 // Maximum window size for a Spdy stream or session. |
60 const int32_t kSpdyMaximumWindowSize = 0x7FFFFFFF; // Max signed 32bit int | 57 const int32_t kSpdyMaximumWindowSize = 0x7FFFFFFF; // Max signed 32bit int |
61 | 58 |
62 // Maximum padding size in octets for one DATA or HEADERS or PUSH_PROMISE frame. | 59 // Maximum padding size in octets for one DATA or HEADERS or PUSH_PROMISE frame. |
63 const int32_t kPaddingSizePerFrame = 256; | 60 const int32_t kPaddingSizePerFrame = 256; |
64 | 61 |
65 // SPDY 2 dictionary. | |
66 // This is just a hacked dictionary to use for shrinking HTTP-like headers. | |
67 const char kV2Dictionary[] = | |
68 "optionsgetheadpostputdeletetraceacceptaccept-charsetaccept-encodingaccept-" | |
69 "languageauthorizationexpectfromhostif-modified-sinceif-matchif-none-matchi" | |
70 "f-rangeif-unmodifiedsincemax-forwardsproxy-authorizationrangerefererteuser" | |
71 "-agent10010120020120220320420520630030130230330430530630740040140240340440" | |
72 "5406407408409410411412413414415416417500501502503504505accept-rangesageeta" | |
73 "glocationproxy-authenticatepublicretry-afterservervarywarningwww-authentic" | |
74 "ateallowcontent-basecontent-encodingcache-controlconnectiondatetrailertran" | |
75 "sfer-encodingupgradeviawarningcontent-languagecontent-lengthcontent-locati" | |
76 "oncontent-md5content-rangecontent-typeetagexpireslast-modifiedset-cookieMo" | |
77 "ndayTuesdayWednesdayThursdayFridaySaturdaySundayJanFebMarAprMayJunJulAugSe" | |
78 "pOctNovDecchunkedtext/htmlimage/pngimage/jpgimage/gifapplication/xmlapplic" | |
79 "ation/xhtmltext/plainpublicmax-agecharset=iso-8859-1utf-8gzipdeflateHTTP/1" | |
80 ".1statusversionurl"; | |
81 const int kV2DictionarySize = arraysize(kV2Dictionary); | |
82 | |
83 // SPDY 3 dictionary. | 62 // SPDY 3 dictionary. |
84 const char kV3Dictionary[] = { | 63 const char kV3Dictionary[] = { |
85 0x00, 0x00, 0x00, 0x07, 0x6f, 0x70, 0x74, 0x69, // ....opti | 64 0x00, 0x00, 0x00, 0x07, 0x6f, 0x70, 0x74, 0x69, // ....opti |
86 0x6f, 0x6e, 0x73, 0x00, 0x00, 0x00, 0x04, 0x68, // ons....h | 65 0x6f, 0x6e, 0x73, 0x00, 0x00, 0x00, 0x04, 0x68, // ons....h |
87 0x65, 0x61, 0x64, 0x00, 0x00, 0x00, 0x04, 0x70, // ead....p | 66 0x65, 0x61, 0x64, 0x00, 0x00, 0x00, 0x04, 0x70, // ead....p |
88 0x6f, 0x73, 0x74, 0x00, 0x00, 0x00, 0x03, 0x70, // ost....p | 67 0x6f, 0x73, 0x74, 0x00, 0x00, 0x00, 0x03, 0x70, // ost....p |
89 0x75, 0x74, 0x00, 0x00, 0x00, 0x06, 0x64, 0x65, // ut....de | 68 0x75, 0x74, 0x00, 0x00, 0x00, 0x06, 0x64, 0x65, // ut....de |
90 0x6c, 0x65, 0x74, 0x65, 0x00, 0x00, 0x00, 0x05, // lete.... | 69 0x6c, 0x65, 0x74, 0x65, 0x00, 0x00, 0x00, 0x05, // lete.... |
91 0x74, 0x72, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00, // trace... | 70 0x74, 0x72, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00, // trace... |
92 0x06, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x00, // .accept. | 71 0x06, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x00, // .accept. |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
411 GOAWAY_REFUSED_STREAM = 7, | 390 GOAWAY_REFUSED_STREAM = 7, |
412 GOAWAY_CANCEL = 8, | 391 GOAWAY_CANCEL = 8, |
413 GOAWAY_COMPRESSION_ERROR = 9, | 392 GOAWAY_COMPRESSION_ERROR = 9, |
414 GOAWAY_CONNECT_ERROR = 10, | 393 GOAWAY_CONNECT_ERROR = 10, |
415 GOAWAY_ENHANCE_YOUR_CALM = 11, | 394 GOAWAY_ENHANCE_YOUR_CALM = 11, |
416 GOAWAY_INADEQUATE_SECURITY = 12, | 395 GOAWAY_INADEQUATE_SECURITY = 12, |
417 GOAWAY_HTTP_1_1_REQUIRED = 13 | 396 GOAWAY_HTTP_1_1_REQUIRED = 13 |
418 }; | 397 }; |
419 | 398 |
420 // A SPDY priority is a number between 0 and 7 (inclusive). | 399 // A SPDY priority is a number between 0 and 7 (inclusive). |
421 // SPDY priority range is version-dependent. For SPDY 2 and below, priority is a | |
422 // number between 0 and 3. | |
423 typedef uint8_t SpdyPriority; | 400 typedef uint8_t SpdyPriority; |
424 | 401 |
425 // Lowest and Highest here refer to SPDY priorities as described in | 402 // Lowest and Highest here refer to SPDY priorities as described in |
426 | 403 |
427 // https://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft3-1#TOC-2.3.3-
Stream-priority | 404 // https://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft3-1#TOC-2.3.3-
Stream-priority |
428 const SpdyPriority kV3HighestPriority = 0; | 405 const SpdyPriority kV3HighestPriority = 0; |
429 const SpdyPriority kV3LowestPriority = 7; | 406 const SpdyPriority kV3LowestPriority = 7; |
430 | 407 |
431 typedef uint64_t SpdyPingId; | 408 typedef uint64_t SpdyPingId; |
432 | 409 |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
522 // for this value as opposed to a constant. | 499 // for this value as opposed to a constant. |
523 static size_t GetDataFrameMinimumSize(SpdyMajorVersion version); | 500 static size_t GetDataFrameMinimumSize(SpdyMajorVersion version); |
524 | 501 |
525 // Size, in bytes, of the control frame header. | 502 // Size, in bytes, of the control frame header. |
526 static size_t GetControlFrameHeaderSize(SpdyMajorVersion version); | 503 static size_t GetControlFrameHeaderSize(SpdyMajorVersion version); |
527 | 504 |
528 static size_t GetPrefixLength(SpdyFrameType type, SpdyMajorVersion version); | 505 static size_t GetPrefixLength(SpdyFrameType type, SpdyMajorVersion version); |
529 | 506 |
530 static size_t GetFrameMaximumSize(SpdyMajorVersion version); | 507 static size_t GetFrameMaximumSize(SpdyMajorVersion version); |
531 | 508 |
532 // Returns the size of a header block size field. Valid only for SPDY | 509 // Returns the size of a header block size field. Valid only for SPDY 3. |
533 // versions <= 3. | 510 static size_t GetSizeOfSizeField(); |
534 static size_t GetSizeOfSizeField(SpdyMajorVersion version); | |
535 | 511 |
536 // Returns the size (in bytes) of a wire setting ID and value. | 512 // Returns the size (in bytes) of a wire setting ID and value. |
537 static size_t GetSettingSize(SpdyMajorVersion version); | 513 static size_t GetSettingSize(SpdyMajorVersion version); |
538 | 514 |
539 // Initial window size for a stream in bytes. | 515 // Initial window size for a stream in bytes. |
540 static int32_t GetInitialStreamWindowSize(SpdyMajorVersion version); | 516 static int32_t GetInitialStreamWindowSize(SpdyMajorVersion version); |
541 | 517 |
542 // Initial window size for a session in bytes. | 518 // Initial window size for a session in bytes. |
543 static int32_t GetInitialSessionWindowSize(SpdyMajorVersion version); | 519 static int32_t GetInitialSessionWindowSize(SpdyMajorVersion version); |
544 | 520 |
(...skipping 537 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1082 SpdyFrameVisitor() {} | 1058 SpdyFrameVisitor() {} |
1083 virtual ~SpdyFrameVisitor() {} | 1059 virtual ~SpdyFrameVisitor() {} |
1084 | 1060 |
1085 private: | 1061 private: |
1086 DISALLOW_COPY_AND_ASSIGN(SpdyFrameVisitor); | 1062 DISALLOW_COPY_AND_ASSIGN(SpdyFrameVisitor); |
1087 }; | 1063 }; |
1088 | 1064 |
1089 } // namespace net | 1065 } // namespace net |
1090 | 1066 |
1091 #endif // NET_SPDY_SPDY_PROTOCOL_H_ | 1067 #endif // NET_SPDY_SPDY_PROTOCOL_H_ |
OLD | NEW |