From e65d0999a0437855ea48c4a85717644bfc41432f Mon Sep 17 00:00:00 2001 From: Fenny Date: Sun, 12 Jan 2020 21:26:44 +0100 Subject: [PATCH] 0.5.5: SendStatus, SendString, SendBytes, update doc --- context.go | 19 ++++++- docs/context.md | 46 ++++++++++++++- docs/functions.txt | 2 + router.go | 2 +- status.go | 135 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 200 insertions(+), 4 deletions(-) create mode 100644 status.go diff --git a/context.go b/context.go index 3bf8f3f0..844d2d43 100644 --- a/context.go +++ b/context.go @@ -434,6 +434,11 @@ func (ctx *Ctx) Send(args ...interface{}) { } } +// SendBytes : Same as Send() but without type assertion +func (ctx *Ctx) SendBytes(body []byte) { + ctx.Fasthttp.Response.SetBodyString(b2s(body)) +} + // SendFile : func (ctx *Ctx) SendFile(file string) { // https://github.com/valyala/fasthttp/blob/master/fs.go#L81 @@ -443,8 +448,20 @@ func (ctx *Ctx) SendFile(file string) { } // SendStatus : -func (ctx *Ctx) SendStatus() { +func (ctx *Ctx) SendStatus(status int) { + ctx.Status(status) + // Only set status body when there is no response body + if len(ctx.Fasthttp.Response.Body()) == 0 { + msg := statusMessages[status] + if msg != "" { + ctx.Fasthttp.Response.SetBodyString(msg) + } + } +} +// SendString : Same as Send() but without type assertion +func (ctx *Ctx) SendString(body string) { + ctx.Fasthttp.Response.SetBodyString(body) } // Set : diff --git a/docs/context.md b/docs/context.md index c9db6ff0..fc441b9f 100644 --- a/docs/context.md +++ b/docs/context.md @@ -67,7 +67,7 @@ app.Get("/", func(c *fiber.Ctx) { user, pass, ok := c.BasicAuth() - if !ok || user != "john" || pass != "doe" { + if !ok || user != "john" && pass != "doe" { c.Status(403).Send("Forbidden") return } @@ -606,6 +606,19 @@ app.Get("/", func(c *fiber.Ctx) { }) ``` +#### SendBytes +Same as Send() but without type assertion. +I suggest using this in production for optimal performance. +```go +// Function signature +c.SendBytes(body []byte) + +// Example +app.Get("/", func(c *fiber.Ctx) { + c.SendBytes([]byte("Hello, World!")) +}) +``` + #### SendFile Transfers the file at the given path. Sets the Content-Type response HTTP header field based on the filename’s extension. ```go @@ -619,7 +632,36 @@ app.Get("/not-found", func(c *fiber.Ctx) { ``` #### SendStatus -!> Planned for V1 +Sets the status code, but also the correct status message in the body if the response body is still empty. +```go +// Function signature +c.SendStatus(status int) + +// Example +app.Get("/not-found", func(c *fiber.Ctx) { + c.SendStatus(415) + // Status: 415 + // Body: "Unsupported Media Type" + + c.Send("Hello, World!") + c.SendStatus(415) + // Status: 415 + // Body: "Hello, World!" +}) +``` + +#### SendString +Same as Send() but without type assertion. +I suggest using this in production for optimal performance. +```go +// Function signature +c.SendString(body string) + +// Example +app.Get("/", func(c *fiber.Ctx) { + c.SendString("Hello, World!") +}) +``` #### Set Sets the response’s HTTP header field to value. To set multiple fields at once, pass an object as the parameter. diff --git a/docs/functions.txt b/docs/functions.txt index 499dfc1d..6ad5f233 100644 --- a/docs/functions.txt +++ b/docs/functions.txt @@ -42,8 +42,10 @@ Route SaveFile Secure Send +SendBytes SendFile SendStatus +SendString Set Write SignedCookies diff --git a/router.go b/router.go index 4c05b595..a5496967 100644 --- a/router.go +++ b/router.go @@ -18,7 +18,7 @@ import ( const ( // Version for debugging - Version = `0.5.0` + Version = `0.5.5` // Port and Version are printed with the banner banner = `%s _____ _ _ | __|_| |_ ___ ___ diff --git a/status.go b/status.go new file mode 100644 index 00000000..c3de5b07 --- /dev/null +++ b/status.go @@ -0,0 +1,135 @@ +package fiber + +// https://github.com/valyala/fasthttp/blob/master/status.go +const ( + StatusContinue = 100 // RFC 7231, 6.2.1 + StatusSwitchingProtocols = 101 // RFC 7231, 6.2.2 + StatusProcessing = 102 // RFC 2518, 10.1 + + StatusOK = 200 // RFC 7231, 6.3.1 + StatusCreated = 201 // RFC 7231, 6.3.2 + StatusAccepted = 202 // RFC 7231, 6.3.3 + StatusNonAuthoritativeInfo = 203 // RFC 7231, 6.3.4 + StatusNoContent = 204 // RFC 7231, 6.3.5 + StatusResetContent = 205 // RFC 7231, 6.3.6 + StatusPartialContent = 206 // RFC 7233, 4.1 + StatusMultiStatus = 207 // RFC 4918, 11.1 + StatusAlreadyReported = 208 // RFC 5842, 7.1 + StatusIMUsed = 226 // RFC 3229, 10.4.1 + + StatusMultipleChoices = 300 // RFC 7231, 6.4.1 + StatusMovedPermanently = 301 // RFC 7231, 6.4.2 + StatusFound = 302 // RFC 7231, 6.4.3 + StatusSeeOther = 303 // RFC 7231, 6.4.4 + StatusNotModified = 304 // RFC 7232, 4.1 + StatusUseProxy = 305 // RFC 7231, 6.4.5 + // StatusSwitchProxy = 306 // RFC 7231, 6.4.6 (Unused) + StatusTemporaryRedirect = 307 // RFC 7231, 6.4.7 + StatusPermanentRedirect = 308 // RFC 7538, 3 + + StatusBadRequest = 400 // RFC 7231, 6.5.1 + StatusUnauthorized = 401 // RFC 7235, 3.1 + StatusPaymentRequired = 402 // RFC 7231, 6.5.2 + StatusForbidden = 403 // RFC 7231, 6.5.3 + StatusNotFound = 404 // RFC 7231, 6.5.4 + StatusMethodNotAllowed = 405 // RFC 7231, 6.5.5 + StatusNotAcceptable = 406 // RFC 7231, 6.5.6 + StatusProxyAuthRequired = 407 // RFC 7235, 3.2 + StatusRequestTimeout = 408 // RFC 7231, 6.5.7 + StatusConflict = 409 // RFC 7231, 6.5.8 + StatusGone = 410 // RFC 7231, 6.5.9 + StatusLengthRequired = 411 // RFC 7231, 6.5.10 + StatusPreconditionFailed = 412 // RFC 7232, 4.2 + StatusRequestEntityTooLarge = 413 // RFC 7231, 6.5.11 + StatusRequestURITooLong = 414 // RFC 7231, 6.5.12 + StatusUnsupportedMediaType = 415 // RFC 7231, 6.5.13 + StatusRequestedRangeNotSatisfiable = 416 // RFC 7233, 4.4 + StatusExpectationFailed = 417 // RFC 7231, 6.5.14 + StatusTeapot = 418 // RFC 7168, 2.3.3 + StatusUnprocessableEntity = 422 // RFC 4918, 11.2 + StatusLocked = 423 // RFC 4918, 11.3 + StatusFailedDependency = 424 // RFC 4918, 11.4 + StatusUpgradeRequired = 426 // RFC 7231, 6.5.15 + StatusPreconditionRequired = 428 // RFC 6585, 3 + StatusTooManyRequests = 429 // RFC 6585, 4 + StatusRequestHeaderFieldsTooLarge = 431 // RFC 6585, 5 + StatusUnavailableForLegalReasons = 451 // RFC 7725, 3 + + StatusInternalServerError = 500 // RFC 7231, 6.6.1 + StatusNotImplemented = 501 // RFC 7231, 6.6.2 + StatusBadGateway = 502 // RFC 7231, 6.6.3 + StatusServiceUnavailable = 503 // RFC 7231, 6.6.4 + StatusGatewayTimeout = 504 // RFC 7231, 6.6.5 + StatusHTTPVersionNotSupported = 505 // RFC 7231, 6.6.6 + StatusVariantAlsoNegotiates = 506 // RFC 2295, 8.1 + StatusInsufficientStorage = 507 // RFC 4918, 11.5 + StatusLoopDetected = 508 // RFC 5842, 7.2 + StatusNotExtended = 510 // RFC 2774, 7 + StatusNetworkAuthenticationRequired = 511 // RFC 6585, 6 +) + +var statusMessages = map[int]string{ + StatusContinue: "Continue", + StatusSwitchingProtocols: "Switching Protocols", + StatusProcessing: "Processing", + + StatusOK: "OK", + StatusCreated: "Created", + StatusAccepted: "Accepted", + StatusNonAuthoritativeInfo: "Non-Authoritative Information", + StatusNoContent: "No Content", + StatusResetContent: "Reset Content", + StatusPartialContent: "Partial Content", + StatusMultiStatus: "Multi-Status", + StatusAlreadyReported: "Already Reported", + StatusIMUsed: "IM Used", + + StatusMultipleChoices: "Multiple Choices", + StatusMovedPermanently: "Moved Permanently", + StatusFound: "Found", + StatusSeeOther: "See Other", + StatusNotModified: "Not Modified", + StatusUseProxy: "Use Proxy", + StatusTemporaryRedirect: "Temporary Redirect", + StatusPermanentRedirect: "Permanent Redirect", + + StatusBadRequest: "Bad Request", + StatusUnauthorized: "Unauthorized", + StatusPaymentRequired: "Payment Required", + StatusForbidden: "Forbidden", + StatusNotFound: "Not Found", + StatusMethodNotAllowed: "Method Not Allowed", + StatusNotAcceptable: "Not Acceptable", + StatusProxyAuthRequired: "Proxy Authentication 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: "I'm a teapot", + StatusUnprocessableEntity: "Unprocessable Entity", + StatusLocked: "Locked", + StatusFailedDependency: "Failed Dependency", + StatusUpgradeRequired: "Upgrade Required", + StatusPreconditionRequired: "Precondition Required", + StatusTooManyRequests: "Too Many Requests", + StatusRequestHeaderFieldsTooLarge: "Request Header Fields Too Large", + StatusUnavailableForLegalReasons: "Unavailable For Legal Reasons", + + StatusInternalServerError: "Internal Server Error", + StatusNotImplemented: "Not Implemented", + StatusBadGateway: "Bad Gateway", + StatusServiceUnavailable: "Service Unavailable", + StatusGatewayTimeout: "Gateway Timeout", + StatusHTTPVersionNotSupported: "HTTP Version Not Supported", + StatusVariantAlsoNegotiates: "Variant Also Negotiates", + StatusInsufficientStorage: "Insufficient Storage", + StatusLoopDetected: "Loop Detected", + StatusNotExtended: "Not Extended", + StatusNetworkAuthenticationRequired: "Network Authentication Required", +}