xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/http2/adapter/http2_util.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 #include "quiche/http2/adapter/http2_util.h"
2 
3 #include "quiche/spdy/core/spdy_protocol.h"
4 
5 namespace http2 {
6 namespace adapter {
7 namespace {
8 
9 using ConnectionError = Http2VisitorInterface::ConnectionError;
10 using InvalidFrameError = Http2VisitorInterface::InvalidFrameError;
11 
12 }  // anonymous namespace
13 
TranslateErrorCode(Http2ErrorCode code)14 spdy::SpdyErrorCode TranslateErrorCode(Http2ErrorCode code) {
15   switch (code) {
16     case Http2ErrorCode::HTTP2_NO_ERROR:
17       return spdy::ERROR_CODE_NO_ERROR;
18     case Http2ErrorCode::PROTOCOL_ERROR:
19       return spdy::ERROR_CODE_PROTOCOL_ERROR;
20     case Http2ErrorCode::INTERNAL_ERROR:
21       return spdy::ERROR_CODE_INTERNAL_ERROR;
22     case Http2ErrorCode::FLOW_CONTROL_ERROR:
23       return spdy::ERROR_CODE_FLOW_CONTROL_ERROR;
24     case Http2ErrorCode::SETTINGS_TIMEOUT:
25       return spdy::ERROR_CODE_SETTINGS_TIMEOUT;
26     case Http2ErrorCode::STREAM_CLOSED:
27       return spdy::ERROR_CODE_STREAM_CLOSED;
28     case Http2ErrorCode::FRAME_SIZE_ERROR:
29       return spdy::ERROR_CODE_FRAME_SIZE_ERROR;
30     case Http2ErrorCode::REFUSED_STREAM:
31       return spdy::ERROR_CODE_REFUSED_STREAM;
32     case Http2ErrorCode::CANCEL:
33       return spdy::ERROR_CODE_CANCEL;
34     case Http2ErrorCode::COMPRESSION_ERROR:
35       return spdy::ERROR_CODE_COMPRESSION_ERROR;
36     case Http2ErrorCode::CONNECT_ERROR:
37       return spdy::ERROR_CODE_CONNECT_ERROR;
38     case Http2ErrorCode::ENHANCE_YOUR_CALM:
39       return spdy::ERROR_CODE_ENHANCE_YOUR_CALM;
40     case Http2ErrorCode::INADEQUATE_SECURITY:
41       return spdy::ERROR_CODE_INADEQUATE_SECURITY;
42     case Http2ErrorCode::HTTP_1_1_REQUIRED:
43       return spdy::ERROR_CODE_HTTP_1_1_REQUIRED;
44   }
45   return spdy::ERROR_CODE_INTERNAL_ERROR;
46 }
47 
TranslateErrorCode(spdy::SpdyErrorCode code)48 Http2ErrorCode TranslateErrorCode(spdy::SpdyErrorCode code) {
49   switch (code) {
50     case spdy::ERROR_CODE_NO_ERROR:
51       return Http2ErrorCode::HTTP2_NO_ERROR;
52     case spdy::ERROR_CODE_PROTOCOL_ERROR:
53       return Http2ErrorCode::PROTOCOL_ERROR;
54     case spdy::ERROR_CODE_INTERNAL_ERROR:
55       return Http2ErrorCode::INTERNAL_ERROR;
56     case spdy::ERROR_CODE_FLOW_CONTROL_ERROR:
57       return Http2ErrorCode::FLOW_CONTROL_ERROR;
58     case spdy::ERROR_CODE_SETTINGS_TIMEOUT:
59       return Http2ErrorCode::SETTINGS_TIMEOUT;
60     case spdy::ERROR_CODE_STREAM_CLOSED:
61       return Http2ErrorCode::STREAM_CLOSED;
62     case spdy::ERROR_CODE_FRAME_SIZE_ERROR:
63       return Http2ErrorCode::FRAME_SIZE_ERROR;
64     case spdy::ERROR_CODE_REFUSED_STREAM:
65       return Http2ErrorCode::REFUSED_STREAM;
66     case spdy::ERROR_CODE_CANCEL:
67       return Http2ErrorCode::CANCEL;
68     case spdy::ERROR_CODE_COMPRESSION_ERROR:
69       return Http2ErrorCode::COMPRESSION_ERROR;
70     case spdy::ERROR_CODE_CONNECT_ERROR:
71       return Http2ErrorCode::CONNECT_ERROR;
72     case spdy::ERROR_CODE_ENHANCE_YOUR_CALM:
73       return Http2ErrorCode::ENHANCE_YOUR_CALM;
74     case spdy::ERROR_CODE_INADEQUATE_SECURITY:
75       return Http2ErrorCode::INADEQUATE_SECURITY;
76     case spdy::ERROR_CODE_HTTP_1_1_REQUIRED:
77       return Http2ErrorCode::HTTP_1_1_REQUIRED;
78   }
79   return Http2ErrorCode::INTERNAL_ERROR;
80 }
81 
ConnectionErrorToString(ConnectionError error)82 absl::string_view ConnectionErrorToString(ConnectionError error) {
83   switch (error) {
84     case ConnectionError::kInvalidConnectionPreface:
85       return "InvalidConnectionPreface";
86     case ConnectionError::kSendError:
87       return "SendError";
88     case ConnectionError::kParseError:
89       return "ParseError";
90     case ConnectionError::kHeaderError:
91       return "HeaderError";
92     case ConnectionError::kInvalidNewStreamId:
93       return "InvalidNewStreamId";
94     case ConnectionError::kWrongFrameSequence:
95       return "kWrongFrameSequence";
96     case ConnectionError::kInvalidPushPromise:
97       return "InvalidPushPromise";
98     case ConnectionError::kExceededMaxConcurrentStreams:
99       return "ExceededMaxConcurrentStreams";
100     case ConnectionError::kFlowControlError:
101       return "FlowControlError";
102     case ConnectionError::kInvalidGoAwayLastStreamId:
103       return "InvalidGoAwayLastStreamId";
104     case ConnectionError::kInvalidSetting:
105       return "InvalidSetting";
106   }
107   return "UnknownConnectionError";
108 }
109 
InvalidFrameErrorToString(Http2VisitorInterface::InvalidFrameError error)110 absl::string_view InvalidFrameErrorToString(
111     Http2VisitorInterface::InvalidFrameError error) {
112   switch (error) {
113     case InvalidFrameError::kProtocol:
114       return "Protocol";
115     case InvalidFrameError::kRefusedStream:
116       return "RefusedStream";
117     case InvalidFrameError::kHttpHeader:
118       return "HttpHeader";
119     case InvalidFrameError::kHttpMessaging:
120       return "HttpMessaging";
121     case InvalidFrameError::kFlowControl:
122       return "FlowControl";
123     case InvalidFrameError::kStreamClosed:
124       return "StreamClosed";
125   }
126   return "UnknownInvalidFrameError";
127 }
128 
DeltaAtLeastHalfLimit(int64_t limit,int64_t,int64_t delta)129 bool DeltaAtLeastHalfLimit(int64_t limit, int64_t /*size*/, int64_t delta) {
130   return delta > 0 && delta >= limit / 2;
131 }
132 
133 }  // namespace adapter
134 }  // namespace http2
135