|  | // Copyright (c) 2018 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef QUICHE_QUIC_CORE_HTTP_HTTP_FRAMES_H_ | 
|  | #define QUICHE_QUIC_CORE_HTTP_HTTP_FRAMES_H_ | 
|  |  | 
|  | #include <cstdint> | 
|  | #include <map> | 
|  | #include <ostream> | 
|  |  | 
|  | #include "net/third_party/quiche/src/quic/core/http/spdy_utils.h" | 
|  | #include "net/third_party/quiche/src/quic/core/quic_types.h" | 
|  | #include "net/third_party/quiche/src/quic/platform/api/quic_str_cat.h" | 
|  | #include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" | 
|  | #include "net/third_party/quiche/src/quic/platform/api/quic_string_utils.h" | 
|  | #include "net/third_party/quiche/src/spdy/core/spdy_framer.h" | 
|  |  | 
|  | namespace quic { | 
|  |  | 
|  | enum class HttpFrameType : uint8_t { | 
|  | DATA = 0x0, | 
|  | HEADERS = 0x1, | 
|  | PRIORITY = 0X2, | 
|  | CANCEL_PUSH = 0X3, | 
|  | SETTINGS = 0x4, | 
|  | PUSH_PROMISE = 0x5, | 
|  | GOAWAY = 0x7, | 
|  | MAX_PUSH_ID = 0xD, | 
|  | DUPLICATE_PUSH = 0xE | 
|  | }; | 
|  |  | 
|  | // 4.2.1.  DATA | 
|  | // | 
|  | //   DATA frames (type=0x0) convey arbitrary, variable-length sequences of | 
|  | //   octets associated with an HTTP request or response payload. | 
|  | struct QUIC_EXPORT_PRIVATE DataFrame { | 
|  | QuicStringPiece data; | 
|  | }; | 
|  |  | 
|  | // 4.2.2.  HEADERS | 
|  | // | 
|  | //   The HEADERS frame (type=0x1) is used to carry a header block, | 
|  | //   compressed using QPACK. | 
|  | struct QUIC_EXPORT_PRIVATE HeadersFrame { | 
|  | QuicStringPiece headers; | 
|  | }; | 
|  |  | 
|  | // 4.2.3.  PRIORITY | 
|  | // | 
|  | //   The PRIORITY (type=0x02) frame specifies the sender-advised priority | 
|  | //   of a stream | 
|  |  | 
|  | // Length of the weight field of a priority frame. | 
|  | const QuicByteCount kPriorityWeightLength = 1; | 
|  | // Length of a priority frame's first byte. | 
|  | const QuicByteCount kPriorityFirstByteLength = 1; | 
|  | // The bit that indicates Priority frame is exclusive. | 
|  | const uint8_t kPriorityExclusiveBit = 8; | 
|  |  | 
|  | enum PriorityElementType : uint8_t { | 
|  | REQUEST_STREAM = 0, | 
|  | PUSH_STREAM = 1, | 
|  | PLACEHOLDER = 2, | 
|  | ROOT_OF_TREE = 3 | 
|  | }; | 
|  |  | 
|  | struct QUIC_EXPORT_PRIVATE PriorityFrame { | 
|  | PriorityElementType prioritized_type = REQUEST_STREAM; | 
|  | PriorityElementType dependency_type = REQUEST_STREAM; | 
|  | bool exclusive = false; | 
|  | uint64_t prioritized_element_id = 0; | 
|  | uint64_t element_dependency_id = 0; | 
|  | uint8_t weight = 0; | 
|  |  | 
|  | bool operator==(const PriorityFrame& rhs) const { | 
|  | return prioritized_type == rhs.prioritized_type && | 
|  | dependency_type == rhs.dependency_type && | 
|  | exclusive == rhs.exclusive && | 
|  | prioritized_element_id == rhs.prioritized_element_id && | 
|  | element_dependency_id == rhs.element_dependency_id && | 
|  | weight == rhs.weight; | 
|  | } | 
|  | std::string ToString() const { | 
|  | return QuicStrCat("Priority Frame : {prioritized_type: ", prioritized_type, | 
|  | ", dependency_type: ", dependency_type, | 
|  | ", exclusive: ", exclusive, | 
|  | ", prioritized_element_id: ", prioritized_element_id, | 
|  | ", element_dependency_id: ", element_dependency_id, | 
|  | ", weight: ", weight, "}"); | 
|  | } | 
|  |  | 
|  | friend QUIC_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os, | 
|  | const PriorityFrame& s) { | 
|  | os << s.ToString(); | 
|  | return os; | 
|  | } | 
|  | }; | 
|  |  | 
|  | // 4.2.4.  CANCEL_PUSH | 
|  | // | 
|  | //   The CANCEL_PUSH frame (type=0x3) is used to request cancellation of | 
|  | //   server push prior to the push stream being created. | 
|  | using PushId = uint64_t; | 
|  |  | 
|  | struct QUIC_EXPORT_PRIVATE CancelPushFrame { | 
|  | PushId push_id; | 
|  |  | 
|  | bool operator==(const CancelPushFrame& rhs) const { | 
|  | return push_id == rhs.push_id; | 
|  | } | 
|  | }; | 
|  |  | 
|  | // 4.2.5.  SETTINGS | 
|  | // | 
|  | //   The SETTINGS frame (type=0x4) conveys configuration parameters that | 
|  | //   affect how endpoints communicate, such as preferences and constraints | 
|  | //   on peer behavior | 
|  |  | 
|  | using SettingsMap = std::map<uint64_t, uint64_t>; | 
|  |  | 
|  | struct QUIC_EXPORT_PRIVATE SettingsFrame { | 
|  | SettingsMap values; | 
|  |  | 
|  | bool operator==(const SettingsFrame& rhs) const { | 
|  | return values == rhs.values; | 
|  | } | 
|  |  | 
|  | std::string ToString() const { | 
|  | std::string s; | 
|  | for (auto it : values) { | 
|  | std::string setting = QuicStrCat( | 
|  | SpdyUtils::H3SettingsToString( | 
|  | static_cast<Http3AndQpackSettingsIdentifiers>(it.first)), | 
|  | " = ", it.second, "; "); | 
|  | QuicStrAppend(&s, setting); | 
|  | } | 
|  | return s; | 
|  | } | 
|  | friend QUIC_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os, | 
|  | const SettingsFrame& s) { | 
|  | os << s.ToString(); | 
|  | return os; | 
|  | } | 
|  | }; | 
|  |  | 
|  | // 4.2.6.  PUSH_PROMISE | 
|  | // | 
|  | //   The PUSH_PROMISE frame (type=0x05) is used to carry a request header | 
|  | //   set from server to client, as in HTTP/2. | 
|  | struct QUIC_EXPORT_PRIVATE PushPromiseFrame { | 
|  | PushId push_id; | 
|  | QuicStringPiece headers; | 
|  |  | 
|  | bool operator==(const PushPromiseFrame& rhs) const { | 
|  | return push_id == rhs.push_id && headers == rhs.headers; | 
|  | } | 
|  | }; | 
|  |  | 
|  | // 4.2.7.  GOAWAY | 
|  | // | 
|  | //   The GOAWAY frame (type=0x7) is used to initiate graceful shutdown of | 
|  | //   a connection by a server. | 
|  | struct QUIC_EXPORT_PRIVATE GoAwayFrame { | 
|  | QuicStreamId stream_id; | 
|  |  | 
|  | bool operator==(const GoAwayFrame& rhs) const { | 
|  | return stream_id == rhs.stream_id; | 
|  | } | 
|  | }; | 
|  |  | 
|  | // 4.2.8.  MAX_PUSH_ID | 
|  | // | 
|  | //   The MAX_PUSH_ID frame (type=0xD) is used by clients to control the | 
|  | //   number of server pushes that the server can initiate. | 
|  | struct QUIC_EXPORT_PRIVATE MaxPushIdFrame { | 
|  | PushId push_id; | 
|  |  | 
|  | bool operator==(const MaxPushIdFrame& rhs) const { | 
|  | return push_id == rhs.push_id; | 
|  | } | 
|  | }; | 
|  |  | 
|  | // 4.2.9.  DUPLICATE_PUSH | 
|  | // | 
|  | //  The DUPLICATE_PUSH frame (type=0xE) is used by servers to indicate | 
|  | //  that an existing pushed resource is related to multiple client | 
|  | //  requests. | 
|  | struct QUIC_EXPORT_PRIVATE DuplicatePushFrame { | 
|  | PushId push_id; | 
|  |  | 
|  | bool operator==(const DuplicatePushFrame& rhs) const { | 
|  | return push_id == rhs.push_id; | 
|  | } | 
|  | }; | 
|  |  | 
|  | }  // namespace quic | 
|  |  | 
|  | #endif  // QUICHE_QUIC_CORE_HTTP_HTTP_FRAMES_H_ |