mirror of
https://github.com/soypat/lneto.git
synced 2026-08-03 06:27:52 +00:00
5c54030f19
* add http/httphi * begin adding httphi tests * claude found neat bugs * add low level Handle function and more tests * more tests, run go generate * add Hijacker-like functionality * improve locking and acquisition of Exchanges in reconfiguring * several bugfixes, add internal.IntLen, round up http-linux example with new router API * small nit * add benchmarks * add query handling * remove ForEach pattern, allocates in TinyGo * massive documentation push and code reordering in files * Router.Handle returns error after being torn down * run go fix * rework Mux interface to receive a string request path * add MethodFrom * minor doc nit * fail on incomplete staging * add raw buffer access * add streaming API distinct from Exchange * begin adding multipart form logic * finish rounding up multipart form parsing * remove status type * first Multipart approach * begin adding readMultiPart * add Exchange.ReadMultiparts reimagining of clanker slop * ai insists with backoffs * simplify clanker slop * apply go fix * add a pattern argument to Mux * explicit header key/value alloc and add ExchangeConfig * fix tests after excplicit header alloc change * fix examples * run go fix * expose rawsock as experimental package (will use for external benchmarks) * remove backoff from form parsing * @MDr164 suggestions get potential fixes * apply go fix * add examples * add README.md * fix rawsock tinygo implementation * apply @MDr164 various fixes * update documentation on ContentLength methods and fix bug in Form reset on empty body * fix tests * add fuzz tests * run go fix * io.ErrNoProgress on parsing form spin * run go fix * remove backoff assumption from Router * httphi.Handle rejects unsupported protocols * go format router.go * add kvbuffer * rewrite Cookie with KVBuffer * mid refactor of KVBuffer into Header * work on KVBuffer exhausted semantics * add Go's ServeMux Request.PathValue access semantics to Exchange, Mux and MuxSlice * add PathValue example * document all the things; improve req Query semantics; add Form.EnableBufferGrowth * unexport kvBuffer * add Exchange.PathValueAppend * use stdlib in example instead of rawsock * remove rawsock from http example * add darwin arch rawsock * fix example * rename Router.TeardownGoroutines to Shutdown matching http.Server.Shutdown * rename types and identifiers * @MDr164 Content-Type and Transfer-Encoding bug catches
274 lines
7.9 KiB
Go
274 lines
7.9 KiB
Go
package httphi
|
|
|
|
// StatusText returns a text for the HTTP status code. It returns the empty
|
|
// string if the code is unknown.
|
|
func StatusText(code int) string {
|
|
switch status(code) {
|
|
case StatusContinue:
|
|
return "Continue"
|
|
case StatusSwitchingProtocols:
|
|
return "Switching Protocols"
|
|
case StatusProcessing:
|
|
return "Processing"
|
|
case StatusEarlyHints:
|
|
return "Early Hints"
|
|
case StatusOK:
|
|
return "OK"
|
|
case StatusCreated:
|
|
return "Created"
|
|
case StatusAccepted:
|
|
return "Accepted"
|
|
case StatusNonAuthoritativeInfo:
|
|
return "Non-Authoritative Information"
|
|
case StatusNoContent:
|
|
return "No Content"
|
|
case StatusResetContent:
|
|
return "Reset Content"
|
|
case StatusPartialContent:
|
|
return "Partial Content"
|
|
case StatusMultiStatus:
|
|
return "Multi-Status"
|
|
case StatusAlreadyReported:
|
|
return "Already Reported"
|
|
case StatusIMUsed:
|
|
return "IM Used"
|
|
case StatusMultipleChoices:
|
|
return "Multiple Choices"
|
|
case StatusMovedPermanently:
|
|
return "Moved Permanently"
|
|
case StatusFound:
|
|
return "Found"
|
|
case StatusSeeOther:
|
|
return "See Other"
|
|
case StatusNotModified:
|
|
return "Not Modified"
|
|
case StatusUseProxy:
|
|
return "Use Proxy"
|
|
case StatusTemporaryRedirect:
|
|
return "Temporary Redirect"
|
|
case StatusPermanentRedirect:
|
|
return "Permanent Redirect"
|
|
case StatusBadRequest:
|
|
return "Bad Request"
|
|
case StatusUnauthorized:
|
|
return "Unauthorized"
|
|
case StatusPaymentRequired:
|
|
return "Payment Required"
|
|
case StatusForbidden:
|
|
return "Forbidden"
|
|
case StatusNotFound:
|
|
return "Not Found"
|
|
case StatusMethodNotAllowed:
|
|
return "Method Not Allowed"
|
|
case StatusNotAcceptable:
|
|
return "Not Acceptable"
|
|
case StatusProxyAuthRequired:
|
|
return "Proxy Authentication Required"
|
|
case StatusRequestTimeout:
|
|
return "Request Timeout"
|
|
case StatusConflict:
|
|
return "Conflict"
|
|
case StatusGone:
|
|
return "Gone"
|
|
case StatusLengthRequired:
|
|
return "Length Required"
|
|
case StatusPreconditionFailed:
|
|
return "Precondition Failed"
|
|
case StatusRequestEntityTooLarge:
|
|
return "Request Entity Too Large"
|
|
case StatusRequestURITooLong:
|
|
return "Request URI Too Long"
|
|
case StatusUnsupportedMediaType:
|
|
return "Unsupported Media Type"
|
|
case StatusRequestedRangeNotSatisfiable:
|
|
return "Requested Range Not Satisfiable"
|
|
case StatusExpectationFailed:
|
|
return "Expectation Failed"
|
|
case StatusTeapot:
|
|
return "I'm a teapot"
|
|
case StatusMisdirectedRequest:
|
|
return "Misdirected Request"
|
|
case StatusUnprocessableEntity:
|
|
return "Unprocessable Entity"
|
|
case StatusLocked:
|
|
return "Locked"
|
|
case StatusFailedDependency:
|
|
return "Failed Dependency"
|
|
case StatusTooEarly:
|
|
return "Too Early"
|
|
case StatusUpgradeRequired:
|
|
return "Upgrade Required"
|
|
case StatusPreconditionRequired:
|
|
return "Precondition Required"
|
|
case StatusTooManyRequests:
|
|
return "Too Many Requests"
|
|
case StatusRequestHeaderFieldsTooLarge:
|
|
return "Request Header Fields Too Large"
|
|
case StatusUnavailableForLegalReasons:
|
|
return "Unavailable For Legal Reasons"
|
|
case StatusInternalServerError:
|
|
return "Internal Server Error"
|
|
case StatusNotImplemented:
|
|
return "Not Implemented"
|
|
case StatusBadGateway:
|
|
return "Bad Gateway"
|
|
case StatusServiceUnavailable:
|
|
return "Service Unavailable"
|
|
case StatusGatewayTimeout:
|
|
return "Gateway Timeout"
|
|
case StatusHTTPVersionNotSupported:
|
|
return "HTTP Version Not Supported"
|
|
case StatusVariantAlsoNegotiates:
|
|
return "Variant Also Negotiates"
|
|
case StatusInsufficientStorage:
|
|
return "Insufficient Storage"
|
|
case StatusLoopDetected:
|
|
return "Loop Detected"
|
|
case StatusNotExtended:
|
|
return "Not Extended"
|
|
case StatusNetworkAuthenticationRequired:
|
|
return "Network Authentication Required"
|
|
default:
|
|
return ""
|
|
}
|
|
}
|
|
|
|
const ()
|
|
|
|
type status int
|
|
|
|
// HTTP status codes as registered with IANA.
|
|
// See: https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml
|
|
const (
|
|
// RFC 9110, 15.2.1
|
|
StatusContinue = 100 // Continue
|
|
// RFC 9110, 15.2.2
|
|
StatusSwitchingProtocols = 101 // Switching Protocols
|
|
// RFC 2518, 10.1
|
|
StatusProcessing = 102 // Processing
|
|
// RFC 8297
|
|
StatusEarlyHints = 103 // Early Hints
|
|
|
|
// RFC 9110, 15.3.1
|
|
StatusOK = 200 // OK
|
|
// RFC 9110, 15.3.2
|
|
StatusCreated = 201 // Created
|
|
// RFC 9110, 15.3.3
|
|
StatusAccepted = 202 // Accepted
|
|
// RFC 9110, 15.3.4
|
|
StatusNonAuthoritativeInfo = 203 // Non-Authoritative Information
|
|
// RFC 9110, 15.3.5
|
|
StatusNoContent = 204 // No Content
|
|
// RFC 9110, 15.3.6
|
|
StatusResetContent = 205 // Reset Content
|
|
// RFC 9110, 15.3.7
|
|
StatusPartialContent = 206 // Partial Content
|
|
// RFC 4918, 11.1
|
|
StatusMultiStatus = 207 // Multi-Status
|
|
// RFC 5842, 7.1
|
|
StatusAlreadyReported = 208 // Already Reported
|
|
// RFC 3229, 10.4.1
|
|
StatusIMUsed = 226 // IM Used
|
|
|
|
// RFC 9110, 15.4.1
|
|
StatusMultipleChoices = 300 // Multiple Choices
|
|
// RFC 9110, 15.4.2
|
|
StatusMovedPermanently = 301 // Moved Permanently
|
|
// RFC 9110, 15.4.3
|
|
StatusFound = 302 // Found
|
|
// RFC 9110, 15.4.4
|
|
StatusSeeOther = 303 // See Other
|
|
// RFC 9110, 15.4.5
|
|
StatusNotModified = 304 // Not Modified
|
|
// RFC 9110, 15.4.6
|
|
StatusUseProxy = 305 // Use Proxy
|
|
// RFC 9110, 15.4.7 (Unused)
|
|
_ = 306
|
|
// RFC 9110, 15.4.8
|
|
StatusTemporaryRedirect = 307 // Temporary Redirect
|
|
// RFC 9110, 15.4.9
|
|
StatusPermanentRedirect = 308 // Permanent Redirect
|
|
|
|
// RFC 9110, 15.5.1
|
|
StatusBadRequest = 400 // Bad Request
|
|
// RFC 9110, 15.5.2
|
|
StatusUnauthorized = 401 // Unauthorized
|
|
// RFC 9110, 15.5.3
|
|
StatusPaymentRequired = 402 // Payment Required
|
|
// RFC 9110, 15.5.4
|
|
StatusForbidden = 403 // Forbidden
|
|
// RFC 9110, 15.5.5
|
|
StatusNotFound = 404 // Not Found
|
|
// RFC 9110, 15.5.6
|
|
StatusMethodNotAllowed = 405 // Method Not Allowed
|
|
// RFC 9110, 15.5.7
|
|
StatusNotAcceptable = 406 // Not Acceptable
|
|
// RFC 9110, 15.5.8
|
|
StatusProxyAuthRequired = 407 // Proxy Authentication Required
|
|
// RFC 9110, 15.5.9
|
|
StatusRequestTimeout = 408 // Request Timeout
|
|
// RFC 9110, 15.5.10
|
|
StatusConflict = 409 // Conflict
|
|
// RFC 9110, 15.5.11
|
|
StatusGone = 410 // Gone
|
|
// RFC 9110, 15.5.12
|
|
StatusLengthRequired = 411 // Length Required
|
|
// RFC 9110, 15.5.13
|
|
StatusPreconditionFailed = 412 // Precondition Failed
|
|
// RFC 9110, 15.5.14
|
|
StatusRequestEntityTooLarge = 413 // Request Entity Too Large
|
|
// RFC 9110, 15.5.15
|
|
StatusRequestURITooLong = 414 // Request URI Too Long
|
|
// RFC 9110, 15.5.16
|
|
StatusUnsupportedMediaType = 415 // Unsupported Media Type
|
|
// RFC 9110, 15.5.17
|
|
StatusRequestedRangeNotSatisfiable = 416 // Requested Range Not Satisfiable
|
|
// RFC 9110, 15.5.18
|
|
StatusExpectationFailed = 417 // Expectation Failed
|
|
// RFC 9110, 15.5.19 (Unused)
|
|
StatusTeapot = 418 // I'm a teapot
|
|
// RFC 9110, 15.5.20
|
|
StatusMisdirectedRequest = 421 // Misdirected Request
|
|
// RFC 9110, 15.5.21
|
|
StatusUnprocessableEntity = 422 // Unprocessable Entity
|
|
// RFC 4918, 11.3
|
|
StatusLocked = 423 // Locked
|
|
// RFC 4918, 11.4
|
|
StatusFailedDependency = 424 // Failed Dependency
|
|
// RFC 8470, 5.2.
|
|
StatusTooEarly = 425 // Too Early
|
|
// RFC 9110, 15.5.22
|
|
StatusUpgradeRequired = 426 // Upgrade Required
|
|
// RFC 6585, 3
|
|
StatusPreconditionRequired = 428 // Precondition Required
|
|
// RFC 6585, 4
|
|
StatusTooManyRequests = 429 // Too Many Requests
|
|
// RFC 6585, 5
|
|
StatusRequestHeaderFieldsTooLarge = 431 // Request Header Fields Too Large
|
|
// RFC 7725, 3
|
|
StatusUnavailableForLegalReasons = 451 // Unavailable For Legal Reasons
|
|
|
|
// RFC 9110, 15.6.1
|
|
StatusInternalServerError = 500 // Internal Server Error
|
|
// RFC 9110, 15.6.2
|
|
StatusNotImplemented = 501 // Not Implemented
|
|
// RFC 9110, 15.6.3
|
|
StatusBadGateway = 502 // Bad Gateway
|
|
// RFC 9110, 15.6.4
|
|
StatusServiceUnavailable = 503 // Service Unavailable
|
|
// RFC 9110, 15.6.5
|
|
StatusGatewayTimeout = 504 // Gateway Timeout
|
|
// RFC 9110, 15.6.6
|
|
StatusHTTPVersionNotSupported = 505 // HTTP Version Not Supported
|
|
// RFC 2295, 8.1
|
|
StatusVariantAlsoNegotiates = 506 // Variant Also Negotiates
|
|
// RFC 4918, 11.5
|
|
StatusInsufficientStorage = 507 // Insufficient Storage
|
|
// RFC 5842, 7.2
|
|
StatusLoopDetected = 508 // Loop Detected
|
|
// RFC 2774, 7
|
|
StatusNotExtended = 510 // Not Extended
|
|
// RFC 6585, 6
|
|
StatusNetworkAuthenticationRequired = 511 // Network Authentication Required
|
|
)
|