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