| 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 3 and HTTP 2 | 5 // This file contains some protocol structures for use with SPDY 3 and HTTP 2 |
| 6 // The SPDY 3 spec can be found at: | 6 // The SPDY 3 spec can be found at: |
| 7 // http://dev.chromium.org/spdy/spdy-protocol/spdy-protocol-draft3 | 7 // http://dev.chromium.org/spdy/spdy-protocol/spdy-protocol-draft3 |
| 8 | 8 |
| 9 #ifndef NET_SPDY_CORE_SPDY_PROTOCOL_H_ | 9 #ifndef NET_SPDY_CORE_SPDY_PROTOCOL_H_ |
| 10 #define NET_SPDY_CORE_SPDY_PROTOCOL_H_ | 10 #define NET_SPDY_CORE_SPDY_PROTOCOL_H_ |
| 11 | 11 |
| 12 #include <stddef.h> | 12 #include <stddef.h> |
| 13 #include <stdint.h> | 13 #include <stdint.h> |
| 14 | 14 |
| 15 #include <iosfwd> | 15 #include <iosfwd> |
| 16 #include <limits> | 16 #include <limits> |
| 17 #include <map> | 17 #include <map> |
| 18 #include <memory> | 18 #include <memory> |
| 19 #include <utility> | 19 #include <utility> |
| 20 | 20 |
| 21 #include "base/compiler_specific.h" | 21 #include "base/compiler_specific.h" |
| 22 #include "base/logging.h" | 22 #include "base/logging.h" |
| 23 #include "base/macros.h" | 23 #include "base/macros.h" |
| 24 #include "base/sys_byteorder.h" | 24 #include "base/sys_byteorder.h" |
| 25 #include "net/base/net_export.h" | |
| 26 #include "net/spdy/core/spdy_alt_svc_wire_format.h" | 25 #include "net/spdy/core/spdy_alt_svc_wire_format.h" |
| 27 #include "net/spdy/core/spdy_bitmasks.h" | 26 #include "net/spdy/core/spdy_bitmasks.h" |
| 28 #include "net/spdy/core/spdy_bug_tracker.h" | 27 #include "net/spdy/core/spdy_bug_tracker.h" |
| 29 #include "net/spdy/core/spdy_header_block.h" | 28 #include "net/spdy/core/spdy_header_block.h" |
| 29 #include "net/spdy/platform/api/spdy_export.h" |
| 30 #include "net/spdy/platform/api/spdy_string.h" | 30 #include "net/spdy/platform/api/spdy_string.h" |
| 31 #include "net/spdy/platform/api/spdy_string_piece.h" | 31 #include "net/spdy/platform/api/spdy_string_piece.h" |
| 32 | 32 |
| 33 namespace net { | 33 namespace net { |
| 34 | 34 |
| 35 // A stream id is a 31 bit entity. | 35 // A stream id is a 31 bit entity. |
| 36 typedef uint32_t SpdyStreamId; | 36 typedef uint32_t SpdyStreamId; |
| 37 | 37 |
| 38 // Specifies the stream ID used to denote the current session (for | 38 // Specifies the stream ID used to denote the current session (for |
| 39 // flow control). | 39 // flow control). |
| (...skipping 18 matching lines...) Expand all Loading... |
| 58 | 58 |
| 59 // 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. |
| 60 const int32_t kPaddingSizePerFrame = 256; | 60 const int32_t kPaddingSizePerFrame = 256; |
| 61 | 61 |
| 62 // The HTTP/2 connection preface, which must be the first bytes sent by the | 62 // The HTTP/2 connection preface, which must be the first bytes sent by the |
| 63 // client upon starting an HTTP/2 connection, and which must be followed by a | 63 // client upon starting an HTTP/2 connection, and which must be followed by a |
| 64 // SETTINGS frame. Note that even though |kHttp2ConnectionHeaderPrefix| is | 64 // SETTINGS frame. Note that even though |kHttp2ConnectionHeaderPrefix| is |
| 65 // defined as a string literal with a null terminator, the actual connection | 65 // defined as a string literal with a null terminator, the actual connection |
| 66 // preface is only the first |kHttp2ConnectionHeaderPrefixSize| bytes, which | 66 // preface is only the first |kHttp2ConnectionHeaderPrefixSize| bytes, which |
| 67 // excludes the null terminator. | 67 // excludes the null terminator. |
| 68 NET_EXPORT_PRIVATE extern const char* const kHttp2ConnectionHeaderPrefix; | 68 SPDY_EXPORT_PRIVATE extern const char* const kHttp2ConnectionHeaderPrefix; |
| 69 const int kHttp2ConnectionHeaderPrefixSize = 24; | 69 const int kHttp2ConnectionHeaderPrefixSize = 24; |
| 70 | 70 |
| 71 // Wire values for HTTP2 frame types. | 71 // Wire values for HTTP2 frame types. |
| 72 enum class SpdyFrameType : uint8_t { | 72 enum class SpdyFrameType : uint8_t { |
| 73 DATA = 0x00, | 73 DATA = 0x00, |
| 74 HEADERS = 0x01, | 74 HEADERS = 0x01, |
| 75 PRIORITY = 0x02, | 75 PRIORITY = 0x02, |
| 76 RST_STREAM = 0x03, | 76 RST_STREAM = 0x03, |
| 77 SETTINGS = 0x04, | 77 SETTINGS = 0x04, |
| 78 PUSH_PROMISE = 0x05, | 78 PUSH_PROMISE = 0x05, |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 141 SETTINGS_INITIAL_WINDOW_SIZE = 0x4, | 141 SETTINGS_INITIAL_WINDOW_SIZE = 0x4, |
| 142 // The size of the largest frame payload that a receiver is willing to accept. | 142 // The size of the largest frame payload that a receiver is willing to accept. |
| 143 SETTINGS_MAX_FRAME_SIZE = 0x5, | 143 SETTINGS_MAX_FRAME_SIZE = 0x5, |
| 144 // The maximum size of header list that the sender is prepared to accept. | 144 // The maximum size of header list that the sender is prepared to accept. |
| 145 SETTINGS_MAX_HEADER_LIST_SIZE = 0x6, | 145 SETTINGS_MAX_HEADER_LIST_SIZE = 0x6, |
| 146 SETTINGS_MAX = SETTINGS_MAX_HEADER_LIST_SIZE | 146 SETTINGS_MAX = SETTINGS_MAX_HEADER_LIST_SIZE |
| 147 }; | 147 }; |
| 148 | 148 |
| 149 // This explicit operator is needed, otherwise compiler finds | 149 // This explicit operator is needed, otherwise compiler finds |
| 150 // overloaded operator to be ambiguous. | 150 // overloaded operator to be ambiguous. |
| 151 NET_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& out, | 151 SPDY_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& out, |
| 152 SpdySettingsIds id); | 152 SpdySettingsIds id); |
| 153 | 153 |
| 154 // This operator is needed, because SpdyFrameType is an enum class, | 154 // This operator is needed, because SpdyFrameType is an enum class, |
| 155 // therefore implicit conversion to underlying integer type is not allowed. | 155 // therefore implicit conversion to underlying integer type is not allowed. |
| 156 NET_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& out, | 156 SPDY_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& out, |
| 157 SpdyFrameType frame_type); | 157 SpdyFrameType frame_type); |
| 158 | 158 |
| 159 using SettingsMap = std::map<SpdySettingsIds, uint32_t>; | 159 using SettingsMap = std::map<SpdySettingsIds, uint32_t>; |
| 160 | 160 |
| 161 // HTTP/2 error codes, RFC 7540 Section 7. | 161 // HTTP/2 error codes, RFC 7540 Section 7. |
| 162 enum SpdyErrorCode : uint32_t { | 162 enum SpdyErrorCode : uint32_t { |
| 163 ERROR_CODE_NO_ERROR = 0x0, | 163 ERROR_CODE_NO_ERROR = 0x0, |
| 164 ERROR_CODE_PROTOCOL_ERROR = 0x1, | 164 ERROR_CODE_PROTOCOL_ERROR = 0x1, |
| 165 ERROR_CODE_INTERNAL_ERROR = 0x2, | 165 ERROR_CODE_INTERNAL_ERROR = 0x2, |
| 166 ERROR_CODE_FLOW_CONTROL_ERROR = 0x3, | 166 ERROR_CODE_FLOW_CONTROL_ERROR = 0x3, |
| 167 ERROR_CODE_SETTINGS_TIMEOUT = 0x4, | 167 ERROR_CODE_SETTINGS_TIMEOUT = 0x4, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 180 // A SPDY priority is a number between 0 and 7 (inclusive). | 180 // A SPDY priority is a number between 0 and 7 (inclusive). |
| 181 typedef uint8_t SpdyPriority; | 181 typedef uint8_t SpdyPriority; |
| 182 | 182 |
| 183 // Lowest and Highest here refer to SPDY priorities as described in | 183 // Lowest and Highest here refer to SPDY priorities as described in |
| 184 | 184 |
| 185 // https://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft3-1#TOC-2.3.3-
Stream-priority | 185 // https://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft3-1#TOC-2.3.3-
Stream-priority |
| 186 const SpdyPriority kV3HighestPriority = 0; | 186 const SpdyPriority kV3HighestPriority = 0; |
| 187 const SpdyPriority kV3LowestPriority = 7; | 187 const SpdyPriority kV3LowestPriority = 7; |
| 188 | 188 |
| 189 // Returns SPDY 3.x priority value clamped to the valid range of [0, 7]. | 189 // Returns SPDY 3.x priority value clamped to the valid range of [0, 7]. |
| 190 NET_EXPORT_PRIVATE SpdyPriority ClampSpdy3Priority(SpdyPriority priority); | 190 SPDY_EXPORT_PRIVATE SpdyPriority ClampSpdy3Priority(SpdyPriority priority); |
| 191 | 191 |
| 192 // HTTP/2 stream weights are integers in range [1, 256], as specified in RFC | 192 // HTTP/2 stream weights are integers in range [1, 256], as specified in RFC |
| 193 // 7540 section 5.3.2. Default stream weight is defined in section 5.3.5. | 193 // 7540 section 5.3.2. Default stream weight is defined in section 5.3.5. |
| 194 const int kHttp2MinStreamWeight = 1; | 194 const int kHttp2MinStreamWeight = 1; |
| 195 const int kHttp2MaxStreamWeight = 256; | 195 const int kHttp2MaxStreamWeight = 256; |
| 196 const int kHttp2DefaultStreamWeight = 16; | 196 const int kHttp2DefaultStreamWeight = 16; |
| 197 | 197 |
| 198 // Returns HTTP/2 weight clamped to the valid range of [1, 256]. | 198 // Returns HTTP/2 weight clamped to the valid range of [1, 256]. |
| 199 NET_EXPORT_PRIVATE int ClampHttp2Weight(int weight); | 199 SPDY_EXPORT_PRIVATE int ClampHttp2Weight(int weight); |
| 200 | 200 |
| 201 // Maps SPDY 3.x priority value in range [0, 7] to HTTP/2 weight value in range | 201 // Maps SPDY 3.x priority value in range [0, 7] to HTTP/2 weight value in range |
| 202 // [1, 256], where priority 0 (i.e. highest precedence) corresponds to maximum | 202 // [1, 256], where priority 0 (i.e. highest precedence) corresponds to maximum |
| 203 // weight 256 and priority 7 (lowest precedence) corresponds to minimum weight | 203 // weight 256 and priority 7 (lowest precedence) corresponds to minimum weight |
| 204 // 1. | 204 // 1. |
| 205 NET_EXPORT_PRIVATE int Spdy3PriorityToHttp2Weight(SpdyPriority priority); | 205 SPDY_EXPORT_PRIVATE int Spdy3PriorityToHttp2Weight(SpdyPriority priority); |
| 206 | 206 |
| 207 // Maps HTTP/2 weight value in range [1, 256] to SPDY 3.x priority value in | 207 // Maps HTTP/2 weight value in range [1, 256] to SPDY 3.x priority value in |
| 208 // range [0, 7], where minimum weight 1 corresponds to priority 7 (lowest | 208 // range [0, 7], where minimum weight 1 corresponds to priority 7 (lowest |
| 209 // precedence) and maximum weight 256 corresponds to priority 0 (highest | 209 // precedence) and maximum weight 256 corresponds to priority 0 (highest |
| 210 // precedence). | 210 // precedence). |
| 211 NET_EXPORT_PRIVATE SpdyPriority Http2WeightToSpdy3Priority(int weight); | 211 SPDY_EXPORT_PRIVATE SpdyPriority Http2WeightToSpdy3Priority(int weight); |
| 212 | 212 |
| 213 // Reserved ID for root stream of HTTP/2 stream dependency tree, as specified | 213 // Reserved ID for root stream of HTTP/2 stream dependency tree, as specified |
| 214 // in RFC 7540 section 5.3.1. | 214 // in RFC 7540 section 5.3.1. |
| 215 const unsigned int kHttp2RootStreamId = 0; | 215 const unsigned int kHttp2RootStreamId = 0; |
| 216 | 216 |
| 217 typedef uint64_t SpdyPingId; | 217 typedef uint64_t SpdyPingId; |
| 218 | 218 |
| 219 // Returns true if a given on-the-wire enumeration of a frame type is defined | 219 // Returns true if a given on-the-wire enumeration of a frame type is defined |
| 220 // in a standardized HTTP/2 specification, false otherwise. | 220 // in a standardized HTTP/2 specification, false otherwise. |
| 221 NET_EXPORT_PRIVATE bool IsDefinedFrameType(uint8_t frame_type_field); | 221 SPDY_EXPORT_PRIVATE bool IsDefinedFrameType(uint8_t frame_type_field); |
| 222 | 222 |
| 223 // Parses a frame type from an on-the-wire enumeration. | 223 // Parses a frame type from an on-the-wire enumeration. |
| 224 // Behavior is undefined for invalid frame type fields; consumers should first | 224 // Behavior is undefined for invalid frame type fields; consumers should first |
| 225 // use IsValidFrameType() to verify validity of frame type fields. | 225 // use IsValidFrameType() to verify validity of frame type fields. |
| 226 NET_EXPORT_PRIVATE SpdyFrameType ParseFrameType(uint8_t frame_type_field); | 226 SPDY_EXPORT_PRIVATE SpdyFrameType ParseFrameType(uint8_t frame_type_field); |
| 227 | 227 |
| 228 // Serializes a frame type to the on-the-wire value. | 228 // Serializes a frame type to the on-the-wire value. |
| 229 NET_EXPORT_PRIVATE uint8_t SerializeFrameType(SpdyFrameType frame_type); | 229 SPDY_EXPORT_PRIVATE uint8_t SerializeFrameType(SpdyFrameType frame_type); |
| 230 | 230 |
| 231 // (HTTP/2) All standard frame types except WINDOW_UPDATE are | 231 // (HTTP/2) All standard frame types except WINDOW_UPDATE are |
| 232 // (stream-specific xor connection-level). Returns false iff we know | 232 // (stream-specific xor connection-level). Returns false iff we know |
| 233 // the given frame type does not align with the given streamID. | 233 // the given frame type does not align with the given streamID. |
| 234 NET_EXPORT_PRIVATE bool IsValidHTTP2FrameStreamId( | 234 SPDY_EXPORT_PRIVATE bool IsValidHTTP2FrameStreamId( |
| 235 SpdyStreamId current_frame_stream_id, | 235 SpdyStreamId current_frame_stream_id, |
| 236 SpdyFrameType frame_type_field); | 236 SpdyFrameType frame_type_field); |
| 237 | 237 |
| 238 // Serialize |frame_type| to string for logging/debugging. | 238 // Serialize |frame_type| to string for logging/debugging. |
| 239 const char* FrameTypeToString(SpdyFrameType frame_type); | 239 const char* FrameTypeToString(SpdyFrameType frame_type); |
| 240 | 240 |
| 241 // If |wire_setting_id| is the on-the-wire representation of a defined SETTINGS | 241 // If |wire_setting_id| is the on-the-wire representation of a defined SETTINGS |
| 242 // parameter, parse it to |*setting_id| and return true. | 242 // parameter, parse it to |*setting_id| and return true. |
| 243 NET_EXPORT_PRIVATE bool ParseSettingsId(uint16_t wire_setting_id, | 243 SPDY_EXPORT_PRIVATE bool ParseSettingsId(uint16_t wire_setting_id, |
| 244 SpdySettingsIds* setting_id); | 244 SpdySettingsIds* setting_id); |
| 245 | 245 |
| 246 // Return if |id| corresponds to a defined setting; | 246 // Return if |id| corresponds to a defined setting; |
| 247 // stringify |id| to |*settings_id_string| regardless. | 247 // stringify |id| to |*settings_id_string| regardless. |
| 248 NET_EXPORT_PRIVATE bool SettingsIdToString(SpdySettingsIds id, | 248 SPDY_EXPORT_PRIVATE bool SettingsIdToString(SpdySettingsIds id, |
| 249 const char** settings_id_string); | 249 const char** settings_id_string); |
| 250 | 250 |
| 251 // Parse |wire_error_code| to a SpdyErrorCode. | 251 // Parse |wire_error_code| to a SpdyErrorCode. |
| 252 // Treat unrecognized error codes as INTERNAL_ERROR | 252 // Treat unrecognized error codes as INTERNAL_ERROR |
| 253 // as recommended by the HTTP/2 specification. | 253 // as recommended by the HTTP/2 specification. |
| 254 NET_EXPORT_PRIVATE SpdyErrorCode ParseErrorCode(uint32_t wire_error_code); | 254 SPDY_EXPORT_PRIVATE SpdyErrorCode ParseErrorCode(uint32_t wire_error_code); |
| 255 | 255 |
| 256 // Serialize RST_STREAM or GOAWAY frame error code to string | 256 // Serialize RST_STREAM or GOAWAY frame error code to string |
| 257 // for logging/debugging. | 257 // for logging/debugging. |
| 258 const char* ErrorCodeToString(SpdyErrorCode error_code); | 258 const char* ErrorCodeToString(SpdyErrorCode error_code); |
| 259 | 259 |
| 260 // Number of octets in the frame header. | 260 // Number of octets in the frame header. |
| 261 const size_t kFrameHeaderSize = 9; | 261 const size_t kFrameHeaderSize = 9; |
| 262 // Size, in bytes, of the data frame header. | 262 // Size, in bytes, of the data frame header. |
| 263 const size_t kDataFrameMinimumSize = kFrameHeaderSize; | 263 const size_t kDataFrameMinimumSize = kFrameHeaderSize; |
| 264 // Maximum possible configurable size of a frame in octets. | 264 // Maximum possible configurable size of a frame in octets. |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 366 SpdyPriority spdy3_priority_; | 366 SpdyPriority spdy3_priority_; |
| 367 Http2StreamDependency http2_stream_dependency_; | 367 Http2StreamDependency http2_stream_dependency_; |
| 368 }; | 368 }; |
| 369 }; | 369 }; |
| 370 | 370 |
| 371 typedef StreamPrecedence<SpdyStreamId> SpdyStreamPrecedence; | 371 typedef StreamPrecedence<SpdyStreamId> SpdyStreamPrecedence; |
| 372 | 372 |
| 373 class SpdyFrameVisitor; | 373 class SpdyFrameVisitor; |
| 374 | 374 |
| 375 // Intermediate representation for HTTP2 frames. | 375 // Intermediate representation for HTTP2 frames. |
| 376 class NET_EXPORT_PRIVATE SpdyFrameIR { | 376 class SPDY_EXPORT_PRIVATE SpdyFrameIR { |
| 377 public: | 377 public: |
| 378 virtual ~SpdyFrameIR() {} | 378 virtual ~SpdyFrameIR() {} |
| 379 | 379 |
| 380 virtual void Visit(SpdyFrameVisitor* visitor) const = 0; | 380 virtual void Visit(SpdyFrameVisitor* visitor) const = 0; |
| 381 virtual SpdyFrameType frame_type() const = 0; | 381 virtual SpdyFrameType frame_type() const = 0; |
| 382 | 382 |
| 383 protected: | 383 protected: |
| 384 SpdyFrameIR() {} | 384 SpdyFrameIR() {} |
| 385 | 385 |
| 386 private: | 386 private: |
| 387 DISALLOW_COPY_AND_ASSIGN(SpdyFrameIR); | 387 DISALLOW_COPY_AND_ASSIGN(SpdyFrameIR); |
| 388 }; | 388 }; |
| 389 | 389 |
| 390 // Abstract class intended to be inherited by IRs that have a stream associated | 390 // Abstract class intended to be inherited by IRs that have a stream associated |
| 391 // to them. | 391 // to them. |
| 392 class NET_EXPORT_PRIVATE SpdyFrameWithStreamIdIR : public SpdyFrameIR { | 392 class SPDY_EXPORT_PRIVATE SpdyFrameWithStreamIdIR : public SpdyFrameIR { |
| 393 public: | 393 public: |
| 394 ~SpdyFrameWithStreamIdIR() override {} | 394 ~SpdyFrameWithStreamIdIR() override {} |
| 395 SpdyStreamId stream_id() const { return stream_id_; } | 395 SpdyStreamId stream_id() const { return stream_id_; } |
| 396 void set_stream_id(SpdyStreamId stream_id) { | 396 void set_stream_id(SpdyStreamId stream_id) { |
| 397 DCHECK_EQ(0u, stream_id & ~kStreamIdMask); | 397 DCHECK_EQ(0u, stream_id & ~kStreamIdMask); |
| 398 stream_id_ = stream_id; | 398 stream_id_ = stream_id; |
| 399 } | 399 } |
| 400 | 400 |
| 401 protected: | 401 protected: |
| 402 explicit SpdyFrameWithStreamIdIR(SpdyStreamId stream_id) { | 402 explicit SpdyFrameWithStreamIdIR(SpdyStreamId stream_id) { |
| 403 set_stream_id(stream_id); | 403 set_stream_id(stream_id); |
| 404 } | 404 } |
| 405 | 405 |
| 406 private: | 406 private: |
| 407 SpdyStreamId stream_id_; | 407 SpdyStreamId stream_id_; |
| 408 | 408 |
| 409 DISALLOW_COPY_AND_ASSIGN(SpdyFrameWithStreamIdIR); | 409 DISALLOW_COPY_AND_ASSIGN(SpdyFrameWithStreamIdIR); |
| 410 }; | 410 }; |
| 411 | 411 |
| 412 // Abstract class intended to be inherited by IRs that have the option of a FIN | 412 // Abstract class intended to be inherited by IRs that have the option of a FIN |
| 413 // flag. Implies SpdyFrameWithStreamIdIR. | 413 // flag. Implies SpdyFrameWithStreamIdIR. |
| 414 class NET_EXPORT_PRIVATE SpdyFrameWithFinIR : public SpdyFrameWithStreamIdIR { | 414 class SPDY_EXPORT_PRIVATE SpdyFrameWithFinIR : public SpdyFrameWithStreamIdIR { |
| 415 public: | 415 public: |
| 416 ~SpdyFrameWithFinIR() override {} | 416 ~SpdyFrameWithFinIR() override {} |
| 417 bool fin() const { return fin_; } | 417 bool fin() const { return fin_; } |
| 418 void set_fin(bool fin) { fin_ = fin; } | 418 void set_fin(bool fin) { fin_ = fin; } |
| 419 | 419 |
| 420 protected: | 420 protected: |
| 421 explicit SpdyFrameWithFinIR(SpdyStreamId stream_id) | 421 explicit SpdyFrameWithFinIR(SpdyStreamId stream_id) |
| 422 : SpdyFrameWithStreamIdIR(stream_id), | 422 : SpdyFrameWithStreamIdIR(stream_id), |
| 423 fin_(false) {} | 423 fin_(false) {} |
| 424 | 424 |
| 425 private: | 425 private: |
| 426 bool fin_; | 426 bool fin_; |
| 427 | 427 |
| 428 DISALLOW_COPY_AND_ASSIGN(SpdyFrameWithFinIR); | 428 DISALLOW_COPY_AND_ASSIGN(SpdyFrameWithFinIR); |
| 429 }; | 429 }; |
| 430 | 430 |
| 431 // Abstract class intended to be inherited by IRs that contain a header | 431 // Abstract class intended to be inherited by IRs that contain a header |
| 432 // block. Implies SpdyFrameWithFinIR. | 432 // block. Implies SpdyFrameWithFinIR. |
| 433 class NET_EXPORT_PRIVATE SpdyFrameWithHeaderBlockIR | 433 class SPDY_EXPORT_PRIVATE SpdyFrameWithHeaderBlockIR |
| 434 : public NON_EXPORTED_BASE(SpdyFrameWithFinIR) { | 434 : public NON_EXPORTED_BASE(SpdyFrameWithFinIR) { |
| 435 public: | 435 public: |
| 436 ~SpdyFrameWithHeaderBlockIR() override; | 436 ~SpdyFrameWithHeaderBlockIR() override; |
| 437 | 437 |
| 438 const SpdyHeaderBlock& header_block() const { return header_block_; } | 438 const SpdyHeaderBlock& header_block() const { return header_block_; } |
| 439 void set_header_block(SpdyHeaderBlock header_block) { | 439 void set_header_block(SpdyHeaderBlock header_block) { |
| 440 // Deep copy. | 440 // Deep copy. |
| 441 header_block_ = std::move(header_block); | 441 header_block_ = std::move(header_block); |
| 442 } | 442 } |
| 443 void SetHeader(SpdyStringPiece name, SpdyStringPiece value) { | 443 void SetHeader(SpdyStringPiece name, SpdyStringPiece value) { |
| 444 header_block_[name] = value; | 444 header_block_[name] = value; |
| 445 } | 445 } |
| 446 bool end_headers() const { return end_headers_; } | 446 bool end_headers() const { return end_headers_; } |
| 447 void set_end_headers(bool end_headers) { end_headers_ = end_headers; } | 447 void set_end_headers(bool end_headers) { end_headers_ = end_headers; } |
| 448 | 448 |
| 449 protected: | 449 protected: |
| 450 SpdyFrameWithHeaderBlockIR(SpdyStreamId stream_id, | 450 SpdyFrameWithHeaderBlockIR(SpdyStreamId stream_id, |
| 451 SpdyHeaderBlock header_block); | 451 SpdyHeaderBlock header_block); |
| 452 | 452 |
| 453 private: | 453 private: |
| 454 SpdyHeaderBlock header_block_; | 454 SpdyHeaderBlock header_block_; |
| 455 bool end_headers_ = false; | 455 bool end_headers_ = false; |
| 456 | 456 |
| 457 DISALLOW_COPY_AND_ASSIGN(SpdyFrameWithHeaderBlockIR); | 457 DISALLOW_COPY_AND_ASSIGN(SpdyFrameWithHeaderBlockIR); |
| 458 }; | 458 }; |
| 459 | 459 |
| 460 class NET_EXPORT_PRIVATE SpdyDataIR | 460 class SPDY_EXPORT_PRIVATE SpdyDataIR |
| 461 : public NON_EXPORTED_BASE(SpdyFrameWithFinIR) { | 461 : public NON_EXPORTED_BASE(SpdyFrameWithFinIR) { |
| 462 public: | 462 public: |
| 463 // Performs a deep copy on data. | 463 // Performs a deep copy on data. |
| 464 SpdyDataIR(SpdyStreamId stream_id, SpdyStringPiece data); | 464 SpdyDataIR(SpdyStreamId stream_id, SpdyStringPiece data); |
| 465 | 465 |
| 466 // Performs a deep copy on data. | 466 // Performs a deep copy on data. |
| 467 SpdyDataIR(SpdyStreamId stream_id, const char* data); | 467 SpdyDataIR(SpdyStreamId stream_id, const char* data); |
| 468 | 468 |
| 469 // Moves data into data_store_. Makes a copy if passed a non-movable string. | 469 // Moves data into data_store_. Makes a copy if passed a non-movable string. |
| 470 SpdyDataIR(SpdyStreamId stream_id, SpdyString data); | 470 SpdyDataIR(SpdyStreamId stream_id, SpdyString data); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 521 const char* data_; | 521 const char* data_; |
| 522 size_t data_len_; | 522 size_t data_len_; |
| 523 | 523 |
| 524 bool padded_; | 524 bool padded_; |
| 525 // padding_payload_len_ = desired padding length - len(padding length field). | 525 // padding_payload_len_ = desired padding length - len(padding length field). |
| 526 int padding_payload_len_; | 526 int padding_payload_len_; |
| 527 | 527 |
| 528 DISALLOW_COPY_AND_ASSIGN(SpdyDataIR); | 528 DISALLOW_COPY_AND_ASSIGN(SpdyDataIR); |
| 529 }; | 529 }; |
| 530 | 530 |
| 531 class NET_EXPORT_PRIVATE SpdyRstStreamIR : public SpdyFrameWithStreamIdIR { | 531 class SPDY_EXPORT_PRIVATE SpdyRstStreamIR : public SpdyFrameWithStreamIdIR { |
| 532 public: | 532 public: |
| 533 SpdyRstStreamIR(SpdyStreamId stream_id, SpdyErrorCode error_code); | 533 SpdyRstStreamIR(SpdyStreamId stream_id, SpdyErrorCode error_code); |
| 534 | 534 |
| 535 ~SpdyRstStreamIR() override; | 535 ~SpdyRstStreamIR() override; |
| 536 | 536 |
| 537 SpdyErrorCode error_code() const { return error_code_; } | 537 SpdyErrorCode error_code() const { return error_code_; } |
| 538 void set_error_code(SpdyErrorCode error_code) { error_code_ = error_code; } | 538 void set_error_code(SpdyErrorCode error_code) { error_code_ = error_code; } |
| 539 | 539 |
| 540 void Visit(SpdyFrameVisitor* visitor) const override; | 540 void Visit(SpdyFrameVisitor* visitor) const override; |
| 541 | 541 |
| 542 SpdyFrameType frame_type() const override; | 542 SpdyFrameType frame_type() const override; |
| 543 | 543 |
| 544 private: | 544 private: |
| 545 SpdyErrorCode error_code_; | 545 SpdyErrorCode error_code_; |
| 546 | 546 |
| 547 DISALLOW_COPY_AND_ASSIGN(SpdyRstStreamIR); | 547 DISALLOW_COPY_AND_ASSIGN(SpdyRstStreamIR); |
| 548 }; | 548 }; |
| 549 | 549 |
| 550 class NET_EXPORT_PRIVATE SpdySettingsIR : public SpdyFrameIR { | 550 class SPDY_EXPORT_PRIVATE SpdySettingsIR : public SpdyFrameIR { |
| 551 public: | 551 public: |
| 552 SpdySettingsIR(); | 552 SpdySettingsIR(); |
| 553 ~SpdySettingsIR() override; | 553 ~SpdySettingsIR() override; |
| 554 | 554 |
| 555 // Overwrites as appropriate. | 555 // Overwrites as appropriate. |
| 556 const SettingsMap& values() const { return values_; } | 556 const SettingsMap& values() const { return values_; } |
| 557 void AddSetting(SpdySettingsIds id, int32_t value) { values_[id] = value; } | 557 void AddSetting(SpdySettingsIds id, int32_t value) { values_[id] = value; } |
| 558 | 558 |
| 559 bool is_ack() const { return is_ack_; } | 559 bool is_ack() const { return is_ack_; } |
| 560 void set_is_ack(bool is_ack) { | 560 void set_is_ack(bool is_ack) { |
| 561 is_ack_ = is_ack; | 561 is_ack_ = is_ack; |
| 562 } | 562 } |
| 563 | 563 |
| 564 void Visit(SpdyFrameVisitor* visitor) const override; | 564 void Visit(SpdyFrameVisitor* visitor) const override; |
| 565 | 565 |
| 566 SpdyFrameType frame_type() const override; | 566 SpdyFrameType frame_type() const override; |
| 567 | 567 |
| 568 private: | 568 private: |
| 569 SettingsMap values_; | 569 SettingsMap values_; |
| 570 bool is_ack_; | 570 bool is_ack_; |
| 571 | 571 |
| 572 DISALLOW_COPY_AND_ASSIGN(SpdySettingsIR); | 572 DISALLOW_COPY_AND_ASSIGN(SpdySettingsIR); |
| 573 }; | 573 }; |
| 574 | 574 |
| 575 class NET_EXPORT_PRIVATE SpdyPingIR : public SpdyFrameIR { | 575 class SPDY_EXPORT_PRIVATE SpdyPingIR : public SpdyFrameIR { |
| 576 public: | 576 public: |
| 577 explicit SpdyPingIR(SpdyPingId id) : id_(id), is_ack_(false) {} | 577 explicit SpdyPingIR(SpdyPingId id) : id_(id), is_ack_(false) {} |
| 578 SpdyPingId id() const { return id_; } | 578 SpdyPingId id() const { return id_; } |
| 579 | 579 |
| 580 bool is_ack() const { return is_ack_; } | 580 bool is_ack() const { return is_ack_; } |
| 581 void set_is_ack(bool is_ack) { is_ack_ = is_ack; } | 581 void set_is_ack(bool is_ack) { is_ack_ = is_ack; } |
| 582 | 582 |
| 583 void Visit(SpdyFrameVisitor* visitor) const override; | 583 void Visit(SpdyFrameVisitor* visitor) const override; |
| 584 | 584 |
| 585 SpdyFrameType frame_type() const override; | 585 SpdyFrameType frame_type() const override; |
| 586 | 586 |
| 587 private: | 587 private: |
| 588 SpdyPingId id_; | 588 SpdyPingId id_; |
| 589 bool is_ack_; | 589 bool is_ack_; |
| 590 | 590 |
| 591 DISALLOW_COPY_AND_ASSIGN(SpdyPingIR); | 591 DISALLOW_COPY_AND_ASSIGN(SpdyPingIR); |
| 592 }; | 592 }; |
| 593 | 593 |
| 594 class NET_EXPORT_PRIVATE SpdyGoAwayIR : public SpdyFrameIR { | 594 class SPDY_EXPORT_PRIVATE SpdyGoAwayIR : public SpdyFrameIR { |
| 595 public: | 595 public: |
| 596 // References description, doesn't copy it, so description must outlast | 596 // References description, doesn't copy it, so description must outlast |
| 597 // this SpdyGoAwayIR. | 597 // this SpdyGoAwayIR. |
| 598 SpdyGoAwayIR(SpdyStreamId last_good_stream_id, | 598 SpdyGoAwayIR(SpdyStreamId last_good_stream_id, |
| 599 SpdyErrorCode error_code, | 599 SpdyErrorCode error_code, |
| 600 SpdyStringPiece description); | 600 SpdyStringPiece description); |
| 601 | 601 |
| 602 // References description, doesn't copy it, so description must outlast | 602 // References description, doesn't copy it, so description must outlast |
| 603 // this SpdyGoAwayIR. | 603 // this SpdyGoAwayIR. |
| 604 SpdyGoAwayIR(SpdyStreamId last_good_stream_id, | 604 SpdyGoAwayIR(SpdyStreamId last_good_stream_id, |
| (...skipping 26 matching lines...) Expand all Loading... |
| 631 | 631 |
| 632 private: | 632 private: |
| 633 SpdyStreamId last_good_stream_id_; | 633 SpdyStreamId last_good_stream_id_; |
| 634 SpdyErrorCode error_code_; | 634 SpdyErrorCode error_code_; |
| 635 const SpdyString description_store_; | 635 const SpdyString description_store_; |
| 636 const SpdyStringPiece description_; | 636 const SpdyStringPiece description_; |
| 637 | 637 |
| 638 DISALLOW_COPY_AND_ASSIGN(SpdyGoAwayIR); | 638 DISALLOW_COPY_AND_ASSIGN(SpdyGoAwayIR); |
| 639 }; | 639 }; |
| 640 | 640 |
| 641 class NET_EXPORT_PRIVATE SpdyHeadersIR : public SpdyFrameWithHeaderBlockIR { | 641 class SPDY_EXPORT_PRIVATE SpdyHeadersIR : public SpdyFrameWithHeaderBlockIR { |
| 642 public: | 642 public: |
| 643 explicit SpdyHeadersIR(SpdyStreamId stream_id) | 643 explicit SpdyHeadersIR(SpdyStreamId stream_id) |
| 644 : SpdyHeadersIR(stream_id, SpdyHeaderBlock()) {} | 644 : SpdyHeadersIR(stream_id, SpdyHeaderBlock()) {} |
| 645 SpdyHeadersIR(SpdyStreamId stream_id, SpdyHeaderBlock header_block) | 645 SpdyHeadersIR(SpdyStreamId stream_id, SpdyHeaderBlock header_block) |
| 646 : SpdyFrameWithHeaderBlockIR(stream_id, std::move(header_block)) {} | 646 : SpdyFrameWithHeaderBlockIR(stream_id, std::move(header_block)) {} |
| 647 | 647 |
| 648 void Visit(SpdyFrameVisitor* visitor) const override; | 648 void Visit(SpdyFrameVisitor* visitor) const override; |
| 649 | 649 |
| 650 SpdyFrameType frame_type() const override; | 650 SpdyFrameType frame_type() const override; |
| 651 | 651 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 671 bool has_priority_ = false; | 671 bool has_priority_ = false; |
| 672 int weight_ = kHttp2DefaultStreamWeight; | 672 int weight_ = kHttp2DefaultStreamWeight; |
| 673 SpdyStreamId parent_stream_id_ = 0; | 673 SpdyStreamId parent_stream_id_ = 0; |
| 674 bool exclusive_ = false; | 674 bool exclusive_ = false; |
| 675 bool padded_ = false; | 675 bool padded_ = false; |
| 676 int padding_payload_len_ = 0; | 676 int padding_payload_len_ = 0; |
| 677 | 677 |
| 678 DISALLOW_COPY_AND_ASSIGN(SpdyHeadersIR); | 678 DISALLOW_COPY_AND_ASSIGN(SpdyHeadersIR); |
| 679 }; | 679 }; |
| 680 | 680 |
| 681 class NET_EXPORT_PRIVATE SpdyWindowUpdateIR : public SpdyFrameWithStreamIdIR { | 681 class SPDY_EXPORT_PRIVATE SpdyWindowUpdateIR : public SpdyFrameWithStreamIdIR { |
| 682 public: | 682 public: |
| 683 SpdyWindowUpdateIR(SpdyStreamId stream_id, int32_t delta) | 683 SpdyWindowUpdateIR(SpdyStreamId stream_id, int32_t delta) |
| 684 : SpdyFrameWithStreamIdIR(stream_id) { | 684 : SpdyFrameWithStreamIdIR(stream_id) { |
| 685 set_delta(delta); | 685 set_delta(delta); |
| 686 } | 686 } |
| 687 int32_t delta() const { return delta_; } | 687 int32_t delta() const { return delta_; } |
| 688 void set_delta(int32_t delta) { | 688 void set_delta(int32_t delta) { |
| 689 DCHECK_LE(0, delta); | 689 DCHECK_LE(0, delta); |
| 690 DCHECK_LE(delta, kSpdyMaximumWindowSize); | 690 DCHECK_LE(delta, kSpdyMaximumWindowSize); |
| 691 delta_ = delta; | 691 delta_ = delta; |
| 692 } | 692 } |
| 693 | 693 |
| 694 void Visit(SpdyFrameVisitor* visitor) const override; | 694 void Visit(SpdyFrameVisitor* visitor) const override; |
| 695 | 695 |
| 696 SpdyFrameType frame_type() const override; | 696 SpdyFrameType frame_type() const override; |
| 697 | 697 |
| 698 private: | 698 private: |
| 699 int32_t delta_; | 699 int32_t delta_; |
| 700 | 700 |
| 701 DISALLOW_COPY_AND_ASSIGN(SpdyWindowUpdateIR); | 701 DISALLOW_COPY_AND_ASSIGN(SpdyWindowUpdateIR); |
| 702 }; | 702 }; |
| 703 | 703 |
| 704 class NET_EXPORT_PRIVATE SpdyPushPromiseIR : public SpdyFrameWithHeaderBlockIR { | 704 class SPDY_EXPORT_PRIVATE SpdyPushPromiseIR |
| 705 : public SpdyFrameWithHeaderBlockIR { |
| 705 public: | 706 public: |
| 706 SpdyPushPromiseIR(SpdyStreamId stream_id, SpdyStreamId promised_stream_id) | 707 SpdyPushPromiseIR(SpdyStreamId stream_id, SpdyStreamId promised_stream_id) |
| 707 : SpdyPushPromiseIR(stream_id, promised_stream_id, SpdyHeaderBlock()) {} | 708 : SpdyPushPromiseIR(stream_id, promised_stream_id, SpdyHeaderBlock()) {} |
| 708 SpdyPushPromiseIR(SpdyStreamId stream_id, | 709 SpdyPushPromiseIR(SpdyStreamId stream_id, |
| 709 SpdyStreamId promised_stream_id, | 710 SpdyStreamId promised_stream_id, |
| 710 SpdyHeaderBlock header_block) | 711 SpdyHeaderBlock header_block) |
| 711 : SpdyFrameWithHeaderBlockIR(stream_id, std::move(header_block)), | 712 : SpdyFrameWithHeaderBlockIR(stream_id, std::move(header_block)), |
| 712 promised_stream_id_(promised_stream_id), | 713 promised_stream_id_(promised_stream_id), |
| 713 padded_(false), | 714 padded_(false), |
| 714 padding_payload_len_(0) {} | 715 padding_payload_len_(0) {} |
| (...skipping 15 matching lines...) Expand all Loading... |
| 730 | 731 |
| 731 private: | 732 private: |
| 732 SpdyStreamId promised_stream_id_; | 733 SpdyStreamId promised_stream_id_; |
| 733 | 734 |
| 734 bool padded_; | 735 bool padded_; |
| 735 int padding_payload_len_; | 736 int padding_payload_len_; |
| 736 | 737 |
| 737 DISALLOW_COPY_AND_ASSIGN(SpdyPushPromiseIR); | 738 DISALLOW_COPY_AND_ASSIGN(SpdyPushPromiseIR); |
| 738 }; | 739 }; |
| 739 | 740 |
| 740 class NET_EXPORT_PRIVATE SpdyContinuationIR : public SpdyFrameWithStreamIdIR { | 741 class SPDY_EXPORT_PRIVATE SpdyContinuationIR : public SpdyFrameWithStreamIdIR { |
| 741 public: | 742 public: |
| 742 explicit SpdyContinuationIR(SpdyStreamId stream_id); | 743 explicit SpdyContinuationIR(SpdyStreamId stream_id); |
| 743 ~SpdyContinuationIR() override; | 744 ~SpdyContinuationIR() override; |
| 744 | 745 |
| 745 void Visit(SpdyFrameVisitor* visitor) const override; | 746 void Visit(SpdyFrameVisitor* visitor) const override; |
| 746 | 747 |
| 747 SpdyFrameType frame_type() const override; | 748 SpdyFrameType frame_type() const override; |
| 748 | 749 |
| 749 bool end_headers() const { return end_headers_; } | 750 bool end_headers() const { return end_headers_; } |
| 750 void set_end_headers(bool end_headers) {end_headers_ = end_headers;} | 751 void set_end_headers(bool end_headers) {end_headers_ = end_headers;} |
| 751 const SpdyString& encoding() const { return *encoding_; } | 752 const SpdyString& encoding() const { return *encoding_; } |
| 752 void take_encoding(std::unique_ptr<SpdyString> encoding) { | 753 void take_encoding(std::unique_ptr<SpdyString> encoding) { |
| 753 encoding_ = std::move(encoding); | 754 encoding_ = std::move(encoding); |
| 754 } | 755 } |
| 755 | 756 |
| 756 private: | 757 private: |
| 757 std::unique_ptr<SpdyString> encoding_; | 758 std::unique_ptr<SpdyString> encoding_; |
| 758 bool end_headers_; | 759 bool end_headers_; |
| 759 DISALLOW_COPY_AND_ASSIGN(SpdyContinuationIR); | 760 DISALLOW_COPY_AND_ASSIGN(SpdyContinuationIR); |
| 760 }; | 761 }; |
| 761 | 762 |
| 762 class NET_EXPORT_PRIVATE SpdyAltSvcIR : public SpdyFrameWithStreamIdIR { | 763 class SPDY_EXPORT_PRIVATE SpdyAltSvcIR : public SpdyFrameWithStreamIdIR { |
| 763 public: | 764 public: |
| 764 explicit SpdyAltSvcIR(SpdyStreamId stream_id); | 765 explicit SpdyAltSvcIR(SpdyStreamId stream_id); |
| 765 ~SpdyAltSvcIR() override; | 766 ~SpdyAltSvcIR() override; |
| 766 | 767 |
| 767 SpdyString origin() const { return origin_; } | 768 SpdyString origin() const { return origin_; } |
| 768 const SpdyAltSvcWireFormat::AlternativeServiceVector& altsvc_vector() const { | 769 const SpdyAltSvcWireFormat::AlternativeServiceVector& altsvc_vector() const { |
| 769 return altsvc_vector_; | 770 return altsvc_vector_; |
| 770 } | 771 } |
| 771 | 772 |
| 772 void set_origin(SpdyString origin) { origin_ = std::move(origin); } | 773 void set_origin(SpdyString origin) { origin_ = std::move(origin); } |
| 773 void add_altsvc(const SpdyAltSvcWireFormat::AlternativeService& altsvc) { | 774 void add_altsvc(const SpdyAltSvcWireFormat::AlternativeService& altsvc) { |
| 774 altsvc_vector_.push_back(altsvc); | 775 altsvc_vector_.push_back(altsvc); |
| 775 } | 776 } |
| 776 | 777 |
| 777 void Visit(SpdyFrameVisitor* visitor) const override; | 778 void Visit(SpdyFrameVisitor* visitor) const override; |
| 778 | 779 |
| 779 SpdyFrameType frame_type() const override; | 780 SpdyFrameType frame_type() const override; |
| 780 | 781 |
| 781 private: | 782 private: |
| 782 SpdyString origin_; | 783 SpdyString origin_; |
| 783 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector_; | 784 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector_; |
| 784 DISALLOW_COPY_AND_ASSIGN(SpdyAltSvcIR); | 785 DISALLOW_COPY_AND_ASSIGN(SpdyAltSvcIR); |
| 785 }; | 786 }; |
| 786 | 787 |
| 787 class NET_EXPORT_PRIVATE SpdyPriorityIR : public SpdyFrameWithStreamIdIR { | 788 class SPDY_EXPORT_PRIVATE SpdyPriorityIR : public SpdyFrameWithStreamIdIR { |
| 788 public: | 789 public: |
| 789 SpdyPriorityIR(SpdyStreamId stream_id, | 790 SpdyPriorityIR(SpdyStreamId stream_id, |
| 790 SpdyStreamId parent_stream_id, | 791 SpdyStreamId parent_stream_id, |
| 791 int weight, | 792 int weight, |
| 792 bool exclusive) | 793 bool exclusive) |
| 793 : SpdyFrameWithStreamIdIR(stream_id), | 794 : SpdyFrameWithStreamIdIR(stream_id), |
| 794 parent_stream_id_(parent_stream_id), | 795 parent_stream_id_(parent_stream_id), |
| 795 weight_(weight), | 796 weight_(weight), |
| 796 exclusive_(exclusive) {} | 797 exclusive_(exclusive) {} |
| 797 SpdyStreamId parent_stream_id() const { return parent_stream_id_; } | 798 SpdyStreamId parent_stream_id() const { return parent_stream_id_; } |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 909 SpdyFrameVisitor() {} | 910 SpdyFrameVisitor() {} |
| 910 virtual ~SpdyFrameVisitor() {} | 911 virtual ~SpdyFrameVisitor() {} |
| 911 | 912 |
| 912 private: | 913 private: |
| 913 DISALLOW_COPY_AND_ASSIGN(SpdyFrameVisitor); | 914 DISALLOW_COPY_AND_ASSIGN(SpdyFrameVisitor); |
| 914 }; | 915 }; |
| 915 | 916 |
| 916 } // namespace net | 917 } // namespace net |
| 917 | 918 |
| 918 #endif // NET_SPDY_CORE_SPDY_PROTOCOL_H_ | 919 #endif // NET_SPDY_CORE_SPDY_PROTOCOL_H_ |
| OLD | NEW |