2021-03-25 09:21:13 +00:00
|
|
|
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
|
|
|
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
|
|
|
╞══════════════════════════════════════════════════════════════════════════════╡
|
|
|
|
│ Copyright 2021 Justine Alexandra Roberts Tunney │
|
|
|
|
│ │
|
|
|
|
│ Permission to use, copy, modify, and/or distribute this software for │
|
|
|
|
│ any purpose with or without fee is hereby granted, provided that the │
|
|
|
|
│ above copyright notice and this permission notice appear in all copies. │
|
|
|
|
│ │
|
|
|
|
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
|
|
|
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
|
|
|
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
|
|
|
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
|
|
|
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
|
|
|
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
|
|
|
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
|
|
|
│ PERFORMANCE OF THIS SOFTWARE. │
|
|
|
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
|
|
|
#include "libc/fmt/itoa.h"
|
|
|
|
#include "libc/macros.internal.h"
|
|
|
|
#include "net/http/http.h"
|
|
|
|
|
2021-05-03 08:21:50 +00:00
|
|
|
static const struct thatispacked HttpReason {
|
|
|
|
short code;
|
2021-03-25 09:21:13 +00:00
|
|
|
const char *name;
|
|
|
|
} kHttpReason[] = {
|
|
|
|
{100, "Continue"},
|
|
|
|
{101, "Switching Protocols"},
|
|
|
|
{102, "Processing"},
|
|
|
|
{200, "OK"},
|
|
|
|
{201, "Created"},
|
|
|
|
{202, "Accepted"},
|
|
|
|
{203, "Non-authoritative Information"},
|
|
|
|
{204, "No Content"},
|
|
|
|
{205, "Reset Content"},
|
|
|
|
{206, "Partial Content"},
|
|
|
|
{207, "Multi-Status"},
|
|
|
|
{208, "Already Reported"},
|
|
|
|
{226, "IM Used"},
|
|
|
|
{300, "Multiple Choices"},
|
|
|
|
{301, "Moved Permanently"},
|
|
|
|
{302, "Found"},
|
|
|
|
{303, "See Other"},
|
|
|
|
{304, "Not Modified"},
|
|
|
|
{305, "Use Proxy"},
|
|
|
|
{307, "Temporary Redirect"},
|
|
|
|
{308, "Permanent Redirect"},
|
|
|
|
{400, "Bad Request"},
|
|
|
|
{401, "Unauthorized"},
|
|
|
|
{402, "Payment Required"},
|
|
|
|
{403, "Forbidden"},
|
|
|
|
{404, "Not Found"},
|
|
|
|
{405, "Method Not Allowed"},
|
|
|
|
{406, "Not Acceptable"},
|
|
|
|
{407, "Proxy Authentication Required"},
|
|
|
|
{408, "Request Timeout"},
|
|
|
|
{409, "Conflict"},
|
|
|
|
{410, "Gone"},
|
|
|
|
{411, "Length Required"},
|
|
|
|
{412, "Precondition Failed"},
|
|
|
|
{413, "Payload Too Large"},
|
|
|
|
{414, "Request-URI Too Long"},
|
|
|
|
{415, "Unsupported Media Type"},
|
|
|
|
{416, "Requested Range Not Satisfiable"},
|
|
|
|
{417, "Expectation Failed"},
|
|
|
|
{418, "I'm a teapot"},
|
|
|
|
{421, "Misdirected Request"},
|
|
|
|
{422, "Unprocessable Entity"},
|
|
|
|
{423, "Locked"},
|
|
|
|
{424, "Failed Dependency"},
|
|
|
|
{426, "Upgrade Required"},
|
|
|
|
{428, "Precondition Required"},
|
|
|
|
{429, "Too Many Requests"},
|
|
|
|
{431, "Request Header Fields Too Large"},
|
|
|
|
{444, "Connection Closed Without Response"},
|
|
|
|
{451, "Unavailable For Legal Reasons"},
|
|
|
|
{499, "Client Closed Request"},
|
|
|
|
{500, "Internal Server Error"},
|
|
|
|
{501, "Not Implemented"},
|
|
|
|
{502, "Bad Gateway"},
|
|
|
|
{503, "Service Unavailable"},
|
|
|
|
{504, "Gateway Timeout"},
|
|
|
|
{505, "HTTP Version Not Supported"},
|
|
|
|
{506, "Variant Also Negotiates"},
|
|
|
|
{507, "Insufficient Storage"},
|
|
|
|
{508, "Loop Detected"},
|
|
|
|
{510, "Not Extended"},
|
|
|
|
{511, "Network Authentication Required"},
|
|
|
|
{599, "Network Connect Timeout Error"},
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns string describing HTTP reason phrase.
|
2021-03-27 05:31:41 +00:00
|
|
|
*
|
|
|
|
* @see https://tools.ietf.org/html/rfc2616
|
|
|
|
* @see https://tools.ietf.org/html/rfc6585
|
2021-03-25 09:21:13 +00:00
|
|
|
*/
|
|
|
|
const char *GetHttpReason(int code) {
|
|
|
|
int m, l, r;
|
|
|
|
l = 0;
|
|
|
|
r = ARRAYLEN(kHttpReason) - 1;
|
|
|
|
while (l <= r) {
|
|
|
|
m = (l + r) >> 1;
|
|
|
|
if (kHttpReason[m].code < code) {
|
|
|
|
l = m + 1;
|
|
|
|
} else if (kHttpReason[m].code > code) {
|
|
|
|
r = m - 1;
|
|
|
|
} else {
|
|
|
|
return kHttpReason[m].name;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return "";
|
|
|
|
}
|