148 lines
4.9 KiB
Go
148 lines
4.9 KiB
Go
|
package fasthttp
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"sync/atomic"
|
||
|
)
|
||
|
|
||
|
// HTTP status codes were stolen from net/http.
|
||
|
const (
|
||
|
StatusContinue = 100
|
||
|
StatusSwitchingProtocols = 101
|
||
|
|
||
|
StatusOK = 200
|
||
|
StatusCreated = 201
|
||
|
StatusAccepted = 202
|
||
|
StatusNonAuthoritativeInfo = 203
|
||
|
StatusNoContent = 204
|
||
|
StatusResetContent = 205
|
||
|
StatusPartialContent = 206
|
||
|
|
||
|
StatusMultipleChoices = 300
|
||
|
StatusMovedPermanently = 301
|
||
|
StatusFound = 302
|
||
|
StatusSeeOther = 303
|
||
|
StatusNotModified = 304
|
||
|
StatusUseProxy = 305
|
||
|
StatusTemporaryRedirect = 307
|
||
|
|
||
|
StatusBadRequest = 400
|
||
|
StatusUnauthorized = 401
|
||
|
StatusPaymentRequired = 402
|
||
|
StatusForbidden = 403
|
||
|
StatusNotFound = 404
|
||
|
StatusMethodNotAllowed = 405
|
||
|
StatusNotAcceptable = 406
|
||
|
StatusProxyAuthRequired = 407
|
||
|
StatusRequestTimeout = 408
|
||
|
StatusConflict = 409
|
||
|
StatusGone = 410
|
||
|
StatusLengthRequired = 411
|
||
|
StatusPreconditionFailed = 412
|
||
|
StatusRequestEntityTooLarge = 413
|
||
|
StatusRequestURITooLong = 414
|
||
|
StatusUnsupportedMediaType = 415
|
||
|
StatusRequestedRangeNotSatisfiable = 416
|
||
|
StatusExpectationFailed = 417
|
||
|
StatusTeapot = 418
|
||
|
StatusPreconditionRequired = 428
|
||
|
StatusTooManyRequests = 429
|
||
|
StatusRequestHeaderFieldsTooLarge = 431
|
||
|
|
||
|
StatusInternalServerError = 500
|
||
|
StatusNotImplemented = 501
|
||
|
StatusBadGateway = 502
|
||
|
StatusServiceUnavailable = 503
|
||
|
StatusGatewayTimeout = 504
|
||
|
StatusHTTPVersionNotSupported = 505
|
||
|
StatusNetworkAuthenticationRequired = 511
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
statusLines atomic.Value
|
||
|
|
||
|
statusMessages = map[int]string{
|
||
|
StatusContinue: "Continue",
|
||
|
StatusSwitchingProtocols: "SwitchingProtocols",
|
||
|
|
||
|
StatusOK: "OK",
|
||
|
StatusCreated: "Created",
|
||
|
StatusAccepted: "Accepted",
|
||
|
StatusNonAuthoritativeInfo: "Non-Authoritative Info",
|
||
|
StatusNoContent: "No Content",
|
||
|
StatusResetContent: "Reset Content",
|
||
|
StatusPartialContent: "Partial Content",
|
||
|
|
||
|
StatusMultipleChoices: "Multiple Choices",
|
||
|
StatusMovedPermanently: "Moved Permanently",
|
||
|
StatusFound: "Found",
|
||
|
StatusSeeOther: "See Other",
|
||
|
StatusNotModified: "Not Modified",
|
||
|
StatusUseProxy: "Use Proxy",
|
||
|
StatusTemporaryRedirect: "Temporary Redirect",
|
||
|
|
||
|
StatusBadRequest: "Bad Request",
|
||
|
StatusUnauthorized: "Unauthorized",
|
||
|
StatusPaymentRequired: "Payment Required",
|
||
|
StatusForbidden: "Forbidden",
|
||
|
StatusNotFound: "Not Found",
|
||
|
StatusMethodNotAllowed: "Method Not Allowed",
|
||
|
StatusNotAcceptable: "Not Acceptable",
|
||
|
StatusProxyAuthRequired: "Proxy Auth Required",
|
||
|
StatusRequestTimeout: "Request Timeout",
|
||
|
StatusConflict: "Conflict",
|
||
|
StatusGone: "Gone",
|
||
|
StatusLengthRequired: "Length Required",
|
||
|
StatusPreconditionFailed: "Precondition Failed",
|
||
|
StatusRequestEntityTooLarge: "Request Entity Too Large",
|
||
|
StatusRequestURITooLong: "Request URI Too Long",
|
||
|
StatusUnsupportedMediaType: "Unsupported Media Type",
|
||
|
StatusRequestedRangeNotSatisfiable: "Requested Range Not Satisfiable",
|
||
|
StatusExpectationFailed: "Expectation Failed",
|
||
|
StatusTeapot: "Teapot",
|
||
|
StatusPreconditionRequired: "Precondition Required",
|
||
|
StatusTooManyRequests: "Too Many Requests",
|
||
|
StatusRequestHeaderFieldsTooLarge: "Request HeaderFields Too Large",
|
||
|
|
||
|
StatusInternalServerError: "Internal Server Error",
|
||
|
StatusNotImplemented: "Not Implemented",
|
||
|
StatusBadGateway: "Bad Gateway",
|
||
|
StatusServiceUnavailable: "Service Unavailable",
|
||
|
StatusGatewayTimeout: "Gateway Timeout",
|
||
|
StatusHTTPVersionNotSupported: "HTTP Version Not Supported",
|
||
|
StatusNetworkAuthenticationRequired: "Network Authentication Required",
|
||
|
}
|
||
|
)
|
||
|
|
||
|
// StatusMessage returns HTTP status message for the given status code.
|
||
|
func StatusMessage(statusCode int) string {
|
||
|
s := statusMessages[statusCode]
|
||
|
if s == "" {
|
||
|
s = "Unknown Status Code"
|
||
|
}
|
||
|
return s
|
||
|
}
|
||
|
|
||
|
func init() {
|
||
|
statusLines.Store(make(map[int][]byte))
|
||
|
}
|
||
|
|
||
|
func statusLine(statusCode int) []byte {
|
||
|
m := statusLines.Load().(map[int][]byte)
|
||
|
h := m[statusCode]
|
||
|
if h != nil {
|
||
|
return h
|
||
|
}
|
||
|
|
||
|
statusText := StatusMessage(statusCode)
|
||
|
|
||
|
h = []byte(fmt.Sprintf("HTTP/1.1 %d %s\r\n", statusCode, statusText))
|
||
|
newM := make(map[int][]byte, len(m)+1)
|
||
|
for k, v := range m {
|
||
|
newM[k] = v
|
||
|
}
|
||
|
newM[statusCode] = h
|
||
|
statusLines.Store(newM)
|
||
|
return h
|
||
|
}
|