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