/*
     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;
}
