| /* |
| This file is part of libmicrohttpd |
| Copyright (C) 2007, 2011, 2017, 2019 Christian Grothoff, Karlson2k (Evgeny Grin) |
| |
| This library is free software; you can redistribute it and/or |
| modify it under the terms of the GNU Lesser General Public |
| License as published by the Free Software Foundation; either |
| version 2.1 of the License, or (at your option) any later version. |
| |
| This library is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| Lesser General Public License for more details. |
| |
| You should have received a copy of the GNU Lesser General Public |
| License along with this library; if not, write to the Free Software |
| Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| |
| */ |
| /** |
| * @file reason_phrase.c |
| * @brief Tables of the string response phrases |
| * @author Elliot Glaysher |
| * @author Christian Grothoff (minor code clean up) |
| * @author Karlson2k (Evgeny Grin) |
| */ |
| #include "platform.h" |
| #include "microhttpd.h" |
| #include "mhd_str.h" |
| |
| #ifndef NULL |
| #define NULL ((void*) 0) |
| #endif |
| |
| static const struct _MHD_cstr_w_len invalid_hundred[] = { |
| { NULL, 0 } |
| }; |
| |
| static const struct _MHD_cstr_w_len one_hundred[] = { |
| /* 100 */ _MHD_S_STR_W_LEN ("Continue"), /* RFC-ietf-httpbis-semantics, Section 15.2.1 */ |
| /* 101 */ _MHD_S_STR_W_LEN ("Switching Protocols"), /* RFC-ietf-httpbis-semantics, Section 15.2.2 */ |
| /* 102 */ _MHD_S_STR_W_LEN ("Processing"), /* RFC2518 */ |
| /* 103 */ _MHD_S_STR_W_LEN ("Early Hints") /* RFC8297 */ |
| }; |
| |
| static const struct _MHD_cstr_w_len two_hundred[] = { |
| /* 200 */ _MHD_S_STR_W_LEN ("OK"), /* RFC-ietf-httpbis-semantics, Section 15.3.1 */ |
| /* 201 */ _MHD_S_STR_W_LEN ("Created"), /* RFC-ietf-httpbis-semantics, Section 15.3.2 */ |
| /* 202 */ _MHD_S_STR_W_LEN ("Accepted"), /* RFC-ietf-httpbis-semantics, Section 15.3.3 */ |
| /* 203 */ _MHD_S_STR_W_LEN ("Non-Authoritative Information"), /* RFC-ietf-httpbis-semantics, Section 15.3.4 */ |
| /* 204 */ _MHD_S_STR_W_LEN ("No Content"), /* RFC-ietf-httpbis-semantics, Section 15.3.5 */ |
| /* 205 */ _MHD_S_STR_W_LEN ("Reset Content"), /* RFC-ietf-httpbis-semantics, Section 15.3.6 */ |
| /* 206 */ _MHD_S_STR_W_LEN ("Partial Content"), /* RFC-ietf-httpbis-semantics, Section 15.3.7 */ |
| /* 207 */ _MHD_S_STR_W_LEN ("Multi-Status"), /* RFC4918 */ |
| /* 208 */ _MHD_S_STR_W_LEN ("Already Reported"), /* RFC5842 */ |
| /* 209 */ {"Unknown", 0}, /* Not used */ |
| /* 210 */ {"Unknown", 0}, /* Not used */ |
| /* 211 */ {"Unknown", 0}, /* Not used */ |
| /* 212 */ {"Unknown", 0}, /* Not used */ |
| /* 213 */ {"Unknown", 0}, /* Not used */ |
| /* 214 */ {"Unknown", 0}, /* Not used */ |
| /* 215 */ {"Unknown", 0}, /* Not used */ |
| /* 216 */ {"Unknown", 0}, /* Not used */ |
| /* 217 */ {"Unknown", 0}, /* Not used */ |
| /* 218 */ {"Unknown", 0}, /* Not used */ |
| /* 219 */ {"Unknown", 0}, /* Not used */ |
| /* 220 */ {"Unknown", 0}, /* Not used */ |
| /* 221 */ {"Unknown", 0}, /* Not used */ |
| /* 222 */ {"Unknown", 0}, /* Not used */ |
| /* 223 */ {"Unknown", 0}, /* Not used */ |
| /* 224 */ {"Unknown", 0}, /* Not used */ |
| /* 225 */ {"Unknown", 0}, /* Not used */ |
| /* 226 */ _MHD_S_STR_W_LEN ("IM Used") /* RFC3229 */ |
| }; |
| |
| static const struct _MHD_cstr_w_len three_hundred[] = { |
| /* 300 */ _MHD_S_STR_W_LEN ("Multiple Choices"), /* RFC-ietf-httpbis-semantics, Section 15.4.1 */ |
| /* 301 */ _MHD_S_STR_W_LEN ("Moved Permanently"), /* RFC-ietf-httpbis-semantics, Section 15.4.2 */ |
| /* 302 */ _MHD_S_STR_W_LEN ("Found"), /* RFC-ietf-httpbis-semantics, Section 15.4.3 */ |
| /* 303 */ _MHD_S_STR_W_LEN ("See Other"), /* RFC-ietf-httpbis-semantics, Section 15.4.4 */ |
| /* 304 */ _MHD_S_STR_W_LEN ("Not Modified"), /* RFC-ietf-httpbis-semantics, Section 15.4.5 */ |
| /* 305 */ _MHD_S_STR_W_LEN ("Use Proxy"), /* RFC-ietf-httpbis-semantics, Section 15.4.6 */ |
| /* 306 */ _MHD_S_STR_W_LEN ("Switch Proxy"), /* Not used! RFC-ietf-httpbis-semantics, Section 15.4.7 */ |
| /* 307 */ _MHD_S_STR_W_LEN ("Temporary Redirect"), /* RFC-ietf-httpbis-semantics, Section 15.4.8 */ |
| /* 308 */ _MHD_S_STR_W_LEN ("Permanent Redirect") /* RFC-ietf-httpbis-semantics, Section 15.4.9 */ |
| }; |
| |
| static const struct _MHD_cstr_w_len four_hundred[] = { |
| /* 400 */ _MHD_S_STR_W_LEN ("Bad Request"), /* RFC-ietf-httpbis-semantics, Section 15.5.1 */ |
| /* 401 */ _MHD_S_STR_W_LEN ("Unauthorized"), /* RFC-ietf-httpbis-semantics, Section 15.5.2 */ |
| /* 402 */ _MHD_S_STR_W_LEN ("Payment Required"), /* RFC-ietf-httpbis-semantics, Section 15.5.3 */ |
| /* 403 */ _MHD_S_STR_W_LEN ("Forbidden"), /* RFC-ietf-httpbis-semantics, Section 15.5.4 */ |
| /* 404 */ _MHD_S_STR_W_LEN ("Not Found"), /* RFC-ietf-httpbis-semantics, Section 15.5.5 */ |
| /* 405 */ _MHD_S_STR_W_LEN ("Method Not Allowed"), /* RFC-ietf-httpbis-semantics, Section 15.5.6 */ |
| /* 406 */ _MHD_S_STR_W_LEN ("Not Acceptable"), /* RFC-ietf-httpbis-semantics, Section 15.5.7 */ |
| /* 407 */ _MHD_S_STR_W_LEN ("Proxy Authentication Required"), /* RFC-ietf-httpbis-semantics, Section 15.5.8 */ |
| /* 408 */ _MHD_S_STR_W_LEN ("Request Timeout"), /* RFC-ietf-httpbis-semantics, Section 15.5.9 */ |
| /* 409 */ _MHD_S_STR_W_LEN ("Conflict"), /* RFC-ietf-httpbis-semantics, Section 15.5.10 */ |
| /* 410 */ _MHD_S_STR_W_LEN ("Gone"), /* RFC-ietf-httpbis-semantics, Section 15.5.11 */ |
| /* 411 */ _MHD_S_STR_W_LEN ("Length Required"), /* RFC-ietf-httpbis-semantics, Section 15.5.12 */ |
| /* 412 */ _MHD_S_STR_W_LEN ("Precondition Failed"), /* RFC-ietf-httpbis-semantics, Section 15.5.13 */ |
| /* 413 */ _MHD_S_STR_W_LEN ("Content Too Large"), /* RFC-ietf-httpbis-semantics, Section 15.5.14 */ |
| /* 414 */ _MHD_S_STR_W_LEN ("URI Too Long"), /* RFC-ietf-httpbis-semantics, Section 15.5.15 */ |
| /* 415 */ _MHD_S_STR_W_LEN ("Unsupported Media Type"), /* RFC-ietf-httpbis-semantics, Section 15.5.16 */ |
| /* 416 */ _MHD_S_STR_W_LEN ("Range Not Satisfiable"), /* RFC-ietf-httpbis-semantics, Section 15.5.17 */ |
| /* 417 */ _MHD_S_STR_W_LEN ("Expectation Failed"), /* RFC-ietf-httpbis-semantics, Section 15.5.18 */ |
| /* 418 */ {"Unknown", 0}, /* Not used */ |
| /* 419 */ {"Unknown", 0}, /* Not used */ |
| /* 420 */ {"Unknown", 0}, /* Not used */ |
| /* 421 */ _MHD_S_STR_W_LEN ("Misdirected Request"), /* RFC-ietf-httpbis-semantics, Section 15.5.20 */ |
| /* 422 */ _MHD_S_STR_W_LEN ("Unprocessable Content"), /* RFC-ietf-httpbis-semantics, Section 15.5.21 */ |
| /* 423 */ _MHD_S_STR_W_LEN ("Locked"), /* RFC4918 */ |
| /* 424 */ _MHD_S_STR_W_LEN ("Failed Dependency"), /* RFC4918 */ |
| /* 425 */ _MHD_S_STR_W_LEN ("Too Early"), /* RFC8470 */ |
| /* 426 */ _MHD_S_STR_W_LEN ("Upgrade Required"), /* RFC-ietf-httpbis-semantics, Section 15.5.22 */ |
| /* 427 */ {"Unknown", 0}, /* Not used */ |
| /* 428 */ _MHD_S_STR_W_LEN ("Precondition Required"), /* RFC6585 */ |
| /* 429 */ _MHD_S_STR_W_LEN ("Too Many Requests"), /* RFC6585 */ |
| /* 430 */ {"Unknown", 0}, /* Not used */ |
| /* 431 */ _MHD_S_STR_W_LEN ("Request Header Fields Too Large"), /* RFC6585 */ |
| /* 432 */ {"Unknown", 0}, /* Not used */ |
| /* 433 */ {"Unknown", 0}, /* Not used */ |
| /* 434 */ {"Unknown", 0}, /* Not used */ |
| /* 435 */ {"Unknown", 0}, /* Not used */ |
| /* 436 */ {"Unknown", 0}, /* Not used */ |
| /* 437 */ {"Unknown", 0}, /* Not used */ |
| /* 438 */ {"Unknown", 0}, /* Not used */ |
| /* 439 */ {"Unknown", 0}, /* Not used */ |
| /* 440 */ {"Unknown", 0}, /* Not used */ |
| /* 441 */ {"Unknown", 0}, /* Not used */ |
| /* 442 */ {"Unknown", 0}, /* Not used */ |
| /* 443 */ {"Unknown", 0}, /* Not used */ |
| /* 444 */ {"Unknown", 0}, /* Not used */ |
| /* 445 */ {"Unknown", 0}, /* Not used */ |
| /* 446 */ {"Unknown", 0}, /* Not used */ |
| /* 447 */ {"Unknown", 0}, /* Not used */ |
| /* 448 */ {"Unknown", 0}, /* Not used */ |
| /* 449 */ _MHD_S_STR_W_LEN ("Reply With"), /* MS IIS extension */ |
| /* 450 */ _MHD_S_STR_W_LEN ("Blocked by Windows Parental Controls"), /* MS extension */ |
| /* 451 */ _MHD_S_STR_W_LEN ("Unavailable For Legal Reasons") /* RFC7725 */ |
| }; |
| |
| static const struct _MHD_cstr_w_len five_hundred[] = { |
| /* 500 */ _MHD_S_STR_W_LEN ("Internal Server Error"), /* RFC-ietf-httpbis-semantics, Section 15.6.1 */ |
| /* 501 */ _MHD_S_STR_W_LEN ("Not Implemented"), /* RFC-ietf-httpbis-semantics, Section 15.6.2 */ |
| /* 502 */ _MHD_S_STR_W_LEN ("Bad Gateway"), /* RFC-ietf-httpbis-semantics, Section 15.6.3 */ |
| /* 503 */ _MHD_S_STR_W_LEN ("Service Unavailable"), /* RFC-ietf-httpbis-semantics, Section 15.6.4 */ |
| /* 504 */ _MHD_S_STR_W_LEN ("Gateway Timeout"), /* RFC-ietf-httpbis-semantics, Section 15.6.5 */ |
| /* 505 */ _MHD_S_STR_W_LEN ("HTTP Version Not Supported"), /* RFC-ietf-httpbis-semantics, Section 15.6.6 */ |
| /* 506 */ _MHD_S_STR_W_LEN ("Variant Also Negotiates"), /* RFC2295 */ |
| /* 507 */ _MHD_S_STR_W_LEN ("Insufficient Storage"), /* RFC4918 */ |
| /* 508 */ _MHD_S_STR_W_LEN ("Loop Detected"), /* RFC5842 */ |
| /* 509 */ _MHD_S_STR_W_LEN ("Bandwidth Limit Exceeded"), /* Apache extension */ |
| /* 510 */ _MHD_S_STR_W_LEN ("Not Extended"), /* RFC2774 */ |
| /* 511 */ _MHD_S_STR_W_LEN ("Network Authentication Required") /* RFC6585 */ |
| }; |
| |
| |
| struct MHD_Reason_Block |
| { |
| size_t max; |
| const struct _MHD_cstr_w_len *const data; |
| }; |
| |
| #define BLOCK(m) { (sizeof(m) / sizeof(m[0])), m } |
| |
| static const struct MHD_Reason_Block reasons[] = { |
| BLOCK (invalid_hundred), |
| BLOCK (one_hundred), |
| BLOCK (two_hundred), |
| BLOCK (three_hundred), |
| BLOCK (four_hundred), |
| BLOCK (five_hundred), |
| }; |
| |
| |
| _MHD_EXTERN const char * |
| MHD_get_reason_phrase_for (unsigned int code) |
| { |
| if ( (code >= 100) && |
| (code < 600) && |
| (reasons[code / 100].max > (code % 100)) ) |
| return reasons[code / 100].data[code % 100].str; |
| return "Unknown"; |
| } |
| |
| |
| _MHD_EXTERN size_t |
| MHD_get_reason_phrase_len_for (unsigned int code) |
| { |
| if ( (code >= 100) && |
| (code < 600) && |
| (reasons[code / 100].max > (code % 100)) ) |
| return reasons[code / 100].data[code % 100].len; |
| return 0; |
| } |