GNU libmicrohttpd  0.9.72
reason_phrase.c
Go to the documentation of this file.
1 /*
2  This file is part of libmicrohttpd
3  Copyright (C) 2007, 2011, 2017, 2019 Christian Grothoff, Karlson2k (Evgeny Grin)
4 
5  This library is free software; you can redistribute it and/or
6  modify it under the terms of the GNU Lesser General Public
7  License as published by the Free Software Foundation; either
8  version 2.1 of the License, or (at your option) any later version.
9 
10  This library is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  Lesser General Public License for more details.
14 
15  You should have received a copy of the GNU Lesser General Public
16  License along with this library; if not, write to the Free Software
17  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 
19 */
27 #include "platform.h"
28 #include "microhttpd.h"
29 
30 #ifndef NULL
31 #define NULL ((void*) 0)
32 #endif
33 
34 static const char *const invalid_hundred[] = {
35  NULL
36 };
37 
38 static const char *const one_hundred[] = {
39  /* 100 */ "Continue", /* RFC7231, Section 6.2.1 */
40  /* 101 */ "Switching Protocols", /* RFC7231, Section 6.2.2 */
41  /* 102 */ "Processing", /* RFC2518 */
42  /* 103 */ "Early Hints" /* RFC8297 */
43 };
44 
45 static const char *const two_hundred[] = {
46  /* 200 */ "OK", /* RFC7231, Section 6.3.1 */
47  /* 201 */ "Created", /* RFC7231, Section 6.3.2 */
48  /* 202 */ "Accepted", /* RFC7231, Section 6.3.3 */
49  /* 203 */ "Non-Authoritative Information", /* RFC7231, Section 6.3.4 */
50  /* 204 */ "No Content", /* RFC7231, Section 6.3.5 */
51  /* 205 */ "Reset Content", /* RFC7231, Section 6.3.6 */
52  /* 206 */ "Partial Content", /* RFC7233, Section 4.1 */
53  /* 207 */ "Multi-Status", /* RFC4918 */
54  /* 208 */ "Already Reported", /* RFC5842 */
55  /* 209 */ "Unknown", /* Not used */
56  /* 210 */ "Unknown", /* Not used */
57  /* 211 */ "Unknown", /* Not used */
58  /* 212 */ "Unknown", /* Not used */
59  /* 213 */ "Unknown", /* Not used */
60  /* 214 */ "Unknown", /* Not used */
61  /* 215 */ "Unknown", /* Not used */
62  /* 216 */ "Unknown", /* Not used */
63  /* 217 */ "Unknown", /* Not used */
64  /* 218 */ "Unknown", /* Not used */
65  /* 219 */ "Unknown", /* Not used */
66  /* 220 */ "Unknown", /* Not used */
67  /* 221 */ "Unknown", /* Not used */
68  /* 222 */ "Unknown", /* Not used */
69  /* 223 */ "Unknown", /* Not used */
70  /* 224 */ "Unknown", /* Not used */
71  /* 225 */ "Unknown", /* Not used */
72  /* 226 */ "IM Used" /* RFC3229 */
73 };
74 
75 static const char *const three_hundred[] = {
76  /* 300 */ "Multiple Choices", /* RFC7231, Section 6.4.1 */
77  /* 301 */ "Moved Permanently", /* RFC7231, Section 6.4.2 */
78  /* 302 */ "Found", /* RFC7231, Section 6.4.3 */
79  /* 303 */ "See Other", /* RFC7231, Section 6.4.4 */
80  /* 304 */ "Not Modified", /* RFC7232, Section 4.1 */
81  /* 305 */ "Use Proxy", /* RFC7231, Section 6.4.5 */
82  /* 306 */ "Switch Proxy", /* Not used! RFC7231, Section 6.4.6 */
83  /* 307 */ "Temporary Redirect", /* RFC7231, Section 6.4.7 */
84  /* 308 */ "Permanent Redirect" /* RFC7538 */
85 };
86 
87 static const char *const four_hundred[] = {
88  /* 400 */ "Bad Request", /* RFC7231, Section 6.5.1 */
89  /* 401 */ "Unauthorized", /* RFC7235, Section 3.1 */
90  /* 402 */ "Payment Required", /* RFC7231, Section 6.5.2 */
91  /* 403 */ "Forbidden", /* RFC7231, Section 6.5.3 */
92  /* 404 */ "Not Found", /* RFC7231, Section 6.5.4 */
93  /* 405 */ "Method Not Allowed", /* RFC7231, Section 6.5.5 */
94  /* 406 */ "Not Acceptable", /* RFC7231, Section 6.5.6 */
95  /* 407 */ "Proxy Authentication Required", /* RFC7235, Section 3.2 */
96  /* 408 */ "Request Timeout", /* RFC7231, Section 6.5.7 */
97  /* 409 */ "Conflict", /* RFC7231, Section 6.5.8 */
98  /* 410 */ "Gone", /* RFC7231, Section 6.5.9 */
99  /* 411 */ "Length Required", /* RFC7231, Section 6.5.10 */
100  /* 412 */ "Precondition Failed", /* RFC7232, Section 4.2; RFC8144, Section 3.2 */
101  /* 413 */ "Payload Too Large", /* RFC7231, Section 6.5.11 */
102  /* 414 */ "URI Too Long", /* RFC7231, Section 6.5.12 */
103  /* 415 */ "Unsupported Media Type", /* RFC7231, Section 6.5.13; RFC7694, Section 3 */
104  /* 416 */ "Range Not Satisfiable", /* RFC7233, Section 4.4 */
105  /* 417 */ "Expectation Failed", /* RFC7231, Section 6.5.14 */
106  /* 418 */ "Unknown", /* Not used */
107  /* 419 */ "Unknown", /* Not used */
108  /* 420 */ "Unknown", /* Not used */
109  /* 421 */ "Misdirected Request", /* RFC7540, Section 9.1.2 */
110  /* 422 */ "Unprocessable Entity", /* RFC4918 */
111  /* 423 */ "Locked", /* RFC4918 */
112  /* 424 */ "Failed Dependency", /* RFC4918 */
113  /* 425 */ "Too Early", /* RFC8470 */
114  /* 426 */ "Upgrade Required", /* RFC7231, Section 6.5.15 */
115  /* 427 */ "Unknown", /* Not used */
116  /* 428 */ "Precondition Required", /* RFC6585 */
117  /* 429 */ "Too Many Requests", /* RFC6585 */
118  /* 430 */ "Unknown", /* Not used */
119  /* 431 */ "Request Header Fields Too Large", /* RFC6585 */
120  /* 432 */ "Unknown", /* Not used */
121  /* 433 */ "Unknown", /* Not used */
122  /* 434 */ "Unknown", /* Not used */
123  /* 435 */ "Unknown", /* Not used */
124  /* 436 */ "Unknown", /* Not used */
125  /* 437 */ "Unknown", /* Not used */
126  /* 438 */ "Unknown", /* Not used */
127  /* 439 */ "Unknown", /* Not used */
128  /* 440 */ "Unknown", /* Not used */
129  /* 441 */ "Unknown", /* Not used */
130  /* 442 */ "Unknown", /* Not used */
131  /* 443 */ "Unknown", /* Not used */
132  /* 444 */ "Unknown", /* Not used */
133  /* 445 */ "Unknown", /* Not used */
134  /* 446 */ "Unknown", /* Not used */
135  /* 447 */ "Unknown", /* Not used */
136  /* 448 */ "Unknown", /* Not used */
137  /* 449 */ "Reply With", /* MS IIS extension */
138  /* 450 */ "Blocked by Windows Parental Controls", /* MS extension */
139  /* 451 */ "Unavailable For Legal Reasons" /* RFC7725 */
140 };
141 
142 static const char *const five_hundred[] = {
143  /* 500 */ "Internal Server Error", /* RFC7231, Section 6.6.1 */
144  /* 501 */ "Not Implemented", /* RFC7231, Section 6.6.2 */
145  /* 502 */ "Bad Gateway", /* RFC7231, Section 6.6.3 */
146  /* 503 */ "Service Unavailable", /* RFC7231, Section 6.6.4 */
147  /* 504 */ "Gateway Timeout", /* RFC7231, Section 6.6.5 */
148  /* 505 */ "HTTP Version Not Supported", /* RFC7231, Section 6.6.6 */
149  /* 506 */ "Variant Also Negotiates", /* RFC2295 */
150  /* 507 */ "Insufficient Storage", /* RFC4918 */
151  /* 508 */ "Loop Detected", /* RFC5842 */
152  /* 509 */ "Bandwidth Limit Exceeded", /* Apache extension */
153  /* 510 */ "Not Extended", /* RFC2774 */
154  /* 511 */ "Network Authentication Required" /* RFC6585 */
155 };
156 
157 
158 struct MHD_Reason_Block
159 {
160  size_t max;
161  const char *const*data;
162 };
163 
164 #define BLOCK(m) { (sizeof(m) / sizeof(char*)), m }
165 
166 static const struct MHD_Reason_Block reasons[] = {
168  BLOCK (one_hundred),
169  BLOCK (two_hundred),
173 };
174 
175 
176 const char *
177 MHD_get_reason_phrase_for (unsigned int code)
178 {
179  if ( (code >= 100) &&
180  (code < 600) &&
181  (reasons[code / 100].max > (code % 100)) )
182  return reasons[code / 100].data[code % 100];
183  return "Unknown";
184 }
const char * MHD_get_reason_phrase_for(enum MHD_HTTP_StatusCode code)
#define NULL
Definition: reason_phrase.c:31
static const struct MHD_Reason_Block reasons[]
static const char *const two_hundred[]
Definition: reason_phrase.c:45
#define BLOCK(m)
static const char *const five_hundred[]
static const char *const invalid_hundred[]
Definition: reason_phrase.c:34
static const char *const three_hundred[]
Definition: reason_phrase.c:75
static const char *const four_hundred[]
Definition: reason_phrase.c:87
static const char *const one_hundred[]
Definition: reason_phrase.c:38
public interface to libmicrohttpd
void * data
Definition: microhttpd.h:3053
platform-specific includes for libmicrohttpd