aboutsummaryrefslogtreecommitdiff
path: root/status.go
diff options
context:
space:
mode:
authorGravatar Aliaksandr Valialkin <valyala@gmail.com> 2015-10-21 16:02:53 +0300
committerGravatar Aliaksandr Valialkin <valyala@gmail.com> 2015-10-21 16:02:53 +0300
commit37cb5a0c673b05f5f5b1d3b845ba18e1220dcabd (patch)
tree04695569a5491e90004046376013bd236b7c9eab /status.go
parentAdded common request headers such as User-Agent and Referer to requests in be... (diff)
downloadfasthttp-37cb5a0c673b05f5f5b1d3b845ba18e1220dcabd.tar.gz
fasthttp-37cb5a0c673b05f5f5b1d3b845ba18e1220dcabd.tar.bz2
fasthttp-37cb5a0c673b05f5f5b1d3b845ba18e1220dcabd.zip
Added status codes from net/http
Diffstat (limited to 'status.go')
-rw-r--r--status.go140
1 files changed, 140 insertions, 0 deletions
diff --git a/status.go b/status.go
new file mode 100644
index 0000000..53a723a
--- /dev/null
+++ b/status.go
@@ -0,0 +1,140 @@
+package fasthttp
+
+import (
+ "fmt"
+ "sync/atomic"
+)
+
+// 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
+
+ StatusInternalServerError = 500
+ StatusNotImplemented = 501
+ StatusBadGateway = 502
+ StatusServiceUnavailable = 503
+ StatusGatewayTimeout = 504
+ StatusHTTPVersionNotSupported = 505
+)
+
+var (
+ statusLines atomic.Value
+
+ statusCodes = 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",
+
+ StatusInternalServerError: "Internal Server Error",
+ StatusNotImplemented: "Not Implemented",
+ StatusBadGateway: "Bad Gateway",
+ StatusServiceUnavailable: "Service Unavailable",
+ StatusGatewayTimeout: "Gateway Timeout",
+ StatusHTTPVersionNotSupported: "HTTP Version Not Supported",
+ }
+)
+
+type StatusCode int
+
+func (n StatusCode) String() string {
+ s := statusCodes[int(n)]
+ 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 := StatusCode(statusCode).String()
+
+ 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
+}