xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/quic/core/quic_error_codes.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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