xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/http2/adapter/http2_protocol.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 #include "quiche/http2/adapter/http2_protocol.h"
2 
3 #include "absl/strings/str_cat.h"
4 #include "absl/strings/string_view.h"
5 
6 namespace http2 {
7 namespace adapter {
8 
9 ABSL_CONST_INIT const char kHttp2MethodPseudoHeader[] = ":method";
10 ABSL_CONST_INIT const char kHttp2SchemePseudoHeader[] = ":scheme";
11 ABSL_CONST_INIT const char kHttp2AuthorityPseudoHeader[] = ":authority";
12 ABSL_CONST_INIT const char kHttp2PathPseudoHeader[] = ":path";
13 ABSL_CONST_INIT const char kHttp2StatusPseudoHeader[] = ":status";
14 
15 ABSL_CONST_INIT const uint8_t kMetadataFrameType = 0x4d;
16 ABSL_CONST_INIT const uint8_t kMetadataEndFlag = 0x04;
17 ABSL_CONST_INIT const uint16_t kMetadataExtensionId = 0x4d44;
18 
GetStringView(const HeaderRep & rep)19 std::pair<absl::string_view, bool> GetStringView(const HeaderRep& rep) {
20   if (absl::holds_alternative<absl::string_view>(rep)) {
21     return std::make_pair(absl::get<absl::string_view>(rep), true);
22   } else {
23     absl::string_view view = absl::get<std::string>(rep);
24     return std::make_pair(view, false);
25   }
26 }
27 
operator ==(const Http2Setting & a,const Http2Setting & b)28 bool operator==(const Http2Setting& a, const Http2Setting& b) {
29   return a.id == b.id && a.value == b.value;
30 }
31 
Http2SettingsIdToString(uint16_t id)32 absl::string_view Http2SettingsIdToString(uint16_t id) {
33   switch (id) {
34     case Http2KnownSettingsId::HEADER_TABLE_SIZE:
35       return "SETTINGS_HEADER_TABLE_SIZE";
36     case Http2KnownSettingsId::ENABLE_PUSH:
37       return "SETTINGS_ENABLE_PUSH";
38     case Http2KnownSettingsId::MAX_CONCURRENT_STREAMS:
39       return "SETTINGS_MAX_CONCURRENT_STREAMS";
40     case Http2KnownSettingsId::INITIAL_WINDOW_SIZE:
41       return "SETTINGS_INITIAL_WINDOW_SIZE";
42     case Http2KnownSettingsId::MAX_FRAME_SIZE:
43       return "SETTINGS_MAX_FRAME_SIZE";
44     case Http2KnownSettingsId::MAX_HEADER_LIST_SIZE:
45       return "SETTINGS_MAX_HEADER_LIST_SIZE";
46   }
47   return "SETTINGS_UNKNOWN";
48 }
49 
Http2ErrorCodeToString(Http2ErrorCode error_code)50 absl::string_view Http2ErrorCodeToString(Http2ErrorCode error_code) {
51   switch (error_code) {
52     case Http2ErrorCode::HTTP2_NO_ERROR:
53       return "HTTP2_NO_ERROR";
54     case Http2ErrorCode::PROTOCOL_ERROR:
55       return "PROTOCOL_ERROR";
56     case Http2ErrorCode::INTERNAL_ERROR:
57       return "INTERNAL_ERROR";
58     case Http2ErrorCode::FLOW_CONTROL_ERROR:
59       return "FLOW_CONTROL_ERROR";
60     case Http2ErrorCode::SETTINGS_TIMEOUT:
61       return "SETTINGS_TIMEOUT";
62     case Http2ErrorCode::STREAM_CLOSED:
63       return "STREAM_CLOSED";
64     case Http2ErrorCode::FRAME_SIZE_ERROR:
65       return "FRAME_SIZE_ERROR";
66     case Http2ErrorCode::REFUSED_STREAM:
67       return "REFUSED_STREAM";
68     case Http2ErrorCode::CANCEL:
69       return "CANCEL";
70     case Http2ErrorCode::COMPRESSION_ERROR:
71       return "COMPRESSION_ERROR";
72     case Http2ErrorCode::CONNECT_ERROR:
73       return "CONNECT_ERROR";
74     case Http2ErrorCode::ENHANCE_YOUR_CALM:
75       return "ENHANCE_YOUR_CALM";
76     case Http2ErrorCode::INADEQUATE_SECURITY:
77       return "INADEQUATE_SECURITY";
78     case Http2ErrorCode::HTTP_1_1_REQUIRED:
79       return "HTTP_1_1_REQUIRED";
80   }
81   return "UNKNOWN_ERROR";
82 }
83 
84 }  // namespace adapter
85 }  // namespace http2
86