1/*
2 * nghttp3
3 *
4 * Copyright (c) 2019 nghttp3 contributors
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining
7 * a copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sublicense, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be
15 * included in all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 */
25#include "nghttp3_err.h"
26
27const char *nghttp3_strerror(int liberr) {
28  switch (liberr) {
29  case NGHTTP3_ERR_INVALID_ARGUMENT:
30    return "ERR_INVALID_ARGUMENT";
31  case NGHTTP3_ERR_NOBUF:
32    return "ERR_NOBUF";
33  case NGHTTP3_ERR_INVALID_STATE:
34    return "ERR_INVALID_STATE";
35  case NGHTTP3_ERR_WOULDBLOCK:
36    return "ERR_WOULDBLOCK";
37  case NGHTTP3_ERR_STREAM_IN_USE:
38    return "ERR_STREAM_IN_USE";
39  case NGHTTP3_ERR_MALFORMED_HTTP_HEADER:
40    return "ERR_MALFORMED_HTTP_HEADER";
41  case NGHTTP3_ERR_REMOVE_HTTP_HEADER:
42    return "ERR_REMOVE_HTTP_HEADER";
43  case NGHTTP3_ERR_MALFORMED_HTTP_MESSAGING:
44    return "ERR_MALFORMED_HTTP_MESSAGING";
45  case NGHTTP3_ERR_QPACK_FATAL:
46    return "ERR_QPACK_FATAL";
47  case NGHTTP3_ERR_QPACK_HEADER_TOO_LARGE:
48    return "ERR_QPACK_HEADER_TOO_LARGE";
49  case NGHTTP3_ERR_STREAM_NOT_FOUND:
50    return "ERR_STREAM_NOT_FOUND";
51  case NGHTTP3_ERR_CONN_CLOSING:
52    return "ERR_CONN_CLOSING";
53  case NGHTTP3_ERR_STREAM_DATA_OVERFLOW:
54    return "ERR_STREAM_DATA_OVERFLOW";
55  case NGHTTP3_ERR_QPACK_DECOMPRESSION_FAILED:
56    return "ERR_QPACK_DECOMPRESSION_FAILED";
57  case NGHTTP3_ERR_QPACK_ENCODER_STREAM_ERROR:
58    return "ERR_QPACK_ENCODER_STREAM_ERROR";
59  case NGHTTP3_ERR_QPACK_DECODER_STREAM_ERROR:
60    return "ERR_QPACK_DECODER_STREAM_ERROR";
61  case NGHTTP3_ERR_H3_FRAME_UNEXPECTED:
62    return "ERR_H3_FRAME_UNEXPECTED";
63  case NGHTTP3_ERR_H3_FRAME_ERROR:
64    return "ERR_H3_FRAME_ERROR";
65  case NGHTTP3_ERR_H3_MISSING_SETTINGS:
66    return "ERR_H3_MISSING_SETTINGS";
67  case NGHTTP3_ERR_H3_INTERNAL_ERROR:
68    return "ERR_H3_INTERNAL_ERROR";
69  case NGHTTP3_ERR_H3_CLOSED_CRITICAL_STREAM:
70    return "ERR_CLOSED_CRITICAL_STREAM";
71  case NGHTTP3_ERR_H3_GENERAL_PROTOCOL_ERROR:
72    return "ERR_H3_GENERAL_PROTOCOL_ERROR";
73  case NGHTTP3_ERR_H3_ID_ERROR:
74    return "ERR_H3_ID_ERROR";
75  case NGHTTP3_ERR_H3_SETTINGS_ERROR:
76    return "ERR_H3_SETTINGS_ERROR";
77  case NGHTTP3_ERR_H3_STREAM_CREATION_ERROR:
78    return "ERR_H3_STREAM_CREATION_ERROR";
79  case NGHTTP3_ERR_NOMEM:
80    return "ERR_NOMEM";
81  case NGHTTP3_ERR_CALLBACK_FAILURE:
82    return "ERR_CALLBACK_FAILURE";
83  default:
84    return "(unknown)";
85  }
86}
87
88uint64_t nghttp3_err_infer_quic_app_error_code(int liberr) {
89  switch (liberr) {
90  case 0:
91    return NGHTTP3_H3_NO_ERROR;
92  case NGHTTP3_ERR_QPACK_DECOMPRESSION_FAILED:
93    return NGHTTP3_QPACK_DECOMPRESSION_FAILED;
94  case NGHTTP3_ERR_QPACK_ENCODER_STREAM_ERROR:
95    return NGHTTP3_QPACK_ENCODER_STREAM_ERROR;
96  case NGHTTP3_ERR_QPACK_DECODER_STREAM_ERROR:
97    return NGHTTP3_QPACK_DECODER_STREAM_ERROR;
98  case NGHTTP3_ERR_H3_FRAME_UNEXPECTED:
99    return NGHTTP3_H3_FRAME_UNEXPECTED;
100  case NGHTTP3_ERR_H3_FRAME_ERROR:
101    return NGHTTP3_H3_FRAME_ERROR;
102  case NGHTTP3_ERR_H3_MISSING_SETTINGS:
103    return NGHTTP3_H3_MISSING_SETTINGS;
104  case NGHTTP3_ERR_H3_INTERNAL_ERROR:
105  case NGHTTP3_ERR_NOMEM:
106  case NGHTTP3_ERR_CALLBACK_FAILURE:
107    return NGHTTP3_H3_INTERNAL_ERROR;
108  case NGHTTP3_ERR_H3_CLOSED_CRITICAL_STREAM:
109    return NGHTTP3_H3_CLOSED_CRITICAL_STREAM;
110  case NGHTTP3_ERR_H3_GENERAL_PROTOCOL_ERROR:
111    return NGHTTP3_H3_GENERAL_PROTOCOL_ERROR;
112  case NGHTTP3_ERR_H3_ID_ERROR:
113    return NGHTTP3_H3_ID_ERROR;
114  case NGHTTP3_ERR_H3_SETTINGS_ERROR:
115    return NGHTTP3_H3_SETTINGS_ERROR;
116  case NGHTTP3_ERR_H3_STREAM_CREATION_ERROR:
117    return NGHTTP3_H3_STREAM_CREATION_ERROR;
118  case NGHTTP3_ERR_MALFORMED_HTTP_HEADER:
119  case NGHTTP3_ERR_MALFORMED_HTTP_MESSAGING:
120    return NGHTTP3_H3_MESSAGE_ERROR;
121  default:
122    return NGHTTP3_H3_GENERAL_PROTOCOL_ERROR;
123  }
124}
125
126int nghttp3_err_is_fatal(int liberr) { return liberr < NGHTTP3_ERR_FATAL; }
127