1 // Copyright (c) 2012 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 "quiche/quic/core/quic_error_codes.h"
6
7 #include <cstdint>
8 #include <cstring>
9
10 #include "absl/strings/str_cat.h"
11 #include "openssl/ssl.h"
12 #include "quiche/quic/platform/api/quic_logging.h"
13
14 namespace quic {
15
16 #define RETURN_STRING_LITERAL(x) \
17 case x: \
18 return #x;
19
QuicRstStreamErrorCodeToString(QuicRstStreamErrorCode error)20 const char* QuicRstStreamErrorCodeToString(QuicRstStreamErrorCode error) {
21 switch (error) {
22 RETURN_STRING_LITERAL(QUIC_STREAM_NO_ERROR);
23 RETURN_STRING_LITERAL(QUIC_ERROR_PROCESSING_STREAM);
24 RETURN_STRING_LITERAL(QUIC_MULTIPLE_TERMINATION_OFFSETS);
25 RETURN_STRING_LITERAL(QUIC_BAD_APPLICATION_PAYLOAD);
26 RETURN_STRING_LITERAL(QUIC_STREAM_CONNECTION_ERROR);
27 RETURN_STRING_LITERAL(QUIC_STREAM_PEER_GOING_AWAY);
28 RETURN_STRING_LITERAL(QUIC_STREAM_CANCELLED);
29 RETURN_STRING_LITERAL(QUIC_RST_ACKNOWLEDGEMENT);
30 RETURN_STRING_LITERAL(QUIC_REFUSED_STREAM);
31 RETURN_STRING_LITERAL(QUIC_INVALID_PROMISE_URL);
32 RETURN_STRING_LITERAL(QUIC_UNAUTHORIZED_PROMISE_URL);
33 RETURN_STRING_LITERAL(QUIC_DUPLICATE_PROMISE_URL);
34 RETURN_STRING_LITERAL(QUIC_PROMISE_VARY_MISMATCH);
35 RETURN_STRING_LITERAL(QUIC_INVALID_PROMISE_METHOD);
36 RETURN_STRING_LITERAL(QUIC_PUSH_STREAM_TIMED_OUT);
37 RETURN_STRING_LITERAL(QUIC_HEADERS_TOO_LARGE);
38 RETURN_STRING_LITERAL(QUIC_STREAM_TTL_EXPIRED);
39 RETURN_STRING_LITERAL(QUIC_DATA_AFTER_CLOSE_OFFSET);
40 RETURN_STRING_LITERAL(QUIC_STREAM_GENERAL_PROTOCOL_ERROR);
41 RETURN_STRING_LITERAL(QUIC_STREAM_INTERNAL_ERROR);
42 RETURN_STRING_LITERAL(QUIC_STREAM_STREAM_CREATION_ERROR);
43 RETURN_STRING_LITERAL(QUIC_STREAM_CLOSED_CRITICAL_STREAM);
44 RETURN_STRING_LITERAL(QUIC_STREAM_FRAME_UNEXPECTED);
45 RETURN_STRING_LITERAL(QUIC_STREAM_FRAME_ERROR);
46 RETURN_STRING_LITERAL(QUIC_STREAM_EXCESSIVE_LOAD);
47 RETURN_STRING_LITERAL(QUIC_STREAM_ID_ERROR);
48 RETURN_STRING_LITERAL(QUIC_STREAM_SETTINGS_ERROR);
49 RETURN_STRING_LITERAL(QUIC_STREAM_MISSING_SETTINGS);
50 RETURN_STRING_LITERAL(QUIC_STREAM_REQUEST_REJECTED);
51 RETURN_STRING_LITERAL(QUIC_STREAM_REQUEST_INCOMPLETE);
52 RETURN_STRING_LITERAL(QUIC_STREAM_CONNECT_ERROR);
53 RETURN_STRING_LITERAL(QUIC_STREAM_VERSION_FALLBACK);
54 RETURN_STRING_LITERAL(QUIC_STREAM_DECOMPRESSION_FAILED);
55 RETURN_STRING_LITERAL(QUIC_STREAM_ENCODER_STREAM_ERROR);
56 RETURN_STRING_LITERAL(QUIC_STREAM_DECODER_STREAM_ERROR);
57 RETURN_STRING_LITERAL(QUIC_STREAM_UNKNOWN_APPLICATION_ERROR_CODE);
58 RETURN_STRING_LITERAL(QUIC_STREAM_WEBTRANSPORT_SESSION_GONE);
59 RETURN_STRING_LITERAL(
60 QUIC_STREAM_WEBTRANSPORT_BUFFERED_STREAMS_LIMIT_EXCEEDED);
61 RETURN_STRING_LITERAL(QUIC_APPLICATION_DONE_WITH_STREAM);
62 RETURN_STRING_LITERAL(QUIC_STREAM_LAST_ERROR);
63 }
64 // Return a default value so that we return this when |error| doesn't match
65 // any of the QuicRstStreamErrorCodes. This can happen when the RstStream
66 // frame sent by the peer (attacker) has invalid error code.
67 return "INVALID_RST_STREAM_ERROR_CODE";
68 }
69
QuicErrorCodeToString(QuicErrorCode error)70 const char* QuicErrorCodeToString(QuicErrorCode error) {
71 switch (error) {
72 RETURN_STRING_LITERAL(QUIC_NO_ERROR);
73 RETURN_STRING_LITERAL(QUIC_INTERNAL_ERROR);
74 RETURN_STRING_LITERAL(QUIC_STREAM_DATA_AFTER_TERMINATION);
75 RETURN_STRING_LITERAL(QUIC_INVALID_PACKET_HEADER);
76 RETURN_STRING_LITERAL(QUIC_INVALID_FRAME_DATA);
77 RETURN_STRING_LITERAL(QUIC_MISSING_PAYLOAD);
78 RETURN_STRING_LITERAL(QUIC_INVALID_FEC_DATA);
79 RETURN_STRING_LITERAL(QUIC_INVALID_STREAM_DATA);
80 RETURN_STRING_LITERAL(QUIC_OVERLAPPING_STREAM_DATA);
81 RETURN_STRING_LITERAL(QUIC_UNENCRYPTED_STREAM_DATA);
82 RETURN_STRING_LITERAL(QUIC_INVALID_RST_STREAM_DATA);
83 RETURN_STRING_LITERAL(QUIC_INVALID_CONNECTION_CLOSE_DATA);
84 RETURN_STRING_LITERAL(QUIC_INVALID_GOAWAY_DATA);
85 RETURN_STRING_LITERAL(QUIC_INVALID_WINDOW_UPDATE_DATA);
86 RETURN_STRING_LITERAL(QUIC_INVALID_BLOCKED_DATA);
87 RETURN_STRING_LITERAL(QUIC_INVALID_STOP_WAITING_DATA);
88 RETURN_STRING_LITERAL(QUIC_INVALID_PATH_CLOSE_DATA);
89 RETURN_STRING_LITERAL(QUIC_INVALID_ACK_DATA);
90 RETURN_STRING_LITERAL(QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
91 RETURN_STRING_LITERAL(QUIC_INVALID_PUBLIC_RST_PACKET);
92 RETURN_STRING_LITERAL(QUIC_DECRYPTION_FAILURE);
93 RETURN_STRING_LITERAL(QUIC_ENCRYPTION_FAILURE);
94 RETURN_STRING_LITERAL(QUIC_PACKET_TOO_LARGE);
95 RETURN_STRING_LITERAL(QUIC_PEER_GOING_AWAY);
96 RETURN_STRING_LITERAL(QUIC_HANDSHAKE_FAILED);
97 RETURN_STRING_LITERAL(QUIC_CRYPTO_TAGS_OUT_OF_ORDER);
98 RETURN_STRING_LITERAL(QUIC_CRYPTO_TOO_MANY_ENTRIES);
99 RETURN_STRING_LITERAL(QUIC_CRYPTO_TOO_MANY_REJECTS);
100 RETURN_STRING_LITERAL(QUIC_CRYPTO_INVALID_VALUE_LENGTH)
101 RETURN_STRING_LITERAL(QUIC_CRYPTO_MESSAGE_AFTER_HANDSHAKE_COMPLETE);
102 RETURN_STRING_LITERAL(QUIC_CRYPTO_INTERNAL_ERROR);
103 RETURN_STRING_LITERAL(QUIC_CRYPTO_VERSION_NOT_SUPPORTED);
104 RETURN_STRING_LITERAL(QUIC_CRYPTO_NO_SUPPORT);
105 RETURN_STRING_LITERAL(QUIC_INVALID_CRYPTO_MESSAGE_TYPE);
106 RETURN_STRING_LITERAL(QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER);
107 RETURN_STRING_LITERAL(QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND);
108 RETURN_STRING_LITERAL(QUIC_CRYPTO_MESSAGE_PARAMETER_NO_OVERLAP);
109 RETURN_STRING_LITERAL(QUIC_CRYPTO_MESSAGE_INDEX_NOT_FOUND);
110 RETURN_STRING_LITERAL(QUIC_UNSUPPORTED_PROOF_DEMAND);
111 RETURN_STRING_LITERAL(QUIC_INVALID_STREAM_ID);
112 RETURN_STRING_LITERAL(QUIC_INVALID_PRIORITY);
113 RETURN_STRING_LITERAL(QUIC_TOO_MANY_OPEN_STREAMS);
114 RETURN_STRING_LITERAL(QUIC_PUBLIC_RESET);
115 RETURN_STRING_LITERAL(QUIC_INVALID_VERSION);
116 RETURN_STRING_LITERAL(QUIC_PACKET_WRONG_VERSION);
117 RETURN_STRING_LITERAL(QUIC_INVALID_0RTT_PACKET_NUMBER_OUT_OF_ORDER);
118 RETURN_STRING_LITERAL(QUIC_INVALID_HEADER_ID);
119 RETURN_STRING_LITERAL(QUIC_INVALID_NEGOTIATED_VALUE);
120 RETURN_STRING_LITERAL(QUIC_DECOMPRESSION_FAILURE);
121 RETURN_STRING_LITERAL(QUIC_NETWORK_IDLE_TIMEOUT);
122 RETURN_STRING_LITERAL(QUIC_HANDSHAKE_TIMEOUT);
123 RETURN_STRING_LITERAL(QUIC_ERROR_MIGRATING_ADDRESS);
124 RETURN_STRING_LITERAL(QUIC_ERROR_MIGRATING_PORT);
125 RETURN_STRING_LITERAL(QUIC_PACKET_WRITE_ERROR);
126 RETURN_STRING_LITERAL(QUIC_PACKET_READ_ERROR);
127 RETURN_STRING_LITERAL(QUIC_EMPTY_STREAM_FRAME_NO_FIN);
128 RETURN_STRING_LITERAL(QUIC_INVALID_HEADERS_STREAM_DATA);
129 RETURN_STRING_LITERAL(QUIC_HEADERS_STREAM_DATA_DECOMPRESS_FAILURE);
130 RETURN_STRING_LITERAL(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA);
131 RETURN_STRING_LITERAL(QUIC_FLOW_CONTROL_SENT_TOO_MUCH_DATA);
132 RETURN_STRING_LITERAL(QUIC_FLOW_CONTROL_INVALID_WINDOW);
133 RETURN_STRING_LITERAL(QUIC_CONNECTION_IP_POOLED);
134 RETURN_STRING_LITERAL(QUIC_PROOF_INVALID);
135 RETURN_STRING_LITERAL(QUIC_CRYPTO_DUPLICATE_TAG);
136 RETURN_STRING_LITERAL(QUIC_CRYPTO_ENCRYPTION_LEVEL_INCORRECT);
137 RETURN_STRING_LITERAL(QUIC_CRYPTO_SERVER_CONFIG_EXPIRED);
138 RETURN_STRING_LITERAL(QUIC_INVALID_CHANNEL_ID_SIGNATURE);
139 RETURN_STRING_LITERAL(QUIC_CRYPTO_SYMMETRIC_KEY_SETUP_FAILED);
140 RETURN_STRING_LITERAL(QUIC_CRYPTO_MESSAGE_WHILE_VALIDATING_CLIENT_HELLO);
141 RETURN_STRING_LITERAL(QUIC_CRYPTO_UPDATE_BEFORE_HANDSHAKE_COMPLETE);
142 RETURN_STRING_LITERAL(QUIC_VERSION_NEGOTIATION_MISMATCH);
143 RETURN_STRING_LITERAL(QUIC_TOO_MANY_OUTSTANDING_SENT_PACKETS);
144 RETURN_STRING_LITERAL(QUIC_TOO_MANY_OUTSTANDING_RECEIVED_PACKETS);
145 RETURN_STRING_LITERAL(QUIC_CONNECTION_CANCELLED);
146 RETURN_STRING_LITERAL(QUIC_BAD_PACKET_LOSS_RATE);
147 RETURN_STRING_LITERAL(QUIC_PUBLIC_RESETS_POST_HANDSHAKE);
148 RETURN_STRING_LITERAL(QUIC_FAILED_TO_SERIALIZE_PACKET);
149 RETURN_STRING_LITERAL(QUIC_TOO_MANY_AVAILABLE_STREAMS);
150 RETURN_STRING_LITERAL(QUIC_UNENCRYPTED_FEC_DATA);
151 RETURN_STRING_LITERAL(QUIC_BAD_MULTIPATH_FLAG);
152 RETURN_STRING_LITERAL(QUIC_IP_ADDRESS_CHANGED);
153 RETURN_STRING_LITERAL(QUIC_CONNECTION_MIGRATION_NO_MIGRATABLE_STREAMS);
154 RETURN_STRING_LITERAL(QUIC_CONNECTION_MIGRATION_TOO_MANY_CHANGES);
155 RETURN_STRING_LITERAL(QUIC_CONNECTION_MIGRATION_NO_NEW_NETWORK);
156 RETURN_STRING_LITERAL(QUIC_CONNECTION_MIGRATION_NON_MIGRATABLE_STREAM);
157 RETURN_STRING_LITERAL(QUIC_TOO_MANY_RTOS);
158 RETURN_STRING_LITERAL(QUIC_ATTEMPT_TO_SEND_UNENCRYPTED_STREAM_DATA);
159 RETURN_STRING_LITERAL(QUIC_MAYBE_CORRUPTED_MEMORY);
160 RETURN_STRING_LITERAL(QUIC_CRYPTO_CHLO_TOO_LARGE);
161 RETURN_STRING_LITERAL(QUIC_MULTIPATH_PATH_DOES_NOT_EXIST);
162 RETURN_STRING_LITERAL(QUIC_MULTIPATH_PATH_NOT_ACTIVE);
163 RETURN_STRING_LITERAL(QUIC_TOO_MANY_STREAM_DATA_INTERVALS);
164 RETURN_STRING_LITERAL(QUIC_STREAM_SEQUENCER_INVALID_STATE);
165 RETURN_STRING_LITERAL(QUIC_TOO_MANY_SESSIONS_ON_SERVER);
166 RETURN_STRING_LITERAL(QUIC_STREAM_LENGTH_OVERFLOW);
167 RETURN_STRING_LITERAL(QUIC_CONNECTION_MIGRATION_DISABLED_BY_CONFIG);
168 RETURN_STRING_LITERAL(QUIC_CONNECTION_MIGRATION_INTERNAL_ERROR);
169 RETURN_STRING_LITERAL(QUIC_INVALID_MAX_DATA_FRAME_DATA);
170 RETURN_STRING_LITERAL(QUIC_INVALID_MAX_STREAM_DATA_FRAME_DATA);
171 RETURN_STRING_LITERAL(QUIC_INVALID_STREAM_BLOCKED_DATA);
172 RETURN_STRING_LITERAL(QUIC_MAX_STREAMS_DATA);
173 RETURN_STRING_LITERAL(QUIC_STREAMS_BLOCKED_DATA);
174 RETURN_STRING_LITERAL(QUIC_INVALID_NEW_CONNECTION_ID_DATA);
175 RETURN_STRING_LITERAL(QUIC_INVALID_RETIRE_CONNECTION_ID_DATA);
176 RETURN_STRING_LITERAL(QUIC_CONNECTION_ID_LIMIT_ERROR);
177 RETURN_STRING_LITERAL(QUIC_TOO_MANY_CONNECTION_ID_WAITING_TO_RETIRE);
178 RETURN_STRING_LITERAL(QUIC_INVALID_STOP_SENDING_FRAME_DATA);
179 RETURN_STRING_LITERAL(QUIC_INVALID_PATH_CHALLENGE_DATA);
180 RETURN_STRING_LITERAL(QUIC_INVALID_PATH_RESPONSE_DATA);
181 RETURN_STRING_LITERAL(QUIC_CONNECTION_MIGRATION_HANDSHAKE_UNCONFIRMED);
182 RETURN_STRING_LITERAL(QUIC_PEER_PORT_CHANGE_HANDSHAKE_UNCONFIRMED);
183 RETURN_STRING_LITERAL(QUIC_INVALID_MESSAGE_DATA);
184 RETURN_STRING_LITERAL(IETF_QUIC_PROTOCOL_VIOLATION);
185 RETURN_STRING_LITERAL(QUIC_INVALID_NEW_TOKEN);
186 RETURN_STRING_LITERAL(QUIC_DATA_RECEIVED_ON_WRITE_UNIDIRECTIONAL_STREAM);
187 RETURN_STRING_LITERAL(QUIC_TRY_TO_WRITE_DATA_ON_READ_UNIDIRECTIONAL_STREAM);
188 RETURN_STRING_LITERAL(QUIC_STREAMS_BLOCKED_ERROR);
189 RETURN_STRING_LITERAL(QUIC_MAX_STREAMS_ERROR);
190 RETURN_STRING_LITERAL(QUIC_HTTP_DECODER_ERROR);
191 RETURN_STRING_LITERAL(QUIC_STALE_CONNECTION_CANCELLED);
192 RETURN_STRING_LITERAL(QUIC_IETF_GQUIC_ERROR_MISSING);
193 RETURN_STRING_LITERAL(
194 QUIC_WINDOW_UPDATE_RECEIVED_ON_READ_UNIDIRECTIONAL_STREAM);
195 RETURN_STRING_LITERAL(QUIC_TOO_MANY_BUFFERED_CONTROL_FRAMES);
196 RETURN_STRING_LITERAL(QUIC_TRANSPORT_INVALID_CLIENT_INDICATION);
197 RETURN_STRING_LITERAL(QUIC_QPACK_DECOMPRESSION_FAILED);
198 RETURN_STRING_LITERAL(QUIC_QPACK_ENCODER_STREAM_ERROR);
199 RETURN_STRING_LITERAL(QUIC_QPACK_DECODER_STREAM_ERROR);
200 RETURN_STRING_LITERAL(QUIC_QPACK_ENCODER_STREAM_INTEGER_TOO_LARGE);
201 RETURN_STRING_LITERAL(QUIC_QPACK_ENCODER_STREAM_STRING_LITERAL_TOO_LONG);
202 RETURN_STRING_LITERAL(QUIC_QPACK_ENCODER_STREAM_HUFFMAN_ENCODING_ERROR);
203 RETURN_STRING_LITERAL(QUIC_QPACK_ENCODER_STREAM_INVALID_STATIC_ENTRY);
204 RETURN_STRING_LITERAL(QUIC_QPACK_ENCODER_STREAM_ERROR_INSERTING_STATIC);
205 RETURN_STRING_LITERAL(
206 QUIC_QPACK_ENCODER_STREAM_INSERTION_INVALID_RELATIVE_INDEX);
207 RETURN_STRING_LITERAL(
208 QUIC_QPACK_ENCODER_STREAM_INSERTION_DYNAMIC_ENTRY_NOT_FOUND);
209 RETURN_STRING_LITERAL(QUIC_QPACK_ENCODER_STREAM_ERROR_INSERTING_DYNAMIC);
210 RETURN_STRING_LITERAL(QUIC_QPACK_ENCODER_STREAM_ERROR_INSERTING_LITERAL);
211 RETURN_STRING_LITERAL(
212 QUIC_QPACK_ENCODER_STREAM_DUPLICATE_INVALID_RELATIVE_INDEX);
213 RETURN_STRING_LITERAL(
214 QUIC_QPACK_ENCODER_STREAM_DUPLICATE_DYNAMIC_ENTRY_NOT_FOUND);
215 RETURN_STRING_LITERAL(QUIC_QPACK_ENCODER_STREAM_SET_DYNAMIC_TABLE_CAPACITY);
216 RETURN_STRING_LITERAL(QUIC_QPACK_DECODER_STREAM_INTEGER_TOO_LARGE);
217 RETURN_STRING_LITERAL(QUIC_QPACK_DECODER_STREAM_INVALID_ZERO_INCREMENT);
218 RETURN_STRING_LITERAL(QUIC_QPACK_DECODER_STREAM_INCREMENT_OVERFLOW);
219 RETURN_STRING_LITERAL(QUIC_QPACK_DECODER_STREAM_IMPOSSIBLE_INSERT_COUNT);
220 RETURN_STRING_LITERAL(QUIC_QPACK_DECODER_STREAM_INCORRECT_ACKNOWLEDGEMENT);
221 RETURN_STRING_LITERAL(QUIC_STREAM_DATA_BEYOND_CLOSE_OFFSET);
222 RETURN_STRING_LITERAL(QUIC_STREAM_MULTIPLE_OFFSET);
223 RETURN_STRING_LITERAL(QUIC_HTTP_FRAME_TOO_LARGE);
224 RETURN_STRING_LITERAL(QUIC_HTTP_FRAME_ERROR);
225 RETURN_STRING_LITERAL(QUIC_HTTP_FRAME_UNEXPECTED_ON_SPDY_STREAM);
226 RETURN_STRING_LITERAL(QUIC_HTTP_FRAME_UNEXPECTED_ON_CONTROL_STREAM);
227 RETURN_STRING_LITERAL(QUIC_HTTP_INVALID_FRAME_SEQUENCE_ON_SPDY_STREAM);
228 RETURN_STRING_LITERAL(QUIC_HTTP_INVALID_FRAME_SEQUENCE_ON_CONTROL_STREAM);
229 RETURN_STRING_LITERAL(QUIC_HTTP_DUPLICATE_UNIDIRECTIONAL_STREAM);
230 RETURN_STRING_LITERAL(QUIC_HTTP_SERVER_INITIATED_BIDIRECTIONAL_STREAM);
231 RETURN_STRING_LITERAL(QUIC_HTTP_STREAM_WRONG_DIRECTION);
232 RETURN_STRING_LITERAL(QUIC_HTTP_CLOSED_CRITICAL_STREAM);
233 RETURN_STRING_LITERAL(QUIC_HTTP_MISSING_SETTINGS_FRAME);
234 RETURN_STRING_LITERAL(QUIC_HTTP_DUPLICATE_SETTING_IDENTIFIER);
235 RETURN_STRING_LITERAL(QUIC_HTTP_INVALID_MAX_PUSH_ID);
236 RETURN_STRING_LITERAL(QUIC_HTTP_STREAM_LIMIT_TOO_LOW);
237 RETURN_STRING_LITERAL(QUIC_HTTP_ZERO_RTT_RESUMPTION_SETTINGS_MISMATCH);
238 RETURN_STRING_LITERAL(QUIC_HTTP_ZERO_RTT_REJECTION_SETTINGS_MISMATCH);
239 RETURN_STRING_LITERAL(QUIC_HTTP_GOAWAY_INVALID_STREAM_ID);
240 RETURN_STRING_LITERAL(QUIC_HTTP_GOAWAY_ID_LARGER_THAN_PREVIOUS);
241 RETURN_STRING_LITERAL(QUIC_HTTP_RECEIVE_SPDY_SETTING);
242 RETURN_STRING_LITERAL(QUIC_HTTP_RECEIVE_SPDY_FRAME);
243 RETURN_STRING_LITERAL(QUIC_HTTP_RECEIVE_SERVER_PUSH);
244 RETURN_STRING_LITERAL(QUIC_HTTP_INVALID_SETTING_VALUE);
245 RETURN_STRING_LITERAL(QUIC_HPACK_INDEX_VARINT_ERROR);
246 RETURN_STRING_LITERAL(QUIC_HPACK_NAME_LENGTH_VARINT_ERROR);
247 RETURN_STRING_LITERAL(QUIC_HPACK_VALUE_LENGTH_VARINT_ERROR);
248 RETURN_STRING_LITERAL(QUIC_HPACK_NAME_TOO_LONG);
249 RETURN_STRING_LITERAL(QUIC_HPACK_VALUE_TOO_LONG);
250 RETURN_STRING_LITERAL(QUIC_HPACK_NAME_HUFFMAN_ERROR);
251 RETURN_STRING_LITERAL(QUIC_HPACK_VALUE_HUFFMAN_ERROR);
252 RETURN_STRING_LITERAL(QUIC_HPACK_MISSING_DYNAMIC_TABLE_SIZE_UPDATE);
253 RETURN_STRING_LITERAL(QUIC_HPACK_INVALID_INDEX);
254 RETURN_STRING_LITERAL(QUIC_HPACK_INVALID_NAME_INDEX);
255 RETURN_STRING_LITERAL(QUIC_HPACK_DYNAMIC_TABLE_SIZE_UPDATE_NOT_ALLOWED);
256 RETURN_STRING_LITERAL(
257 QUIC_HPACK_INITIAL_TABLE_SIZE_UPDATE_IS_ABOVE_LOW_WATER_MARK);
258 RETURN_STRING_LITERAL(
259 QUIC_HPACK_TABLE_SIZE_UPDATE_IS_ABOVE_ACKNOWLEDGED_SETTING);
260 RETURN_STRING_LITERAL(QUIC_HPACK_TRUNCATED_BLOCK);
261 RETURN_STRING_LITERAL(QUIC_HPACK_FRAGMENT_TOO_LONG);
262 RETURN_STRING_LITERAL(QUIC_HPACK_COMPRESSED_HEADER_SIZE_EXCEEDS_LIMIT);
263 RETURN_STRING_LITERAL(QUIC_ZERO_RTT_UNRETRANSMITTABLE);
264 RETURN_STRING_LITERAL(QUIC_ZERO_RTT_REJECTION_LIMIT_REDUCED);
265 RETURN_STRING_LITERAL(QUIC_ZERO_RTT_RESUMPTION_LIMIT_REDUCED);
266 RETURN_STRING_LITERAL(QUIC_SILENT_IDLE_TIMEOUT);
267 RETURN_STRING_LITERAL(QUIC_MISSING_WRITE_KEYS);
268 RETURN_STRING_LITERAL(QUIC_KEY_UPDATE_ERROR);
269 RETURN_STRING_LITERAL(QUIC_AEAD_LIMIT_REACHED);
270 RETURN_STRING_LITERAL(QUIC_MAX_AGE_TIMEOUT);
271 RETURN_STRING_LITERAL(QUIC_INVALID_PRIORITY_UPDATE);
272 RETURN_STRING_LITERAL(QUIC_TLS_BAD_CERTIFICATE);
273 RETURN_STRING_LITERAL(QUIC_TLS_UNSUPPORTED_CERTIFICATE);
274 RETURN_STRING_LITERAL(QUIC_TLS_CERTIFICATE_REVOKED);
275 RETURN_STRING_LITERAL(QUIC_TLS_CERTIFICATE_EXPIRED);
276 RETURN_STRING_LITERAL(QUIC_TLS_CERTIFICATE_UNKNOWN);
277 RETURN_STRING_LITERAL(QUIC_TLS_INTERNAL_ERROR);
278 RETURN_STRING_LITERAL(QUIC_TLS_UNRECOGNIZED_NAME);
279 RETURN_STRING_LITERAL(QUIC_TLS_CERTIFICATE_REQUIRED);
280 RETURN_STRING_LITERAL(QUIC_INVALID_CHARACTER_IN_FIELD_VALUE);
281 RETURN_STRING_LITERAL(QUIC_TLS_UNEXPECTED_KEYING_MATERIAL_EXPORT_LABEL);
282 RETURN_STRING_LITERAL(QUIC_TLS_KEYING_MATERIAL_EXPORTS_MISMATCH);
283 RETURN_STRING_LITERAL(QUIC_TLS_KEYING_MATERIAL_EXPORT_NOT_AVAILABLE);
284 RETURN_STRING_LITERAL(QUIC_UNEXPECTED_DATA_BEFORE_ENCRYPTION_ESTABLISHED);
285 RETURN_STRING_LITERAL(QUIC_SERVER_UNHEALTHY);
286
287 RETURN_STRING_LITERAL(QUIC_LAST_ERROR);
288 // Intentionally have no default case, so we'll break the build
289 // if we add errors and don't put them here.
290 }
291 // Return a default value so that we return this when |error| doesn't match
292 // any of the QuicErrorCodes. This can happen when the ConnectionClose
293 // frame sent by the peer (attacker) has invalid error code.
294 return "INVALID_ERROR_CODE";
295 }
296
QuicIetfTransportErrorCodeString(QuicIetfTransportErrorCodes c)297 std::string QuicIetfTransportErrorCodeString(QuicIetfTransportErrorCodes c) {
298 if (c >= CRYPTO_ERROR_FIRST && c <= CRYPTO_ERROR_LAST) {
299 const int tls_error = static_cast<int>(c - CRYPTO_ERROR_FIRST);
300 const char* tls_error_description = SSL_alert_desc_string_long(tls_error);
301 if (strcmp("unknown", tls_error_description) != 0) {
302 return absl::StrCat("CRYPTO_ERROR(", tls_error_description, ")");
303 }
304 return absl::StrCat("CRYPTO_ERROR(unknown(", tls_error, "))");
305 }
306
307 switch (c) {
308 RETURN_STRING_LITERAL(NO_IETF_QUIC_ERROR);
309 RETURN_STRING_LITERAL(INTERNAL_ERROR);
310 RETURN_STRING_LITERAL(SERVER_BUSY_ERROR);
311 RETURN_STRING_LITERAL(FLOW_CONTROL_ERROR);
312 RETURN_STRING_LITERAL(STREAM_LIMIT_ERROR);
313 RETURN_STRING_LITERAL(STREAM_STATE_ERROR);
314 RETURN_STRING_LITERAL(FINAL_SIZE_ERROR);
315 RETURN_STRING_LITERAL(FRAME_ENCODING_ERROR);
316 RETURN_STRING_LITERAL(TRANSPORT_PARAMETER_ERROR);
317 RETURN_STRING_LITERAL(CONNECTION_ID_LIMIT_ERROR);
318 RETURN_STRING_LITERAL(PROTOCOL_VIOLATION);
319 RETURN_STRING_LITERAL(INVALID_TOKEN);
320 RETURN_STRING_LITERAL(CRYPTO_BUFFER_EXCEEDED);
321 RETURN_STRING_LITERAL(KEY_UPDATE_ERROR);
322 RETURN_STRING_LITERAL(AEAD_LIMIT_REACHED);
323 // CRYPTO_ERROR is handled in the if before this switch, these cases do not
324 // change behavior and are only here to make the compiler happy.
325 case CRYPTO_ERROR_FIRST:
326 case CRYPTO_ERROR_LAST:
327 QUICHE_DCHECK(false) << "Unexpected error " << static_cast<uint64_t>(c);
328 break;
329 }
330
331 return absl::StrCat("Unknown(", static_cast<uint64_t>(c), ")");
332 }
333
operator <<(std::ostream & os,const QuicIetfTransportErrorCodes & c)334 std::ostream& operator<<(std::ostream& os,
335 const QuicIetfTransportErrorCodes& c) {
336 os << QuicIetfTransportErrorCodeString(c);
337 return os;
338 }
339
QuicErrorCodeToTransportErrorCode(QuicErrorCode error)340 QuicErrorCodeToIetfMapping QuicErrorCodeToTransportErrorCode(
341 QuicErrorCode error) {
342 switch (error) {
343 case QUIC_NO_ERROR:
344 return {true, static_cast<uint64_t>(NO_IETF_QUIC_ERROR)};
345 case QUIC_INTERNAL_ERROR:
346 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
347 case QUIC_STREAM_DATA_AFTER_TERMINATION:
348 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
349 case QUIC_INVALID_PACKET_HEADER:
350 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
351 case QUIC_INVALID_FRAME_DATA:
352 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
353 case QUIC_MISSING_PAYLOAD:
354 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
355 case QUIC_INVALID_FEC_DATA:
356 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
357 case QUIC_INVALID_STREAM_DATA:
358 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
359 case QUIC_OVERLAPPING_STREAM_DATA:
360 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
361 case QUIC_UNENCRYPTED_STREAM_DATA:
362 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
363 case QUIC_ATTEMPT_TO_SEND_UNENCRYPTED_STREAM_DATA:
364 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
365 case QUIC_MAYBE_CORRUPTED_MEMORY:
366 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
367 case QUIC_UNENCRYPTED_FEC_DATA:
368 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
369 case QUIC_INVALID_RST_STREAM_DATA:
370 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
371 case QUIC_INVALID_CONNECTION_CLOSE_DATA:
372 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
373 case QUIC_INVALID_GOAWAY_DATA:
374 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
375 case QUIC_INVALID_WINDOW_UPDATE_DATA:
376 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
377 case QUIC_INVALID_BLOCKED_DATA:
378 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
379 case QUIC_INVALID_STOP_WAITING_DATA:
380 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
381 case QUIC_INVALID_PATH_CLOSE_DATA:
382 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
383 case QUIC_INVALID_ACK_DATA:
384 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
385 case QUIC_INVALID_MESSAGE_DATA:
386 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
387 case QUIC_INVALID_VERSION_NEGOTIATION_PACKET:
388 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
389 case QUIC_INVALID_PUBLIC_RST_PACKET:
390 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
391 case QUIC_DECRYPTION_FAILURE:
392 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
393 case QUIC_ENCRYPTION_FAILURE:
394 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
395 case QUIC_PACKET_TOO_LARGE:
396 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
397 case QUIC_PEER_GOING_AWAY:
398 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
399 case QUIC_INVALID_STREAM_ID:
400 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
401 case QUIC_INVALID_PRIORITY:
402 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
403 case QUIC_TOO_MANY_OPEN_STREAMS:
404 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
405 case QUIC_TOO_MANY_AVAILABLE_STREAMS:
406 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
407 case QUIC_PUBLIC_RESET:
408 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
409 case QUIC_INVALID_VERSION:
410 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
411 case QUIC_PACKET_WRONG_VERSION:
412 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
413 case QUIC_INVALID_0RTT_PACKET_NUMBER_OUT_OF_ORDER:
414 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
415 case QUIC_INVALID_HEADER_ID:
416 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
417 case QUIC_INVALID_NEGOTIATED_VALUE:
418 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
419 case QUIC_DECOMPRESSION_FAILURE:
420 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
421 case QUIC_NETWORK_IDLE_TIMEOUT:
422 return {true, static_cast<uint64_t>(NO_IETF_QUIC_ERROR)};
423 case QUIC_SILENT_IDLE_TIMEOUT:
424 return {true, static_cast<uint64_t>(NO_IETF_QUIC_ERROR)};
425 case QUIC_HANDSHAKE_TIMEOUT:
426 return {true, static_cast<uint64_t>(NO_IETF_QUIC_ERROR)};
427 case QUIC_ERROR_MIGRATING_ADDRESS:
428 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
429 case QUIC_ERROR_MIGRATING_PORT:
430 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
431 case QUIC_PACKET_WRITE_ERROR:
432 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
433 case QUIC_PACKET_READ_ERROR:
434 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
435 case QUIC_EMPTY_STREAM_FRAME_NO_FIN:
436 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
437 case QUIC_INVALID_HEADERS_STREAM_DATA:
438 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
439 case QUIC_HEADERS_STREAM_DATA_DECOMPRESS_FAILURE:
440 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
441 case QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA:
442 return {true, static_cast<uint64_t>(FLOW_CONTROL_ERROR)};
443 case QUIC_FLOW_CONTROL_SENT_TOO_MUCH_DATA:
444 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
445 case QUIC_FLOW_CONTROL_INVALID_WINDOW:
446 return {true, static_cast<uint64_t>(FLOW_CONTROL_ERROR)};
447 case QUIC_CONNECTION_IP_POOLED:
448 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
449 case QUIC_TOO_MANY_OUTSTANDING_SENT_PACKETS:
450 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
451 case QUIC_TOO_MANY_OUTSTANDING_RECEIVED_PACKETS:
452 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
453 case QUIC_CONNECTION_CANCELLED:
454 return {true, static_cast<uint64_t>(NO_IETF_QUIC_ERROR)};
455 case QUIC_BAD_PACKET_LOSS_RATE:
456 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
457 case QUIC_PUBLIC_RESETS_POST_HANDSHAKE:
458 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
459 case QUIC_FAILED_TO_SERIALIZE_PACKET:
460 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
461 case QUIC_TOO_MANY_RTOS:
462 return {true, static_cast<uint64_t>(NO_IETF_QUIC_ERROR)};
463 case QUIC_HANDSHAKE_FAILED:
464 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
465 case QUIC_CRYPTO_TAGS_OUT_OF_ORDER:
466 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
467 case QUIC_CRYPTO_TOO_MANY_ENTRIES:
468 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
469 case QUIC_CRYPTO_INVALID_VALUE_LENGTH:
470 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
471 case QUIC_CRYPTO_MESSAGE_AFTER_HANDSHAKE_COMPLETE:
472 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
473 case QUIC_INVALID_CRYPTO_MESSAGE_TYPE:
474 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
475 case QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER:
476 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
477 case QUIC_INVALID_CHANNEL_ID_SIGNATURE:
478 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
479 case QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND:
480 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
481 case QUIC_CRYPTO_MESSAGE_PARAMETER_NO_OVERLAP:
482 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
483 case QUIC_CRYPTO_MESSAGE_INDEX_NOT_FOUND:
484 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
485 case QUIC_UNSUPPORTED_PROOF_DEMAND:
486 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
487 case QUIC_CRYPTO_INTERNAL_ERROR:
488 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
489 case QUIC_CRYPTO_VERSION_NOT_SUPPORTED:
490 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
491 case QUIC_CRYPTO_NO_SUPPORT:
492 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
493 case QUIC_CRYPTO_TOO_MANY_REJECTS:
494 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
495 case QUIC_PROOF_INVALID:
496 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
497 case QUIC_CRYPTO_DUPLICATE_TAG:
498 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
499 case QUIC_CRYPTO_ENCRYPTION_LEVEL_INCORRECT:
500 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
501 case QUIC_CRYPTO_SERVER_CONFIG_EXPIRED:
502 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
503 case QUIC_CRYPTO_SYMMETRIC_KEY_SETUP_FAILED:
504 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
505 case QUIC_CRYPTO_MESSAGE_WHILE_VALIDATING_CLIENT_HELLO:
506 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
507 case QUIC_CRYPTO_UPDATE_BEFORE_HANDSHAKE_COMPLETE:
508 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
509 case QUIC_CRYPTO_CHLO_TOO_LARGE:
510 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
511 case QUIC_VERSION_NEGOTIATION_MISMATCH:
512 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
513 case QUIC_BAD_MULTIPATH_FLAG:
514 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
515 case QUIC_MULTIPATH_PATH_DOES_NOT_EXIST:
516 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
517 case QUIC_MULTIPATH_PATH_NOT_ACTIVE:
518 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
519 case QUIC_IP_ADDRESS_CHANGED:
520 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
521 case QUIC_CONNECTION_MIGRATION_NO_MIGRATABLE_STREAMS:
522 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
523 case QUIC_CONNECTION_MIGRATION_TOO_MANY_CHANGES:
524 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
525 case QUIC_CONNECTION_MIGRATION_NO_NEW_NETWORK:
526 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
527 case QUIC_CONNECTION_MIGRATION_NON_MIGRATABLE_STREAM:
528 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
529 case QUIC_CONNECTION_MIGRATION_DISABLED_BY_CONFIG:
530 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
531 case QUIC_CONNECTION_MIGRATION_INTERNAL_ERROR:
532 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
533 case QUIC_CONNECTION_MIGRATION_HANDSHAKE_UNCONFIRMED:
534 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
535 case QUIC_PEER_PORT_CHANGE_HANDSHAKE_UNCONFIRMED:
536 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
537 case QUIC_TOO_MANY_STREAM_DATA_INTERVALS:
538 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
539 case QUIC_STREAM_SEQUENCER_INVALID_STATE:
540 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
541 case QUIC_TOO_MANY_SESSIONS_ON_SERVER:
542 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
543 case QUIC_STREAM_LENGTH_OVERFLOW:
544 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
545 case QUIC_INVALID_MAX_DATA_FRAME_DATA:
546 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
547 case QUIC_INVALID_MAX_STREAM_DATA_FRAME_DATA:
548 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
549 case QUIC_MAX_STREAMS_DATA:
550 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
551 case QUIC_STREAMS_BLOCKED_DATA:
552 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
553 case QUIC_INVALID_STREAM_BLOCKED_DATA:
554 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
555 case QUIC_INVALID_NEW_CONNECTION_ID_DATA:
556 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
557 case QUIC_INVALID_STOP_SENDING_FRAME_DATA:
558 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
559 case QUIC_INVALID_PATH_CHALLENGE_DATA:
560 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
561 case QUIC_INVALID_PATH_RESPONSE_DATA:
562 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
563 case IETF_QUIC_PROTOCOL_VIOLATION:
564 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
565 case QUIC_INVALID_NEW_TOKEN:
566 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
567 case QUIC_DATA_RECEIVED_ON_WRITE_UNIDIRECTIONAL_STREAM:
568 return {true, static_cast<uint64_t>(STREAM_STATE_ERROR)};
569 case QUIC_TRY_TO_WRITE_DATA_ON_READ_UNIDIRECTIONAL_STREAM:
570 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
571 case QUIC_INVALID_RETIRE_CONNECTION_ID_DATA:
572 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
573 case QUIC_STREAMS_BLOCKED_ERROR:
574 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
575 case QUIC_MAX_STREAMS_ERROR:
576 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
577 case QUIC_HTTP_DECODER_ERROR:
578 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
579 case QUIC_STALE_CONNECTION_CANCELLED:
580 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
581 case QUIC_IETF_GQUIC_ERROR_MISSING:
582 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
583 case QUIC_WINDOW_UPDATE_RECEIVED_ON_READ_UNIDIRECTIONAL_STREAM:
584 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
585 case QUIC_TOO_MANY_BUFFERED_CONTROL_FRAMES:
586 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
587 case QUIC_TRANSPORT_INVALID_CLIENT_INDICATION:
588 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
589 case QUIC_QPACK_DECOMPRESSION_FAILED:
590 return {false, static_cast<uint64_t>(
591 QuicHttpQpackErrorCode::DECOMPRESSION_FAILED)};
592 case QUIC_QPACK_ENCODER_STREAM_ERROR:
593 return {false, static_cast<uint64_t>(
594 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR)};
595 case QUIC_QPACK_DECODER_STREAM_ERROR:
596 return {false, static_cast<uint64_t>(
597 QuicHttpQpackErrorCode::DECODER_STREAM_ERROR)};
598 case QUIC_QPACK_ENCODER_STREAM_INTEGER_TOO_LARGE:
599 return {false, static_cast<uint64_t>(
600 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR)};
601 case QUIC_QPACK_ENCODER_STREAM_STRING_LITERAL_TOO_LONG:
602 return {false, static_cast<uint64_t>(
603 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR)};
604 case QUIC_QPACK_ENCODER_STREAM_HUFFMAN_ENCODING_ERROR:
605 return {false, static_cast<uint64_t>(
606 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR)};
607 case QUIC_QPACK_ENCODER_STREAM_INVALID_STATIC_ENTRY:
608 return {false, static_cast<uint64_t>(
609 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR)};
610 case QUIC_QPACK_ENCODER_STREAM_ERROR_INSERTING_STATIC:
611 return {false, static_cast<uint64_t>(
612 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR)};
613 case QUIC_QPACK_ENCODER_STREAM_INSERTION_INVALID_RELATIVE_INDEX:
614 return {false, static_cast<uint64_t>(
615 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR)};
616 case QUIC_QPACK_ENCODER_STREAM_INSERTION_DYNAMIC_ENTRY_NOT_FOUND:
617 return {false, static_cast<uint64_t>(
618 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR)};
619 case QUIC_QPACK_ENCODER_STREAM_ERROR_INSERTING_DYNAMIC:
620 return {false, static_cast<uint64_t>(
621 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR)};
622 case QUIC_QPACK_ENCODER_STREAM_ERROR_INSERTING_LITERAL:
623 return {false, static_cast<uint64_t>(
624 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR)};
625 case QUIC_QPACK_ENCODER_STREAM_DUPLICATE_INVALID_RELATIVE_INDEX:
626 return {false, static_cast<uint64_t>(
627 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR)};
628 case QUIC_QPACK_ENCODER_STREAM_DUPLICATE_DYNAMIC_ENTRY_NOT_FOUND:
629 return {false, static_cast<uint64_t>(
630 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR)};
631 case QUIC_QPACK_ENCODER_STREAM_SET_DYNAMIC_TABLE_CAPACITY:
632 return {false, static_cast<uint64_t>(
633 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR)};
634 case QUIC_QPACK_DECODER_STREAM_INTEGER_TOO_LARGE:
635 return {false, static_cast<uint64_t>(
636 QuicHttpQpackErrorCode::DECODER_STREAM_ERROR)};
637 case QUIC_QPACK_DECODER_STREAM_INVALID_ZERO_INCREMENT:
638 return {false, static_cast<uint64_t>(
639 QuicHttpQpackErrorCode::DECODER_STREAM_ERROR)};
640 case QUIC_QPACK_DECODER_STREAM_INCREMENT_OVERFLOW:
641 return {false, static_cast<uint64_t>(
642 QuicHttpQpackErrorCode::DECODER_STREAM_ERROR)};
643 case QUIC_QPACK_DECODER_STREAM_IMPOSSIBLE_INSERT_COUNT:
644 return {false, static_cast<uint64_t>(
645 QuicHttpQpackErrorCode::DECODER_STREAM_ERROR)};
646 case QUIC_QPACK_DECODER_STREAM_INCORRECT_ACKNOWLEDGEMENT:
647 return {false, static_cast<uint64_t>(
648 QuicHttpQpackErrorCode::DECODER_STREAM_ERROR)};
649 case QUIC_STREAM_DATA_BEYOND_CLOSE_OFFSET:
650 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
651 case QUIC_STREAM_MULTIPLE_OFFSET:
652 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
653 case QUIC_HTTP_FRAME_TOO_LARGE:
654 return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::EXCESSIVE_LOAD)};
655 case QUIC_HTTP_FRAME_ERROR:
656 return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::FRAME_ERROR)};
657 case QUIC_HTTP_FRAME_UNEXPECTED_ON_SPDY_STREAM:
658 return {false,
659 static_cast<uint64_t>(QuicHttp3ErrorCode::FRAME_UNEXPECTED)};
660 case QUIC_HTTP_FRAME_UNEXPECTED_ON_CONTROL_STREAM:
661 return {false,
662 static_cast<uint64_t>(QuicHttp3ErrorCode::FRAME_UNEXPECTED)};
663 case QUIC_HTTP_INVALID_FRAME_SEQUENCE_ON_SPDY_STREAM:
664 return {false,
665 static_cast<uint64_t>(QuicHttp3ErrorCode::FRAME_UNEXPECTED)};
666 case QUIC_HTTP_INVALID_FRAME_SEQUENCE_ON_CONTROL_STREAM:
667 return {false,
668 static_cast<uint64_t>(QuicHttp3ErrorCode::FRAME_UNEXPECTED)};
669 case QUIC_HTTP_DUPLICATE_UNIDIRECTIONAL_STREAM:
670 return {false,
671 static_cast<uint64_t>(QuicHttp3ErrorCode::STREAM_CREATION_ERROR)};
672 case QUIC_HTTP_SERVER_INITIATED_BIDIRECTIONAL_STREAM:
673 return {false,
674 static_cast<uint64_t>(QuicHttp3ErrorCode::STREAM_CREATION_ERROR)};
675 case QUIC_HTTP_STREAM_WRONG_DIRECTION:
676 return {true, static_cast<uint64_t>(STREAM_STATE_ERROR)};
677 case QUIC_HTTP_CLOSED_CRITICAL_STREAM:
678 return {false, static_cast<uint64_t>(
679 QuicHttp3ErrorCode::CLOSED_CRITICAL_STREAM)};
680 case QUIC_HTTP_MISSING_SETTINGS_FRAME:
681 return {false,
682 static_cast<uint64_t>(QuicHttp3ErrorCode::MISSING_SETTINGS)};
683 case QUIC_HTTP_DUPLICATE_SETTING_IDENTIFIER:
684 return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::SETTINGS_ERROR)};
685 case QUIC_HTTP_INVALID_MAX_PUSH_ID:
686 return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::ID_ERROR)};
687 case QUIC_HTTP_STREAM_LIMIT_TOO_LOW:
688 return {false, static_cast<uint64_t>(
689 QuicHttp3ErrorCode::GENERAL_PROTOCOL_ERROR)};
690 case QUIC_HTTP_RECEIVE_SERVER_PUSH:
691 return {false, static_cast<uint64_t>(
692 QuicHttp3ErrorCode::GENERAL_PROTOCOL_ERROR)};
693 case QUIC_HTTP_ZERO_RTT_RESUMPTION_SETTINGS_MISMATCH:
694 return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::SETTINGS_ERROR)};
695 case QUIC_HTTP_ZERO_RTT_REJECTION_SETTINGS_MISMATCH:
696 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
697 case QUIC_HTTP_GOAWAY_INVALID_STREAM_ID:
698 return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::ID_ERROR)};
699 case QUIC_HTTP_GOAWAY_ID_LARGER_THAN_PREVIOUS:
700 return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::ID_ERROR)};
701 case QUIC_HTTP_RECEIVE_SPDY_SETTING:
702 return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::SETTINGS_ERROR)};
703 case QUIC_HTTP_INVALID_SETTING_VALUE:
704 return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::SETTINGS_ERROR)};
705 case QUIC_HTTP_RECEIVE_SPDY_FRAME:
706 return {false,
707 static_cast<uint64_t>(QuicHttp3ErrorCode::FRAME_UNEXPECTED)};
708 case QUIC_HPACK_INDEX_VARINT_ERROR:
709 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
710 case QUIC_HPACK_NAME_LENGTH_VARINT_ERROR:
711 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
712 case QUIC_HPACK_VALUE_LENGTH_VARINT_ERROR:
713 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
714 case QUIC_HPACK_NAME_TOO_LONG:
715 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
716 case QUIC_HPACK_VALUE_TOO_LONG:
717 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
718 case QUIC_HPACK_NAME_HUFFMAN_ERROR:
719 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
720 case QUIC_HPACK_VALUE_HUFFMAN_ERROR:
721 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
722 case QUIC_HPACK_MISSING_DYNAMIC_TABLE_SIZE_UPDATE:
723 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
724 case QUIC_HPACK_INVALID_INDEX:
725 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
726 case QUIC_HPACK_INVALID_NAME_INDEX:
727 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
728 case QUIC_HPACK_DYNAMIC_TABLE_SIZE_UPDATE_NOT_ALLOWED:
729 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
730 case QUIC_HPACK_INITIAL_TABLE_SIZE_UPDATE_IS_ABOVE_LOW_WATER_MARK:
731 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
732 case QUIC_HPACK_TABLE_SIZE_UPDATE_IS_ABOVE_ACKNOWLEDGED_SETTING:
733 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
734 case QUIC_HPACK_TRUNCATED_BLOCK:
735 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
736 case QUIC_HPACK_FRAGMENT_TOO_LONG:
737 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
738 case QUIC_HPACK_COMPRESSED_HEADER_SIZE_EXCEEDS_LIMIT:
739 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
740 case QUIC_ZERO_RTT_UNRETRANSMITTABLE:
741 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
742 case QUIC_ZERO_RTT_REJECTION_LIMIT_REDUCED:
743 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
744 case QUIC_ZERO_RTT_RESUMPTION_LIMIT_REDUCED:
745 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
746 case QUIC_MISSING_WRITE_KEYS:
747 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
748 case QUIC_KEY_UPDATE_ERROR:
749 return {true, static_cast<uint64_t>(KEY_UPDATE_ERROR)};
750 case QUIC_AEAD_LIMIT_REACHED:
751 return {true, static_cast<uint64_t>(AEAD_LIMIT_REACHED)};
752 case QUIC_MAX_AGE_TIMEOUT:
753 return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::INTERNAL_ERROR)};
754 case QUIC_INVALID_PRIORITY_UPDATE:
755 return {false, static_cast<uint64_t>(
756 QuicHttp3ErrorCode::GENERAL_PROTOCOL_ERROR)};
757 case QUIC_TLS_BAD_CERTIFICATE:
758 return {true, static_cast<uint64_t>(CRYPTO_ERROR_FIRST +
759 SSL_AD_BAD_CERTIFICATE)};
760 case QUIC_TLS_UNSUPPORTED_CERTIFICATE:
761 return {true, static_cast<uint64_t>(CRYPTO_ERROR_FIRST +
762 SSL_AD_UNSUPPORTED_CERTIFICATE)};
763 case QUIC_TLS_CERTIFICATE_REVOKED:
764 return {true, static_cast<uint64_t>(CRYPTO_ERROR_FIRST +
765 SSL_AD_CERTIFICATE_REVOKED)};
766 case QUIC_TLS_CERTIFICATE_EXPIRED:
767 return {true, static_cast<uint64_t>(CRYPTO_ERROR_FIRST +
768 SSL_AD_CERTIFICATE_EXPIRED)};
769 case QUIC_TLS_CERTIFICATE_UNKNOWN:
770 return {true, static_cast<uint64_t>(CRYPTO_ERROR_FIRST +
771 SSL_AD_CERTIFICATE_UNKNOWN)};
772 case QUIC_TLS_INTERNAL_ERROR:
773 return {true, static_cast<uint64_t>(CRYPTO_ERROR_FIRST +
774 SSL_AD_INTERNAL_ERROR)};
775 case QUIC_TLS_UNRECOGNIZED_NAME:
776 return {true, static_cast<uint64_t>(CRYPTO_ERROR_FIRST +
777 SSL_AD_UNRECOGNIZED_NAME)};
778 case QUIC_TLS_CERTIFICATE_REQUIRED:
779 return {true, static_cast<uint64_t>(CRYPTO_ERROR_FIRST +
780 SSL_AD_CERTIFICATE_REQUIRED)};
781 case QUIC_CONNECTION_ID_LIMIT_ERROR:
782 return {true, static_cast<uint64_t>(CONNECTION_ID_LIMIT_ERROR)};
783 case QUIC_TOO_MANY_CONNECTION_ID_WAITING_TO_RETIRE:
784 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
785 case QUIC_INVALID_CHARACTER_IN_FIELD_VALUE:
786 return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::MESSAGE_ERROR)};
787 case QUIC_TLS_UNEXPECTED_KEYING_MATERIAL_EXPORT_LABEL:
788 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
789 case QUIC_TLS_KEYING_MATERIAL_EXPORTS_MISMATCH:
790 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
791 case QUIC_TLS_KEYING_MATERIAL_EXPORT_NOT_AVAILABLE:
792 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
793 case QUIC_UNEXPECTED_DATA_BEFORE_ENCRYPTION_ESTABLISHED:
794 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
795 case QUIC_SERVER_UNHEALTHY:
796 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
797 case QUIC_LAST_ERROR:
798 return {false, static_cast<uint64_t>(QUIC_LAST_ERROR)};
799 }
800 // This function should not be called with unknown error code.
801 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
802 }
803
TlsAlertToQuicErrorCode(uint8_t desc)804 QuicErrorCode TlsAlertToQuicErrorCode(uint8_t desc) {
805 switch (desc) {
806 case SSL_AD_BAD_CERTIFICATE:
807 return QUIC_TLS_BAD_CERTIFICATE;
808 case SSL_AD_UNSUPPORTED_CERTIFICATE:
809 return QUIC_TLS_UNSUPPORTED_CERTIFICATE;
810 case SSL_AD_CERTIFICATE_REVOKED:
811 return QUIC_TLS_CERTIFICATE_REVOKED;
812 case SSL_AD_CERTIFICATE_EXPIRED:
813 return QUIC_TLS_CERTIFICATE_EXPIRED;
814 case SSL_AD_CERTIFICATE_UNKNOWN:
815 return QUIC_TLS_CERTIFICATE_UNKNOWN;
816 case SSL_AD_INTERNAL_ERROR:
817 return QUIC_TLS_INTERNAL_ERROR;
818 case SSL_AD_UNRECOGNIZED_NAME:
819 return QUIC_TLS_UNRECOGNIZED_NAME;
820 case SSL_AD_CERTIFICATE_REQUIRED:
821 return QUIC_TLS_CERTIFICATE_REQUIRED;
822 default:
823 return QUIC_HANDSHAKE_FAILED;
824 }
825 }
826
827 // Convert a QuicRstStreamErrorCode to an application error code to be used in
828 // an IETF QUIC RESET_STREAM frame
RstStreamErrorCodeToIetfResetStreamErrorCode(QuicRstStreamErrorCode rst_stream_error_code)829 uint64_t RstStreamErrorCodeToIetfResetStreamErrorCode(
830 QuicRstStreamErrorCode rst_stream_error_code) {
831 switch (rst_stream_error_code) {
832 case QUIC_STREAM_NO_ERROR:
833 return static_cast<uint64_t>(QuicHttp3ErrorCode::HTTP3_NO_ERROR);
834 case QUIC_ERROR_PROCESSING_STREAM:
835 return static_cast<uint64_t>(QuicHttp3ErrorCode::GENERAL_PROTOCOL_ERROR);
836 case QUIC_MULTIPLE_TERMINATION_OFFSETS:
837 return static_cast<uint64_t>(QuicHttp3ErrorCode::GENERAL_PROTOCOL_ERROR);
838 case QUIC_BAD_APPLICATION_PAYLOAD:
839 return static_cast<uint64_t>(QuicHttp3ErrorCode::GENERAL_PROTOCOL_ERROR);
840 case QUIC_STREAM_CONNECTION_ERROR:
841 return static_cast<uint64_t>(QuicHttp3ErrorCode::INTERNAL_ERROR);
842 case QUIC_STREAM_PEER_GOING_AWAY:
843 return static_cast<uint64_t>(QuicHttp3ErrorCode::GENERAL_PROTOCOL_ERROR);
844 case QUIC_STREAM_CANCELLED:
845 return static_cast<uint64_t>(QuicHttp3ErrorCode::REQUEST_CANCELLED);
846 case QUIC_RST_ACKNOWLEDGEMENT:
847 return static_cast<uint64_t>(QuicHttp3ErrorCode::HTTP3_NO_ERROR);
848 case QUIC_REFUSED_STREAM:
849 return static_cast<uint64_t>(QuicHttp3ErrorCode::ID_ERROR);
850 case QUIC_INVALID_PROMISE_URL:
851 return static_cast<uint64_t>(QuicHttp3ErrorCode::STREAM_CREATION_ERROR);
852 case QUIC_UNAUTHORIZED_PROMISE_URL:
853 return static_cast<uint64_t>(QuicHttp3ErrorCode::STREAM_CREATION_ERROR);
854 case QUIC_DUPLICATE_PROMISE_URL:
855 return static_cast<uint64_t>(QuicHttp3ErrorCode::STREAM_CREATION_ERROR);
856 case QUIC_PROMISE_VARY_MISMATCH:
857 return static_cast<uint64_t>(QuicHttp3ErrorCode::REQUEST_CANCELLED);
858 case QUIC_INVALID_PROMISE_METHOD:
859 return static_cast<uint64_t>(QuicHttp3ErrorCode::STREAM_CREATION_ERROR);
860 case QUIC_PUSH_STREAM_TIMED_OUT:
861 return static_cast<uint64_t>(QuicHttp3ErrorCode::REQUEST_CANCELLED);
862 case QUIC_HEADERS_TOO_LARGE:
863 return static_cast<uint64_t>(QuicHttp3ErrorCode::EXCESSIVE_LOAD);
864 case QUIC_STREAM_TTL_EXPIRED:
865 return static_cast<uint64_t>(QuicHttp3ErrorCode::REQUEST_CANCELLED);
866 case QUIC_DATA_AFTER_CLOSE_OFFSET:
867 return static_cast<uint64_t>(QuicHttp3ErrorCode::GENERAL_PROTOCOL_ERROR);
868 case QUIC_STREAM_GENERAL_PROTOCOL_ERROR:
869 return static_cast<uint64_t>(QuicHttp3ErrorCode::GENERAL_PROTOCOL_ERROR);
870 case QUIC_STREAM_INTERNAL_ERROR:
871 return static_cast<uint64_t>(QuicHttp3ErrorCode::INTERNAL_ERROR);
872 case QUIC_STREAM_STREAM_CREATION_ERROR:
873 return static_cast<uint64_t>(QuicHttp3ErrorCode::STREAM_CREATION_ERROR);
874 case QUIC_STREAM_CLOSED_CRITICAL_STREAM:
875 return static_cast<uint64_t>(QuicHttp3ErrorCode::CLOSED_CRITICAL_STREAM);
876 case QUIC_STREAM_FRAME_UNEXPECTED:
877 return static_cast<uint64_t>(QuicHttp3ErrorCode::FRAME_UNEXPECTED);
878 case QUIC_STREAM_FRAME_ERROR:
879 return static_cast<uint64_t>(QuicHttp3ErrorCode::FRAME_ERROR);
880 case QUIC_STREAM_EXCESSIVE_LOAD:
881 return static_cast<uint64_t>(QuicHttp3ErrorCode::EXCESSIVE_LOAD);
882 case QUIC_STREAM_ID_ERROR:
883 return static_cast<uint64_t>(QuicHttp3ErrorCode::ID_ERROR);
884 case QUIC_STREAM_SETTINGS_ERROR:
885 return static_cast<uint64_t>(QuicHttp3ErrorCode::SETTINGS_ERROR);
886 case QUIC_STREAM_MISSING_SETTINGS:
887 return static_cast<uint64_t>(QuicHttp3ErrorCode::MISSING_SETTINGS);
888 case QUIC_STREAM_REQUEST_REJECTED:
889 return static_cast<uint64_t>(QuicHttp3ErrorCode::REQUEST_REJECTED);
890 case QUIC_STREAM_REQUEST_INCOMPLETE:
891 return static_cast<uint64_t>(QuicHttp3ErrorCode::REQUEST_INCOMPLETE);
892 case QUIC_STREAM_CONNECT_ERROR:
893 return static_cast<uint64_t>(QuicHttp3ErrorCode::CONNECT_ERROR);
894 case QUIC_STREAM_VERSION_FALLBACK:
895 return static_cast<uint64_t>(QuicHttp3ErrorCode::VERSION_FALLBACK);
896 case QUIC_STREAM_DECOMPRESSION_FAILED:
897 return static_cast<uint64_t>(
898 QuicHttpQpackErrorCode::DECOMPRESSION_FAILED);
899 case QUIC_STREAM_ENCODER_STREAM_ERROR:
900 return static_cast<uint64_t>(
901 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR);
902 case QUIC_STREAM_DECODER_STREAM_ERROR:
903 return static_cast<uint64_t>(
904 QuicHttpQpackErrorCode::DECODER_STREAM_ERROR);
905 case QUIC_STREAM_UNKNOWN_APPLICATION_ERROR_CODE:
906 return static_cast<uint64_t>(QuicHttp3ErrorCode::INTERNAL_ERROR);
907 case QUIC_STREAM_WEBTRANSPORT_SESSION_GONE:
908 return static_cast<uint64_t>(QuicHttp3ErrorCode::CONNECT_ERROR);
909 case QUIC_STREAM_WEBTRANSPORT_BUFFERED_STREAMS_LIMIT_EXCEEDED:
910 return static_cast<uint64_t>(QuicHttp3ErrorCode::CONNECT_ERROR);
911 case QUIC_APPLICATION_DONE_WITH_STREAM:
912 return static_cast<uint64_t>(QuicHttp3ErrorCode::GENERAL_PROTOCOL_ERROR);
913 case QUIC_STREAM_LAST_ERROR:
914 return static_cast<uint64_t>(QuicHttp3ErrorCode::INTERNAL_ERROR);
915 }
916 return static_cast<uint64_t>(QuicHttp3ErrorCode::INTERNAL_ERROR);
917 }
918
919 // Convert the application error code of an IETF QUIC RESET_STREAM frame
920 // to QuicRstStreamErrorCode.
IetfResetStreamErrorCodeToRstStreamErrorCode(uint64_t ietf_error_code)921 QuicRstStreamErrorCode IetfResetStreamErrorCodeToRstStreamErrorCode(
922 uint64_t ietf_error_code) {
923 switch (ietf_error_code) {
924 case static_cast<uint64_t>(QuicHttp3ErrorCode::HTTP3_NO_ERROR):
925 return QUIC_STREAM_NO_ERROR;
926 case static_cast<uint64_t>(QuicHttp3ErrorCode::GENERAL_PROTOCOL_ERROR):
927 return QUIC_STREAM_GENERAL_PROTOCOL_ERROR;
928 case static_cast<uint64_t>(QuicHttp3ErrorCode::INTERNAL_ERROR):
929 return QUIC_STREAM_INTERNAL_ERROR;
930 case static_cast<uint64_t>(QuicHttp3ErrorCode::STREAM_CREATION_ERROR):
931 return QUIC_STREAM_STREAM_CREATION_ERROR;
932 case static_cast<uint64_t>(QuicHttp3ErrorCode::CLOSED_CRITICAL_STREAM):
933 return QUIC_STREAM_CLOSED_CRITICAL_STREAM;
934 case static_cast<uint64_t>(QuicHttp3ErrorCode::FRAME_UNEXPECTED):
935 return QUIC_STREAM_FRAME_UNEXPECTED;
936 case static_cast<uint64_t>(QuicHttp3ErrorCode::FRAME_ERROR):
937 return QUIC_STREAM_FRAME_ERROR;
938 case static_cast<uint64_t>(QuicHttp3ErrorCode::EXCESSIVE_LOAD):
939 return QUIC_STREAM_EXCESSIVE_LOAD;
940 case static_cast<uint64_t>(QuicHttp3ErrorCode::ID_ERROR):
941 return QUIC_STREAM_ID_ERROR;
942 case static_cast<uint64_t>(QuicHttp3ErrorCode::SETTINGS_ERROR):
943 return QUIC_STREAM_SETTINGS_ERROR;
944 case static_cast<uint64_t>(QuicHttp3ErrorCode::MISSING_SETTINGS):
945 return QUIC_STREAM_MISSING_SETTINGS;
946 case static_cast<uint64_t>(QuicHttp3ErrorCode::REQUEST_REJECTED):
947 return QUIC_STREAM_REQUEST_REJECTED;
948 case static_cast<uint64_t>(QuicHttp3ErrorCode::REQUEST_CANCELLED):
949 return QUIC_STREAM_CANCELLED;
950 case static_cast<uint64_t>(QuicHttp3ErrorCode::REQUEST_INCOMPLETE):
951 return QUIC_STREAM_REQUEST_INCOMPLETE;
952 case static_cast<uint64_t>(QuicHttp3ErrorCode::CONNECT_ERROR):
953 return QUIC_STREAM_CONNECT_ERROR;
954 case static_cast<uint64_t>(QuicHttp3ErrorCode::VERSION_FALLBACK):
955 return QUIC_STREAM_VERSION_FALLBACK;
956 case static_cast<uint64_t>(QuicHttpQpackErrorCode::DECOMPRESSION_FAILED):
957 return QUIC_STREAM_DECOMPRESSION_FAILED;
958 case static_cast<uint64_t>(QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR):
959 return QUIC_STREAM_ENCODER_STREAM_ERROR;
960 case static_cast<uint64_t>(QuicHttpQpackErrorCode::DECODER_STREAM_ERROR):
961 return QUIC_STREAM_DECODER_STREAM_ERROR;
962 }
963 return QUIC_STREAM_UNKNOWN_APPLICATION_ERROR_CODE;
964 }
965
966 // static
FromInternal(QuicRstStreamErrorCode code)967 QuicResetStreamError QuicResetStreamError::FromInternal(
968 QuicRstStreamErrorCode code) {
969 return QuicResetStreamError(
970 code, RstStreamErrorCodeToIetfResetStreamErrorCode(code));
971 }
972
973 // static
FromIetf(uint64_t code)974 QuicResetStreamError QuicResetStreamError::FromIetf(uint64_t code) {
975 return QuicResetStreamError(
976 IetfResetStreamErrorCodeToRstStreamErrorCode(code), code);
977 }
978
979 // static
FromIetf(QuicHttp3ErrorCode code)980 QuicResetStreamError QuicResetStreamError::FromIetf(QuicHttp3ErrorCode code) {
981 return FromIetf(static_cast<uint64_t>(code));
982 }
983
984 // static
FromIetf(QuicHttpQpackErrorCode code)985 QuicResetStreamError QuicResetStreamError::FromIetf(
986 QuicHttpQpackErrorCode code) {
987 return FromIetf(static_cast<uint64_t>(code));
988 }
989
990 #undef RETURN_STRING_LITERAL // undef for jumbo builds
991
992 } // namespace quic
993