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)14spdy::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)48Http2ErrorCode 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)82absl::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)110absl::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)129bool 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