blob: 37df9192d3ec0ea8dc1b2e358d2fd6a6b048649b [file] [log] [blame]
QUICHE teamfd50a402018-12-07 22:54:05 -05001// Copyright 2016 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/third_party/quiche/src/http2/http2_constants.h"
6
QUICHE team61940b42019-03-07 23:32:27 -05007#include "net/third_party/quiche/src/http2/platform/api/http2_logging.h"
QUICHE teamfd50a402018-12-07 22:54:05 -05008#include "net/third_party/quiche/src/http2/platform/api/http2_string_utils.h"
bnc74646d12019-12-13 09:21:19 -08009#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h"
QUICHE teamfd50a402018-12-07 22:54:05 -050010
11namespace http2 {
12
bnc47904002019-08-16 11:49:48 -070013std::string Http2FrameTypeToString(Http2FrameType v) {
QUICHE teamfd50a402018-12-07 22:54:05 -050014 switch (v) {
15 case Http2FrameType::DATA:
16 return "DATA";
17 case Http2FrameType::HEADERS:
18 return "HEADERS";
19 case Http2FrameType::PRIORITY:
20 return "PRIORITY";
21 case Http2FrameType::RST_STREAM:
22 return "RST_STREAM";
23 case Http2FrameType::SETTINGS:
24 return "SETTINGS";
25 case Http2FrameType::PUSH_PROMISE:
26 return "PUSH_PROMISE";
27 case Http2FrameType::PING:
28 return "PING";
29 case Http2FrameType::GOAWAY:
30 return "GOAWAY";
31 case Http2FrameType::WINDOW_UPDATE:
32 return "WINDOW_UPDATE";
33 case Http2FrameType::CONTINUATION:
34 return "CONTINUATION";
35 case Http2FrameType::ALTSVC:
36 return "ALTSVC";
37 }
38 return Http2StrCat("UnknownFrameType(", static_cast<int>(v), ")");
39}
40
bnc47904002019-08-16 11:49:48 -070041std::string Http2FrameTypeToString(uint8_t v) {
QUICHE teamfd50a402018-12-07 22:54:05 -050042 return Http2FrameTypeToString(static_cast<Http2FrameType>(v));
43}
44
bnc47904002019-08-16 11:49:48 -070045std::string Http2FrameFlagsToString(Http2FrameType type, uint8_t flags) {
46 std::string s;
47 // Closure to append flag name |v| to the std::string |s|,
QUICHE teamfd50a402018-12-07 22:54:05 -050048 // and to clear |bit| from |flags|.
bnc74646d12019-12-13 09:21:19 -080049 auto append_and_clear = [&s, &flags](quiche::QuicheStringPiece v,
50 uint8_t bit) {
QUICHE teamfd50a402018-12-07 22:54:05 -050051 if (!s.empty()) {
52 s.push_back('|');
53 }
54 Http2StrAppend(&s, v);
55 flags ^= bit;
56 };
57 if (flags & 0x01) {
58 if (type == Http2FrameType::DATA || type == Http2FrameType::HEADERS) {
59 append_and_clear("END_STREAM", Http2FrameFlag::END_STREAM);
60 } else if (type == Http2FrameType::SETTINGS ||
61 type == Http2FrameType::PING) {
62 append_and_clear("ACK", Http2FrameFlag::ACK);
63 }
64 }
65 if (flags & 0x04) {
66 if (type == Http2FrameType::HEADERS ||
67 type == Http2FrameType::PUSH_PROMISE ||
68 type == Http2FrameType::CONTINUATION) {
69 append_and_clear("END_HEADERS", Http2FrameFlag::END_HEADERS);
70 }
71 }
72 if (flags & 0x08) {
73 if (type == Http2FrameType::DATA || type == Http2FrameType::HEADERS ||
74 type == Http2FrameType::PUSH_PROMISE) {
75 append_and_clear("PADDED", Http2FrameFlag::PADDED);
76 }
77 }
78 if (flags & 0x20) {
79 if (type == Http2FrameType::HEADERS) {
80 append_and_clear("PRIORITY", Http2FrameFlag::PRIORITY);
81 }
82 }
83 if (flags != 0) {
84 append_and_clear(Http2StringPrintf("0x%02x", flags), flags);
85 }
86 DCHECK_EQ(0, flags);
87 return s;
88}
bnc47904002019-08-16 11:49:48 -070089std::string Http2FrameFlagsToString(uint8_t type, uint8_t flags) {
QUICHE teamfd50a402018-12-07 22:54:05 -050090 return Http2FrameFlagsToString(static_cast<Http2FrameType>(type), flags);
91}
92
bnc47904002019-08-16 11:49:48 -070093std::string Http2ErrorCodeToString(uint32_t v) {
QUICHE teamfd50a402018-12-07 22:54:05 -050094 switch (v) {
95 case 0x0:
96 return "NO_ERROR";
97 case 0x1:
98 return "PROTOCOL_ERROR";
99 case 0x2:
100 return "INTERNAL_ERROR";
101 case 0x3:
102 return "FLOW_CONTROL_ERROR";
103 case 0x4:
104 return "SETTINGS_TIMEOUT";
105 case 0x5:
106 return "STREAM_CLOSED";
107 case 0x6:
108 return "FRAME_SIZE_ERROR";
109 case 0x7:
110 return "REFUSED_STREAM";
111 case 0x8:
112 return "CANCEL";
113 case 0x9:
114 return "COMPRESSION_ERROR";
115 case 0xa:
116 return "CONNECT_ERROR";
117 case 0xb:
118 return "ENHANCE_YOUR_CALM";
119 case 0xc:
120 return "INADEQUATE_SECURITY";
121 case 0xd:
122 return "HTTP_1_1_REQUIRED";
123 }
124 return Http2StrCat("UnknownErrorCode(0x", Http2Hex(v), ")");
125}
bnc47904002019-08-16 11:49:48 -0700126std::string Http2ErrorCodeToString(Http2ErrorCode v) {
QUICHE teamfd50a402018-12-07 22:54:05 -0500127 return Http2ErrorCodeToString(static_cast<uint32_t>(v));
128}
129
bnc47904002019-08-16 11:49:48 -0700130std::string Http2SettingsParameterToString(uint32_t v) {
QUICHE teamfd50a402018-12-07 22:54:05 -0500131 switch (v) {
132 case 0x1:
133 return "HEADER_TABLE_SIZE";
134 case 0x2:
135 return "ENABLE_PUSH";
136 case 0x3:
137 return "MAX_CONCURRENT_STREAMS";
138 case 0x4:
139 return "INITIAL_WINDOW_SIZE";
140 case 0x5:
141 return "MAX_FRAME_SIZE";
142 case 0x6:
143 return "MAX_HEADER_LIST_SIZE";
144 }
145 return Http2StrCat("UnknownSettingsParameter(0x", Http2Hex(v), ")");
146}
bnc47904002019-08-16 11:49:48 -0700147std::string Http2SettingsParameterToString(Http2SettingsParameter v) {
QUICHE teamfd50a402018-12-07 22:54:05 -0500148 return Http2SettingsParameterToString(static_cast<uint32_t>(v));
149}
150
151} // namespace http2