mirror of
				https://github.com/jart/cosmopolitan.git
				synced 2025-10-25 18:50:57 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			113 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*-*- 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"
 | |
| 
 | |
| static const struct thatispacked HttpReason {
 | |
|   short code;
 | |
|   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.
 | |
|  *
 | |
|  * @see https://tools.ietf.org/html/rfc2616
 | |
|  * @see https://tools.ietf.org/html/rfc6585
 | |
|  */
 | |
| 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 "";
 | |
| }
 |