mirror of
https://github.com/gofiber/fiber.git
synced 2025-02-06 23:12:02 +00:00
Merge remote-tracking branch 'origin/master' into v3-beta
This commit is contained in:
commit
75bb02b87e
10
.github/ISSUE_TEMPLATE/bug-report.yaml
vendored
10
.github/ISSUE_TEMPLATE/bug-report.yaml
vendored
@ -10,15 +10,15 @@ body:
|
||||
value: |
|
||||
### Notice
|
||||
**This repository is not related to external or third-part Fiber modules. If you have a problem with them, open an issue under their repos. If you think the problem is related to Fiber, open the issue here.**
|
||||
- Dont't forget you can ask your questions on our [Discord server](https://gofiber.io/discord).
|
||||
- If you think Fiber doesn't have a nice feature that you think, open the issue with **✏️ Feature Request** template.
|
||||
- Don't forget you can ask your questions in our [Discord server](https://gofiber.io/discord).
|
||||
- If you have a suggestion for a Fiber feature you would like to see, open the issue with the **✏️ Feature Request** template.
|
||||
- Write your issue with clear and understandable English.
|
||||
- type: textarea
|
||||
id: description
|
||||
attributes:
|
||||
label: "Bug Description"
|
||||
description: "A clear and detailed description of what the bug is."
|
||||
placeholder: "Explain your problem as clear and detailed."
|
||||
placeholder: "Explain your problem clearly and in detail."
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
@ -39,7 +39,7 @@ body:
|
||||
id: expected-behavior
|
||||
attributes:
|
||||
label: Expected Behavior
|
||||
description: "A clear and detailed description of what you think should happens."
|
||||
description: "A clear and detailed description of what you think should happen."
|
||||
placeholder: "Tell us what Fiber should normally do."
|
||||
validations:
|
||||
required: true
|
||||
@ -56,7 +56,7 @@ body:
|
||||
attributes:
|
||||
label: "Code Snippet (optional)"
|
||||
description: "For some issues, we need to know some parts of your code."
|
||||
placeholder: "Share a code you think related to the issue."
|
||||
placeholder: "Share a code snippet that you think is related to the issue."
|
||||
render: go
|
||||
value: |
|
||||
package main
|
||||
|
10
.github/ISSUE_TEMPLATE/feature-request.yaml
vendored
10
.github/ISSUE_TEMPLATE/feature-request.yaml
vendored
@ -9,15 +9,15 @@ body:
|
||||
attributes:
|
||||
value: |
|
||||
### Notice
|
||||
- Dont't forget you can ask your questions on our [Discord server](https://gofiber.io/discord).
|
||||
- If you think this is just a bug, open the issue with **☢️ Bug Report** template.
|
||||
- Don't forget you can ask your questions in our [Discord server](https://gofiber.io/discord).
|
||||
- If you think this is just a bug, open the issue with the **☢️ Bug Report** template.
|
||||
- Write your issue with clear and understandable English.
|
||||
- type: textarea
|
||||
id: description
|
||||
attributes:
|
||||
label: "Feature Description"
|
||||
description: "A clear and detailed description of the feature we need to do."
|
||||
placeholder: "Explain your feature as clear and detailed."
|
||||
description: "A clear and detailed description of the feature you would like to see added."
|
||||
placeholder: "Explain your feature clearly, and in detail."
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
@ -31,7 +31,7 @@ body:
|
||||
attributes:
|
||||
label: "Code Snippet (optional)"
|
||||
description: "Code snippet may be really helpful to describe some features."
|
||||
placeholder: "Share a code to explain the feature better."
|
||||
placeholder: "Share a code snippet to explain the feature better."
|
||||
render: go
|
||||
value: |
|
||||
package main
|
||||
|
10
.github/ISSUE_TEMPLATE/question.yaml
vendored
10
.github/ISSUE_TEMPLATE/question.yaml
vendored
@ -9,16 +9,16 @@ body:
|
||||
attributes:
|
||||
value: |
|
||||
### Notice
|
||||
- Dont't forget you can ask your questions on our [Discord server](https://gofiber.io/discord).
|
||||
- If you think this is just a bug, open the issue with **☢️ Bug Report** template.
|
||||
- If you think Fiber doesn't have a nice feature that you think, open the issue with **✏️ Feature Request** template.
|
||||
- Don't forget you can ask your questions in our [Discord server](https://gofiber.io/discord).
|
||||
- If you think this is just a bug, open the issue with the **☢️ Bug Report** template.
|
||||
- If you have a suggestion for a Fiber feature you would like to see, open the issue with the **✏️ Feature Request** template.
|
||||
- Write your issue with clear and understandable English.
|
||||
- type: textarea
|
||||
id: description
|
||||
attributes:
|
||||
label: "Question Description"
|
||||
description: "A clear and detailed description of the question."
|
||||
placeholder: "Explain your question as clear and detailed."
|
||||
placeholder: "Explain your question clearly, and in detail."
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
@ -26,7 +26,7 @@ body:
|
||||
attributes:
|
||||
label: "Code Snippet (optional)"
|
||||
description: "Code snippet may be really helpful to describe some features."
|
||||
placeholder: "Share a code to explain the feature better."
|
||||
placeholder: "Share a code snippet to explain the feature better."
|
||||
render: go
|
||||
value: |
|
||||
package main
|
||||
|
31
.github/README.md
vendored
31
.github/README.md
vendored
@ -1,6 +1,9 @@
|
||||
<p align="center">
|
||||
<a href="https://gofiber.io">
|
||||
<img alt="Fiber" height="125" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
<picture>
|
||||
<source height="125" media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo-dark.svg">
|
||||
<img height="125" alt="Fiber" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
</picture>
|
||||
</a>
|
||||
<br>
|
||||
<!-- base64 flags are available at https://www.phoca.cz/cssflags/ -->
|
||||
@ -61,6 +64,9 @@
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_uk.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/UK-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDU1LjIgMzguNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTUuMiAzOC40IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwhW0NEQVRBWwoJLnN0MHtmaWxsOiNGRkQ1MDA7fQoJLnN0MXtmaWxsOiMwMDVCQkI7fQpdXT48L3N0eWxlPjxnPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0zLjAzLDBoNDkuMTNjMS42NywwLDMuMDMsMS4zNiwzLjAzLDMuMDN2MzIuMzNjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3IFYzLjAzQzAsMS4zNiwxLjM3LDAsMy4wMywwTDMuMDMsMHoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMCwxOS4yaDU1LjJ2MTYuMTdjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3VjE5LjJMMCwxOS4yeiIvPjwvZz48L3N2Zz4=">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_az.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/AZ-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI2MDAiPg0KPHJlY3Qgd2lkdGg9IjEyMDAiIGhlaWdodD0iNjAwIiBmaWxsPSIjNTA5ZTJmIi8+DQo8cmVjdCB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI0MDAiIGZpbGw9IiNlZjMzNDAiLz4NCjxyZWN0IHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0iIzAwYjVlMiIvPg0KPGNpcmNsZSBjeD0iNTcwIiBjeT0iMzAwIiByPSI5MCIgZmlsbD0iI2ZmZiIvPg0KPGNpcmNsZSBjeD0iNTkwIiBjeT0iMzAwIiByPSI3NSIgZmlsbD0iI2VmMzM0MCIvPg0KPHBhdGggZD0iTTY3MCAyNTBsOS41NjcgMjYuOTAzIDI1Ljc4OC0xMi4yNTgtMTIuMjU4IDI1Ljc4OEw3MjAgMzAwbC0yNi45MDMgOS41NjcgMTIuMjU4IDI1Ljc4OC0yNS43ODgtMTIuMjU4TDY3MCAzNTBsLTkuNTY3LTI2LjkwMy0yNS43ODggMTIuMjU4IDEyLjI1OC0yNS43ODhMNjIwIDMwMGwyNi45MDMtOS41NjctMTIuMjU4LTI1Ljc4OCAyNS43ODggMTIuMjU4eiIgZmlsbD0iI2ZmZiIvPg0KPC9zdmc+">
|
||||
</a>
|
||||
<br>
|
||||
<a href="https://pkg.go.dev/github.com/gofiber/fiber/v3#pkg-overview">
|
||||
<img src="https://img.shields.io/badge/%F0%9F%93%9A%20godoc-pkg-00ACD7.svg?color=00ACD7&style=flat-square">
|
||||
@ -118,7 +124,7 @@ These tests are performed by [TechEmpower](https://www.techempower.com/benchmark
|
||||
|
||||
## ⚙️ Installation
|
||||
|
||||
Make sure you have Go installed ([download](https://go.dev/dl/)). Version `1.16` or higher is required.
|
||||
Make sure you have Go installed ([download](https://go.dev/dl/)). Version `1.17` or higher is required.
|
||||
|
||||
Initialize your project by creating a folder and then running `go mod init github.com/your/repo` ([learn more](https://go.dev/blog/using-go-modules)) inside the folder. Then install Fiber with the [`go get`](https://pkg.go.dev/cmd/go/#hdr-Add_dependencies_to_current_module_and_install_them) command:
|
||||
|
||||
@ -128,12 +134,12 @@ go get -u github.com/gofiber/fiber/v3
|
||||
|
||||
## 🎯 Features
|
||||
|
||||
- Robust [routing](https://docs.gofiber.io/routing)
|
||||
- Robust [routing](https://docs.gofiber.io/guide/routing)
|
||||
- Serve [static files](https://docs.gofiber.io/api/app#static)
|
||||
- Extreme [performance](https://docs.gofiber.io/extra/benchmarks)
|
||||
- [Low memory](https://docs.gofiber.io/extra/benchmarks) footprint
|
||||
- [API endpoints](https://docs.gofiber.io/api/ctx)
|
||||
- [Middleware](https://docs.gofiber.io/middleware) & [Next](https://docs.gofiber.io/api/ctx#next) support
|
||||
- [Middleware](https://docs.gofiber.io/category/-middleware) & [Next](https://docs.gofiber.io/api/ctx#next) support
|
||||
- [Rapid](https://dev.to/koddr/welcome-to-fiber-an-express-js-styled-fastest-web-framework-written-with-on-golang-497) server-side programming
|
||||
- [Template engines](https://github.com/gofiber/template)
|
||||
- [WebSocket support](https://github.com/gofiber/websocket)
|
||||
@ -151,7 +157,7 @@ Fiber is **inspired** by Express, the most popular web framework on the Internet
|
||||
We **listen** to our users in [issues](https://github.com/gofiber/fiber/issues), Discord [channel](https://gofiber.io/discord) _and all over the Internet_ to create a **fast**, **flexible** and **friendly** Go web framework for **any** task, **deadline** and developer **skill**! Just like Express does in the JavaScript world.
|
||||
|
||||
## ⚠️ Limitations
|
||||
* Due to Fiber's usage of unsafe, the library may not always be compatible with the latest Go version. Fiber 2.40.0 has been tested with Go versions 1.16 to 1.20.
|
||||
* Due to Fiber's usage of unsafe, the library may not always be compatible with the latest Go version. Fiber 2.40.0 has been tested with Go versions 1.17 to 1.20.
|
||||
* Fiber is not compatible with net/http interfaces. This means you will not be able to use projects like gqlgen, go-swagger, or any others which are part of the net/http ecosystem.
|
||||
|
||||
## 👀 Examples
|
||||
@ -440,7 +446,7 @@ func main() {
|
||||
|
||||
### JSON Response
|
||||
|
||||
📖 [JSON](https://docs.gofiber.io/ctx#json)
|
||||
📖 [JSON](https://docs.gofiber.io/api/ctx#json)
|
||||
|
||||
```go
|
||||
type User struct {
|
||||
@ -582,7 +588,7 @@ func main() {
|
||||
app := fiber.New(fiber.Config{
|
||||
EnableTrustedProxyCheck: true,
|
||||
TrustedProxies: []string{"0.0.0.0", "1.1.1.1/30"}, // IP address or IP address range
|
||||
ProxyHeader: fiber.HeaderXForwardedFor},
|
||||
ProxyHeader: fiber.HeaderXForwardedFor,
|
||||
})
|
||||
|
||||
// ...
|
||||
@ -619,7 +625,12 @@ Here is a list of middleware that are included within the Fiber framework.
|
||||
| [requestid](https://github.com/gofiber/fiber/tree/master/middleware/requestid) | Adds a requestid to every request. |
|
||||
| [session](https://github.com/gofiber/fiber/tree/master/middleware/session) | Session middleware. NOTE: This middleware uses our Storage package. |
|
||||
| [skip](https://github.com/gofiber/fiber/tree/master/middleware/skip) | Skip middleware that skips a wrapped handler if a predicate is true. |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware rewrites the URL path based on provided rules. It can be helpful for backward compatibility or just creating cleaner and more descriptive links. |
|
||||
| [timeout](https://github.com/gofiber/fiber/tree/master/middleware/timeout) | Adds a max time for a request and forwards to ErrorHandler if it is exceeded. |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converter for net/http handlers to/from Fiber request handlers, special thanks to @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Helps secure your apps by setting various HTTP headers. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Redirect middleware |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth middleware provides a key based authentication. |
|
||||
|
||||
## 🧬 External Middleware
|
||||
|
||||
@ -627,12 +638,7 @@ List of externally hosted middleware modules and maintained by the [Fiber team](
|
||||
|
||||
| Middleware | Description |
|
||||
| :------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converter for net/http handlers to/from Fiber request handlers, special thanks to @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Helps secure your apps by setting various HTTP headers. |
|
||||
| [jwt](https://github.com/gofiber/jwt) | JWT returns a JSON Web Token \(JWT\) auth middleware. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth middleware provides a key based authentication. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Redirect middleware |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware rewrites the URL path based on provided rules. It can be helpful for backward compatibility or just creating cleaner and more descriptive links. |
|
||||
| [storage](https://github.com/gofiber/storage) | Premade storage drivers that implement the Storage interface, designed to be used with various Fiber middlewares. |
|
||||
| [template](https://github.com/gofiber/template) | This package contains 8 template engines that can be used with Fiber `v1.10.x` Go version 1.13 or higher is required. |
|
||||
| [websocket](https://github.com/gofiber/websocket) | Based on Fasthttp WebSocket for Fiber with Locals support! |
|
||||
@ -694,7 +700,6 @@ Copyright (c) 2019-present [Fenny](https://github.com/fenny) and [Contributors](
|
||||
- [runewidth](https://github.com/mattn/go-runewidth/blob/master/LICENSE)
|
||||
- [fasthttp](https://github.com/valyala/fasthttp/blob/master/LICENSE)
|
||||
- [bytebufferpool](https://github.com/valyala/bytebufferpool/blob/master/LICENSE)
|
||||
- [dictpool](https://github.com/savsgio/dictpool/blob/master/LICENSE)
|
||||
- [fwd](https://github.com/philhofer/fwd/blob/master/LICENSE.md)
|
||||
- [go-ole](https://github.com/go-ole/go-ole/blob/master/LICENSE)
|
||||
- [gopsutil](https://github.com/shirou/gopsutil/blob/master/LICENSE)
|
||||
|
710
.github/README_az.md
vendored
Normal file
710
.github/README_az.md
vendored
Normal file
@ -0,0 +1,710 @@
|
||||
<p align="center">
|
||||
<a href="https://gofiber.io">
|
||||
|
||||
<picture>
|
||||
<source height="125" media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo-dark.svg">
|
||||
<img height="125" alt="Fiber" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
</picture>
|
||||
|
||||
</a>
|
||||
<br>
|
||||
<!-- base64 flags are available at https://www.phoca.cz/cssflags/ -->
|
||||
<!--<a href="https://github.com/gofiber/fiber/blob/master/.github/README.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/EN-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNjAgMzAiIGhlaWdodD0iNjAwIj4NCjxkZWZzPg0KPGNsaXBQYXRoIGlkPSJ0Ij4NCjxwYXRoIGQ9Im0zMCwxNWgzMHYxNXp2MTVoLTMwemgtMzB2LTE1enYtMTVoMzB6Ii8+DQo8L2NsaXBQYXRoPg0KPC9kZWZzPg0KPHBhdGggZmlsbD0iIzAwMjQ3ZCIgZD0ibTAsMHYzMGg2MHYtMzB6Ii8+DQo8cGF0aCBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iNiIgZD0ibTAsMGw2MCwzMG0wLTMwbC02MCwzMCIvPg0KPHBhdGggc3Ryb2tlPSIjY2YxNDJiIiBzdHJva2Utd2lkdGg9IjQiIGQ9Im0wLDBsNjAsMzBtMC0zMGwtNjAsMzAiIGNsaXAtcGF0aD0idXJsKCN0KSIvPg0KPHBhdGggc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjEwIiBkPSJtMzAsMHYzMG0tMzAtMTVoNjAiLz4NCjxwYXRoIHN0cm9rZT0iI2NmMTQyYiIgc3Ryb2tlLXdpZHRoPSI2IiBkPSJtMzAsMHYzMG0tMzAtMTVoNjAiLz4NCjwvc3ZnPg0K">
|
||||
</a>-->
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_ru.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/RU-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NTAgMzAwIj4NCjxwYXRoIGZpbGw9IiNmZmYiIGQ9Im0wLDBoNDUwdjEwMGgtNDUweiIvPg0KPHBhdGggZmlsbD0iIzAwZiIgZD0ibTAsMTAwaDQ1MHYxMDBoLTQ1MHoiLz4NCjxwYXRoIGZpbGw9IiNmMDAiIGQ9Im0wLDIwMGg0NTB2MTAwaC00NTB6Ii8+DQo8L3N2Zz4NCg==">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_es.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/ES-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA3NTAgNTAwIj4NCjxwYXRoIGZpbGw9IiNjNjBiMWUiIGQ9Im0wLDBoNzUwdjUwMGgtNzUweiIvPg0KPHBhdGggZmlsbD0iI2ZmYzQwMCIgZD0ibTAsMTI1aDc1MHYyNTBoLTc1MHoiLz4NCjwvc3ZnPg0K">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_ja.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/JA-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA5MDAgNjAwIj4NCjxwYXRoIGZpbGw9IiNmZmYiIGQ9Im0wLDBoOTAwdjYwMGgtOTAweiIvPg0KPGNpcmNsZSBmaWxsPSIjYmUwMDI2IiBjeD0iNDUwIiBjeT0iMzAwIiByPSIxODAiLz4NCjwvc3ZnPg0K">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_pt.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/PT-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTkuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDUxMiA1MTIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDUxMiA1MTI7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHJlY3QgeT0iODUuMzM3IiBzdHlsZT0iZmlsbDojRDgwMDI3OyIgd2lkdGg9IjUxMiIgaGVpZ2h0PSIzNDEuMzI2Ii8+Cjxwb2x5Z29uIHN0eWxlPSJmaWxsOiM2REE1NDQ7IiBwb2ludHM9IjE5Ni42NDEsODUuMzM3IDE5Ni42NDEsMjYxLjU2NSAxOTYuNjQxLDQyNi42NjMgMCw0MjYuNjYzIDAsODUuMzM3ICIvPgo8Y2lyY2xlIHN0eWxlPSJmaWxsOiNGRkRBNDQ7IiBjeD0iMTk2LjY0MSIgY3k9IjI1NiIgcj0iNjQiLz4KPHBhdGggc3R5bGU9ImZpbGw6I0Q4MDAyNzsiIGQ9Ik0xNjAuNjM4LDIyNHY0MC4wMDFjMCwxOS44ODIsMTYuMTE4LDM2LDM2LDM2czM2LTE2LjExOCwzNi0zNlYyMjRIMTYwLjYzOHoiLz4KPHBhdGggc3R5bGU9ImZpbGw6I0YwRjBGMDsiIGQ9Ik0xOTYuNjM4LDI3NmMtNi42MTcsMC0xMi01LjM4My0xMi0xMnYtMTZoMjQuMDAxdjE2QzIwOC42MzgsMjcwLjYxNiwyMDMuMjU0LDI3NiwxOTYuNjM4LDI3NnoiLz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPC9zdmc+Cg==">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_zh-CN.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/CN-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjAwIDgwMCIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KPHBhdGggZmlsbD0iI2RlMjkxMCIgZD0ibTAsMGgxMjAwdjgwMGgtMTIwMHoiLz4NCjxwYXRoIGZpbGw9IiNmZmRlMDAiIGQ9Im0tMTYuNTc5Niw5OS42MDA3bDIuMzY4Ni04LjEwMzItNi45NTMtNC43ODgzIDguNDM4Ni0uMjUxNCAyLjQwNTMtOC4wOTI0IDIuODQ2Nyw3Ljk0NzkgOC40Mzk2LS4yMTMxLTYuNjc5Miw1LjE2MzQgMi44MTA2LDcuOTYwNy02Ljk3NDctNC43NTY3LTYuNzAyNSw1LjEzMzF6IiB0cmFuc2Zvcm09Im1hdHJpeCg5LjkzMzUyIC4yNzc0NyAtLjI3NzQ3IDkuOTMzNTIgMzI0LjI5MjUgLTY5NS4yNDE1KSIvPg0KPHBhdGggZmlsbD0iI2ZmZGUwMCIgaWQ9InN0YXIiIGQ9Im0zNjUuODU1MiwzMzIuNjg5NWwyOC4zMDY4LDExLjM3NTcgMTkuNjcyMi0yMy4zMTcxLTIuMDcxNiwzMC40MzY3IDI4LjI1NDksMTEuNTA0LTI5LjU4NzIsNy40MzUyLTIuMjA5NywzMC40MjY5LTE2LjIxNDItMjUuODQxNS0yOS42MjA2LDcuMzAwOSAxOS41NjYyLTIzLjQwNjEtMTYuMDk2OC0yNS45MTQ4eiIvPg0KPGcgZmlsbD0iI2ZmZGUwMCI+DQo8cGF0aCBkPSJtNTE5LjA3NzksMTc5LjMxMjlsLTMwLjA1MzQtNS4yNDE4LTE0LjM5NDUsMjYuODk3Ni00LjMwMTctMzAuMjAyMy0zMC4wMjkzLTUuMzc4MSAyNy4zOTQ4LTEzLjQyNDItNC4xNjQ3LTMwLjIyMTUgMjEuMjMyNiwyMS45MDU3IDI3LjQ1NTQtMTMuMjk5OC0xNC4yNzIzLDI2Ljk2MjcgMjEuMTMzMSwyMi4wMDE3eiIvPg0KPHBhdGggZD0ibTQ1NS4yNTkyLDMxNS45Nzk1bDkuMzczNC0yOS4wMzE0LTI0LjYzMjUtMTcuOTk3OCAzMC41MDctLjA1NjYgOS41MDUtMjguOTg4NiA5LjQ4MSwyOC45OTY0IDMwLjUwNywuMDgxOC0yNC42NDc0LDE3Ljk3NzQgOS4zNDkzLDI5LjAzOTItMjQuNzE0LTE3Ljg4NTgtMjQuNzI4OCwxNy44NjUzeiIvPg0KPC9nPg0KPHVzZSB4bGluazpocmVmPSIjc3RhciIgdHJhbnNmb3JtPSJtYXRyaXgoLjk5ODYzIC4wNTIzNCAtLjA1MjM0IC45OTg2MyAxOS40MDAwNSAtMzAwLjUzNjgxKSIvPg0KPC9zdmc+DQo=">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_zh-TW.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/TW-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjwhRE9DVFlQRSBzdmc+DQo8c3ZnIHdpZHRoPSI5MDAiIGhlaWdodD0iNjAwIiB2aWV3Qm94PSItNjAgLTQwIDI0MCAxNjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KICAgPHJlY3QgeD0iLTYwIiB5PSItNDAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9IiNmZTAwMDAiLz4NCiAgIDxyZWN0IHg9Ii02MCIgeT0iLTQwIiB3aWR0aD0iNTAlIiBoZWlnaHQ9IjUwJSIgZmlsbD0iIzAwMDA5NSIvPg0KICAgPHBhdGggaWQ9ImZvdXJfcmF5cyIgZD0iTSA4LDAgTCAwLDMwIEwgLTgsMCBMIDAsLTMwIE0gMCw4IEwgMzAsMCBMIDAsLTggTCAtMzAsMCIgZmlsbD0iI2ZmZiIvPg0KICAgPHVzZSB4bGluazpocmVmPSIjZm91cl9yYXlzIiB0cmFuc2Zvcm09InJvdGF0ZSgzMCkiLz4NCiAgIDx1c2UgeGxpbms6aHJlZj0iI2ZvdXJfcmF5cyIgdHJhbnNmb3JtPSJyb3RhdGUoNjApIi8+DQogICA8Y2lyY2xlIHI9IjE3IiBmaWxsPSIjMDAwMDk1Ii8+DQogICA8Y2lyY2xlIHI9IjE1IiBmaWxsPSIjZmZmIi8+DQo8L3N2Zz4=">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_de.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/DE-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBoZWlnaHQ9IjYwMCIgdmlld0JveD0iMCAwIDUgMyI+DQo8cGF0aCBkPSJtMCwwaDV2M2gtNXoiLz4NCjxwYXRoIGZpbGw9IiNkMDAiIGQ9Im0wLDFoNXYyaC01eiIvPg0KPHBhdGggZmlsbD0iI2ZmY2UwMCIgZD0ibTAsMmg1djFoLTV6Ii8+DQo8L3N2Zz4NCg==">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_nl.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/NL-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iOTAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iNjAwIiB2aWV3Qm94PSIwIDAgOSA2Ij4NCjxwYXRoIGZpbGw9IiMyMTQ2OGIiIGQ9Im0wLDBoOXY2aC05eiIvPg0KPHBhdGggZmlsbD0iI2ZmZiIgZD0ibTAsMGg5djRoLTl6Ii8+DQo8cGF0aCBmaWxsPSIjYWUxYzI4IiBkPSJtMCwwaDl2MmgtOXoiLz4NCjwvc3ZnPg0K">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_ko.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/KO-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iOTAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iNjAwIiB2aWV3Qm94PSItMzYgLTI0IDcyIDQ4IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+DQo8cGF0aCBmaWxsPSIjZmZmIiBkPSJtLTM2LTI0aDcydjQ4aC03MnoiLz4NCjxnIHRyYW5zZm9ybT0ibWF0cml4KC41NTQ3IC0uODMyMDUgLjgzMjA1IC41NTQ3IDAgMCkiPg0KPGcgaWQ9ImIyIj4NCjxwYXRoIHN0cm9rZT0iIzAwMCIgaWQ9ImIiIHN0cm9rZS13aWR0aD0iMiIgZD0iTS02LTI1SDZNLTYtMjJINk0tNi0xOUg2Ii8+DQo8dXNlIHk9IjQ0IiB4bGluazpocmVmPSIjYiIvPg0KPC9nPg0KPHBhdGggc3Ryb2tlPSIjZmZmIiBkPSJtMCwxN3YxMCIvPg0KPGNpcmNsZSBmaWxsPSIjYzYwYzMwIiByPSIxMiIvPg0KPHBhdGggZmlsbD0iIzAwMzQ3OCIgZD0iTTAtMTJBNiw2IDAgMCAwIDAsMEE2LDYgMCAwIDEgMCwxMkExMiwxMiAwIDAsMSAwLTEyWiIvPg0KPC9nPg0KPGcgdHJhbnNmb3JtPSJtYXRyaXgoLS41NTQ3IC0uODMyMDUgLjgzMjA1IC0uNTU0NyAwIDApIj4NCjx1c2UgeGxpbms6aHJlZj0iI2IyIi8+DQo8cGF0aCBzdHJva2U9IiNmZmYiIGQ9Im0wLTIzLjV2M20wLDM3LjV2My41bTAsM3YzIi8+DQo8L2c+DQo8L3N2Zz4NCg==">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_fr.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/FR-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA5MDAgNjAwIj4NCjxwYXRoIGZpbGw9IiNlZDI5MzkiIGQ9Im0wLDBoOTAwdjYwMGgtOTAweiIvPg0KPHBhdGggZmlsbD0iI2ZmZiIgZD0ibTAsMGg2MDB2NjAwaC02MDB6Ii8+DQo8cGF0aCBmaWxsPSIjMDAyMzk1IiBkPSJtMCwwaDMwMHY2MDBoLTMwMHoiLz4NCjwvc3ZnPg0K">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_tr.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/TR-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBoZWlnaHQ9IjgwMCIgdmlld0JveD0iMCAwIDM2MCAyNDAiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCjxwYXRoIGZpbGw9IiNlMzBhMTciIGQ9Im0wLDBoMzYwdjI0MGgtMzYweiIvPg0KPGNpcmNsZSBmaWxsPSIjZmZmIiBjeD0iMTIwIiBjeT0iMTIwIiByPSI2MCIvPg0KPGNpcmNsZSBmaWxsPSIjZTMwYTE3IiBjeD0iMTM1IiBjeT0iMTIwIiByPSI0OCIvPg0KPGcgZmlsbD0iI2ZmZiIgdHJhbnNmb3JtPSJtYXRyaXgoMCAtMzAgMzAgMCAyMDAuNyAxMjApIj4NCjxnIGlkPSJnMiI+DQo8cGF0aCBpZD0iZzEiIGQ9Im0wLDAgMCwxIC41LDB6IiB0cmFuc2Zvcm09Im1hdHJpeCguOTUxMDYgLjMwOTAyIC0uMzA5MDIgLjk1MTA2IDAgLTEpIi8+DQo8dXNlIHhsaW5rOmhyZWY9IiNnMSIgdHJhbnNmb3JtPSJzY2FsZSgtMSAxKSIvPg0KPC9nPg0KPHVzZSB4bGluazpocmVmPSIjZzIiIHRyYW5zZm9ybT0icm90YXRlKDcyKSIvPg0KPHVzZSB4bGluazpocmVmPSIjZzIiIHRyYW5zZm9ybT0ibWF0cml4KC4zMDkwMiAtLjk1MTA2IC45NTEwNiAuMzA5MDIgMCAwKSIvPg0KPHVzZSB4bGluazpocmVmPSIjZzIiIHRyYW5zZm9ybT0icm90YXRlKDE0NCkiLz4NCjx1c2UgeGxpbms6aHJlZj0iI2cyIiB0cmFuc2Zvcm09Im1hdHJpeCgtLjgwOTAyIC0uNTg3NzkgLjU4Nzc5IC0uODA5MDIgMCAwKSIvPg0KPC9nPg0KPC9zdmc+DQo=">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_id.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/ID-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2MDAgNDAwIj4NCjxwYXRoIGZpbGw9IiNjZTExMjYiIGQ9Im0wLDBoNjAwdjIwMGgtNjAweiIvPg0KPHBhdGggZmlsbD0iI2ZmZiIgZD0ibTAsMjAwaDYwMHYyMDBoLTYwMHoiLz4NCjwvc3ZnPg0K">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_he.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/HE-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjYwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iNDgwIiB2aWV3Qm94PSIwIDAgMjIwIDE2MCIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KPGRlZnM+DQo8cGF0aCBzdHJva2U9IiMwMDM4YjgiIGZpbGwtb3BhY2l0eT0iMCIgaWQ9InRyaWFuZ2xlIiBzdHJva2Utd2lkdGg9IjUuNSIgZD0ibTAtMjkuMTQxLTI1LjIzNjksNDMuNzExNSA1MC40NzM4LTB6Ii8+DQo8L2RlZnM+DQo8cGF0aCBmaWxsPSIjZmZmIiBkPSJtMCwwaDIyMHYxNjBoLTIyMHoiLz4NCjxnIGZpbGw9IiMwMDM4YjgiPg0KPHBhdGggZD0ibTAsMTVoMjIwdjI1aC0yMjB6Ii8+DQo8cGF0aCBkPSJtMCwxMjBoMjIwdjI1aC0yMjB6Ii8+DQo8L2c+DQo8dXNlIHhsaW5rOmhyZWY9IiN0cmlhbmdsZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTEwIDgwKSIvPg0KPHVzZSB4bGluazpocmVmPSIjdHJpYW5nbGUiIHRyYW5zZm9ybT0ibWF0cml4KC0xIDAgLTAgLTEgMTEwIDgwKSIvPg0KPC9zdmc+DQo=">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_sa.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/SA-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBoZWlnaHQ9IjYwMCIgdmlld0JveD0iMCAwIDEyIDYiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCjxwYXRoIGZpbGw9IiNjZTExMjYiIGQ9Im0wLDBoM3Y2aC0zeiIvPg0KPHBhdGggZmlsbD0iIzAwOWEwMCIgZD0ibTMsMGg5djJoLTl6Ii8+DQo8cGF0aCBmaWxsPSIjZmZmIiBkPSJtMywyaDl2MmgtOXoiLz4NCjxwYXRoIGQ9Im0zLDRoOXYyaC05eiIvPg0KPC9zdmc+DQo=">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_fa.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/IR-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTAwMCIgaGVpZ2h0PSI1NzIuMiIgdmlld0JveD0iLTcuMjE3IC00LjEyOSAxMDAwIDU3Mi4yIj48cGF0aCBkPSJNLTcuMjE3LTQuMTI5aDEwMDB2NTcyLjJoLTEwMDB6IiBmaWxsPSIjMjM5ZjQwIi8+PHBhdGggZD0iTS03LjIxNyAyODEuOTcxaDEwMDB2Mjg2LjFoLTEwMDB6IiBmaWxsPSIjZGEwMDAwIi8+PHBhdGggZD0iTS03LjIxNyAxODYuNTcxaDEwMDB2MTkwLjc1aC0xMDAweiIgZmlsbD0iI2ZmZiIvPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC03LjIxNyAxNTUuNDcxKSBzY2FsZSg0LjQ0NDUpIj48ZyBpZD0iZSI+PGcgaWQ9ImMiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmZiI+PHBhdGggaWQ9ImIiIGQ9Ik0zIC41aDEzTTMuNSA1VjIuNWg0djJoNHYtMkg5bS00IDJoMW0xMCAwaC0yLjV2LTJoNG0wLTIuNXY0LjVoNFYwbS0yIDB2NC41Ii8+PHBhdGggaWQ9ImEiIGQ9Ik0zIDdoOW0xIDBoOSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHVzZSB4bGluazpocmVmPSIjYSIgeT0iNDIuOTEzIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIi8+PHVzZSB4bGluazpocmVmPSIjYiIgeT0iNTEuOTEzIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIi8+PC9nPjxnIGlkPSJkIj48dXNlIHhsaW5rOmhyZWY9IiNjIiB4PSIyMCIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIvPjx1c2UgeGxpbms6aHJlZj0iI2MiIHg9IjQwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIi8+PHVzZSB4bGluazpocmVmPSIjYyIgeD0iNjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiLz48L2c+PC9nPjx1c2UgeGxpbms6aHJlZj0iI2QiIHg9IjYwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIi8+PHVzZSB4bGluazpocmVmPSIjZSIgeD0iMTQwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIi8+PC9nPjxnIHRyYW5zZm9ybT0ibWF0cml4KDY5LjI4NSAwIDAgNjkuMjg1IDQ5Mi43ODMgMjgxLjk3MSkiIGZpbGw9IiNkYTAwMDAiPjxnIGlkPSJmIj48cGF0aCBkPSJNLS41NDguODM2QS45MTIuOTEyIDAgMCAwIC4zMjktLjcyMiAxIDEgMCAwIDEtLjU0OC44MzYiLz48cGF0aCBkPSJNLjYxOC42NjFBLjc2NC43NjQgMCAwIDAgLjQyMi0uNzQgMSAxIDAgMCAxIC42MTguNjYxTTAgMWwtLjA1LTFMMC0uNzg3YS4zMS4zMSAwIDAgMCAuMTE4LjA5OVYtLjFsLS4wNC45OTN6TS0uMDItLjg1TDAtLjgzMWEuMTQ0LjE0NCAwIDAgMCAuMjUyLS4xMzdBLjEzNi4xMzYgMCAwIDEgMC0uOTI1Ii8+PC9nPjx1c2UgeGxpbms6aHJlZj0iI2YiIHRyYW5zZm9ybT0ic2NhbGUoLTEgMSkiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiLz48L2c+PC9zdmc+">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_it.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/IT-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBoZWlnaHQ9IjEwMDAiIHZpZXdCb3g9IjAgMCAzIDIiPg0KPHBhdGggZmlsbD0iIzAwOTI0NiIgZD0ibTAsMGgxdjJoLTF6Ii8+DQo8cGF0aCBmaWxsPSIjZmZmIiBkPSJtMSwwaDF2MmgtMXoiLz4NCjxwYXRoIGZpbGw9IiNjZTJiMzciIGQ9Im0yLDBoMXYyaC0xeiIvPg0KPC9zdmc+DQo=">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_ckb.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/CKB-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI5MDAiIGhlaWdodD0iNjAwIj48ZyBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0wIDBoOTAwdjYwMEgweiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0wIDBoOTAwdjIwMEgweiIgZmlsbD0iI2VkMjAyNCIvPjxwYXRoIGQ9Ik0wIDQwMGg5MDB2MjAwSDB6IiBmaWxsPSIjMjc4ZTQzIi8+PC9nPjxwYXRoIGQ9Ik00NTAgMTUwbDExLjI0IDc2LjI2NCAzMy4yMjItNjkuNTYzLTExLjczOCA3Ni4xOSA1Mi4yNDktNTYuNjgtMzMuNjc0IDY5LjM0NCA2Ni42MzQtMzguNzYxLTUyLjYxNiA1Ni4zMzggNzUuMDk4LTE3LjM5OS02Ni44ODUgMzguMzI3IDc2Ljg5IDUuNTEtNzUuMjEgMTYuOTA5IDcxLjg1IDI3LjkyOS03Ni44NTItNi4wMTEgNjAuNDI1IDQ3Ljg2Ny03MS42NjYtMjguMzk3IDQzLjYzMiA2My41NS02MC4xMTMtNDguMjU5IDIyLjk2MiA3My41ODktNDMuMjE3LTYzLjgzNC4yNSA3Ny4wODdMNDUwIDM3Ni4yNjQgNDI3LjUxOCA0NTBsLjI1MS03Ny4wODctNDMuMjE3IDYzLjgzNCAyMi45NjItNzMuNTg5LTYwLjExMyA0OC4yNiA0My42MzItNjMuNTUxLTcxLjY2NiAyOC4zOTcgNjAuNDI1LTQ3Ljg2Ny03Ni44NTIgNi4wMTEgNzEuODUtMjcuOTMtNzUuMjEtMTYuOTA4IDc2Ljg5LTUuNTEtNjYuODg1LTM4LjMyNyA3NS4wOTggMTcuMzk5LTUyLjYxNi01Ni4zMzggNjYuNjM0IDM4Ljc2LTMzLjY3NC02OS4zNDMgNTIuMjQ5IDU2LjY4LTExLjczOC03Ni4xOSAzMy4yMjEgNjkuNTYzeiIgZmlsbD0iI2ZlYmQxMSIgZmlsbC1ydWxlPSJldmVub2RkIi8+PC9zdmc+">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_uk.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/UK-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDU1LjIgMzguNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTUuMiAzOC40IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwhW0NEQVRBWwoJLnN0MHtmaWxsOiNGRkQ1MDA7fQoJLnN0MXtmaWxsOiMwMDVCQkI7fQpdXT48L3N0eWxlPjxnPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0zLjAzLDBoNDkuMTNjMS42NywwLDMuMDMsMS4zNiwzLjAzLDMuMDN2MzIuMzNjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3IFYzLjAzQzAsMS4zNiwxLjM3LDAsMy4wMywwTDMuMDMsMHoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMCwxOS4yaDU1LjJ2MTYuMTdjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3VjE5LjJMMCwxOS4yeiIvPjwvZz48L3N2Zz4=">
|
||||
</a>
|
||||
<br>
|
||||
<a href="https://pkg.go.dev/github.com/gofiber/fiber/v2#pkg-overview">
|
||||
<img src="https://img.shields.io/badge/%F0%9F%93%9A%20godoc-pkg-00ACD7.svg?color=00ACD7&style=flat-square">
|
||||
</a>
|
||||
<a href="https://goreportcard.com/report/github.com/gofiber/fiber/v2">
|
||||
<img src="https://img.shields.io/badge/%F0%9F%93%9D%20goreport-A%2B-75C46B?style=flat-square">
|
||||
</a>
|
||||
<a href="https://gocover.io/github.com/gofiber/fiber">
|
||||
<img src="https://img.shields.io/badge/%F0%9F%94%8E%20gocover-97.8%25-75C46B.svg?style=flat-square">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/actions?query=workflow%3ASecurity">
|
||||
<img src="https://img.shields.io/github/actions/workflow/status/gofiber/fiber/security.yml?branch=master&label=%F0%9F%94%91%20gosec&style=flat-square&color=75C46B">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/actions?query=workflow%3ATest">
|
||||
<img src="https://img.shields.io/github/actions/workflow/status/gofiber/fiber/test.yml?branch=master&label=%F0%9F%A7%AA%20tests&style=flat-square&color=75C46B">
|
||||
</a>
|
||||
<a href="https://docs.gofiber.io">
|
||||
<img src="https://img.shields.io/badge/%F0%9F%92%A1%20fiber-docs-00ACD7.svg?style=flat-square">
|
||||
</a>
|
||||
<a href="https://gofiber.io/discord">
|
||||
<img src="https://img.shields.io/discord/704680098577514527?style=flat-square&label=%F0%9F%92%AC%20discord&color=00ACD7">
|
||||
</a>
|
||||
|
||||
</p>
|
||||
<p align="center">
|
||||
<b>Fiber</b> <a href="https://go.dev/doc/">Go</a> dili üçün ən sürətli HTTP mühərriki <a href="https://github.com/valyala/fasthttp">Fasthttp</a> və <a href="https://github.com/expressjs/express">Express</a> kitabxanasına bənzər arxitektura üzərində qurulmuş bir <b>web framework-dür</b>. <b>Sıfır yaddaş ayrılması (zero-memory allocation)</b> və performans səbəbilə development prosesini <b>sürətləndirmək</b> və <b>asanlaşdırmaq</b> üçün tərtib edilmişdir.
|
||||
</p>
|
||||
|
||||
## ⚡️ Sürətli Başlanğıc
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import "github.com/gofiber/fiber/v2"
|
||||
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
app.Get("/", func(c *fiber.Ctx) error {
|
||||
return c.SendString("Hello, World 👋!")
|
||||
})
|
||||
|
||||
app.Listen(":3000")
|
||||
}
|
||||
```
|
||||
|
||||
## 🤖 Performans Dəyərləri
|
||||
|
||||
Bu testlər [TechEmpower](https://www.techempower.com/benchmarks/#section=data-r19&hw=ph&test=plaintext) və [Go Web](https://github.com/smallnest/go-web-framework-benchmark) tərəfindən aparılıb. Bütün nəticələri görmək üçün [Wiki](https://docs.gofiber.io/extra/benchmarks) səhifəsinə keçid edə bilərsiniz.
|
||||
|
||||
<p float="left" align="middle">
|
||||
<img src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/benchmark-pipeline.png" width="49%">
|
||||
<img src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/benchmark_alloc.png" width="49%">
|
||||
</p>
|
||||
|
||||
## ⚙️ Quraşdırılması
|
||||
|
||||
Go dilinin `1.17` və ya daha yuxarı versiyanın [yükləndiyindən](https://go.dev/dl/) əmin olun.
|
||||
|
||||
|
||||
Bir qovluq yaratdıqdan sonra, `go mod init github.com/your/repo` komandasını eyni qovluğun daxilində işə salaraq layihənizi başladın ([go modulları haqqında əlavə bilgilər](https://go.dev/blog/using-go-modules)). Növbəti addım olaraq Fiber-i [`go get`](https://pkg.go.dev/cmd/go/#hdr-Add_dependencies_to_current_module_and_install_them) komandasını işlədərək yükləyin:
|
||||
|
||||
```bash
|
||||
go get -u github.com/gofiber/fiber/v2
|
||||
```
|
||||
|
||||
## 🎯 Özəllikləri
|
||||
|
||||
- Güclü [routing](https://docs.gofiber.io/guide/routing)
|
||||
- [Static faylların](https://docs.gofiber.io/api/app#static) təqdimatı
|
||||
- Yüksək [performans](https://docs.gofiber.io/extra/benchmarks)
|
||||
- [Daha az yaddaş istifadəsi](https://docs.gofiber.io/extra/benchmarks)
|
||||
- [API son nöqtələri (endpoint)](https://docs.gofiber.io/api/ctx)
|
||||
- [Middleware](https://docs.gofiber.io/category/-middleware) & [Next](https://docs.gofiber.io/api/ctx#next) dəstəyi
|
||||
- [Rapid](https://dev.to/koddr/welcome-to-fiber-an-express-js-styled-fastest-web-framework-written-with-on-golang-497) server yönümlü proqramlaşdırma
|
||||
- [Template mühərrikləri](https://github.com/gofiber/template)
|
||||
- [WebSocket dəstəyi](https://github.com/gofiber/websocket)
|
||||
- [Server-Sent events](https://github.com/gofiber/recipes/tree/master/sse)
|
||||
- [Rate Limiter](https://docs.gofiber.io/api/middleware/limiter)
|
||||
- [18 dildə](https://docs.gofiber.io/) mövcudluğu
|
||||
|
||||
Daha ətraflı məlumat üçün [rəsmi sənədləşməyə](https://docs.gofiber.io/) baxış keçirə bilərsiniz.
|
||||
|
||||
## 💡 Fəlsəfə
|
||||
|
||||
[Node.js](https://nodejs.org/en/about/)-dən [Go](https://go.dev/doc/)-ya yeni keçən gopher-lər veb tətbiqlər və mikroservislər yazmadan öncə dilin özünəməxsus sintaksisini öyrənməklə məşğul olurlar. Fiber <b></b><b></b><b>Minimalizm</b> və <b>UNIX-in yaradılış prinsiplərinə </b> uyğun şəkildə qurulmuş bir web framework-dür. Bu sahədə yeni olan gopher-lər Go dünyasında özlərini doğma və güvənli hiss edə biləcək şəkildə bir ab-hava ilə rastlaşa bilərlər.
|
||||
|
||||
Fiber internet üzərində olan ən məşhur web framework-lərdən biri olan Express-dən ilhamlanaraq ərsəyə gəlmişdir. Biz Express-in rahatlıq və asanlıq xüsusiyyətlərini, Go-nun çiy performansı ilə birləşdirmişik; əgər əvvəldən Node.js üzərində (Express və ya bənzərləri) veb tətbiqi yaratmısınızsa, onda əksər metodlar və prinsiplər sizə tanış gələcəkdir.
|
||||
|
||||
Biz istifadəçilərdən gələn [issue-a](https://github.com/gofiber/fiber/issues), Discord [kanalımıza](https://gofiber.io/discord) və bütün interneti əhatə edən vasitələrdən gələn rəyləri nəzərə alırıq. Bunun nəzdində, biz sürətli və rahat şəkildə hər bir tapşırığın səviyyəsinə uyğun olan — dostcasına bir Go web framework-ü olmağı hədəfləmişik (Express-in JavaScript dünyasında etdiyi kimi).
|
||||
|
||||
## ⚠️ Limitlər
|
||||
* Fiber unsafe prinsiplərə əsaslanaraq çalışdığından, o hər zaman Go-nun son versiyası ilə uyğunlaşmaya bilər. Buna görə də, Fiber 2.40.0 — Go 1.17 və 1.20 versiyaları ilə test edilərək saz vəziyyətə gətirilmişdir.
|
||||
* Fiber net/http interfeysləri ilə uyğun deyil. Yəni gqlgen, go-swagger kimi net/http ekosisteminin parçası olan layihələri istifadə edə bilməzsiniz.
|
||||
|
||||
## 👀 Misallar
|
||||
|
||||
Aşağıda geniş istifadə olunan misallardan bəziləri siyahı şəklində qeyd olunub. Əgər daha çox koda dair misalları görmək istəyirsinizsə, onda [Əlavə misallardan ibarət github deposunu](https://github.com/gofiber/recipes) və ya [API sənədləşməni](https://docs.gofiber.io) nəzərdən keçirin.
|
||||
|
||||
#### 📖 [**Sadə Routing**](https://docs.gofiber.io/#basic-routing)
|
||||
|
||||
```go
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
// GET /api/register
|
||||
app.Get("/api/*", func(c *fiber.Ctx) error {
|
||||
msg := fmt.Sprintf("✋ %s", c.Params("*"))
|
||||
return c.SendString(msg) // => ✋ register
|
||||
})
|
||||
|
||||
// GET /flights/LAX-SFO
|
||||
app.Get("/flights/:from-:to", func(c *fiber.Ctx) error {
|
||||
msg := fmt.Sprintf("💸 From: %s, To: %s", c.Params("from"), c.Params("to"))
|
||||
return c.SendString(msg) // => 💸 From: LAX, To: SFO
|
||||
})
|
||||
|
||||
// GET /dictionary.txt
|
||||
app.Get("/:file.:ext", func(c *fiber.Ctx) error {
|
||||
msg := fmt.Sprintf("📃 %s.%s", c.Params("file"), c.Params("ext"))
|
||||
return c.SendString(msg) // => 📃 dictionary.txt
|
||||
})
|
||||
|
||||
// GET /john/75
|
||||
app.Get("/:name/:age/:gender?", func(c *fiber.Ctx) error {
|
||||
msg := fmt.Sprintf("👴 %s is %s years old", c.Params("name"), c.Params("age"))
|
||||
return c.SendString(msg) // => 👴 john is 75 years old
|
||||
})
|
||||
|
||||
// GET /john
|
||||
app.Get("/:name", func(c *fiber.Ctx) error {
|
||||
msg := fmt.Sprintf("Hello, %s 👋!", c.Params("name"))
|
||||
return c.SendString(msg) // => Hello john 👋!
|
||||
})
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
#### 📖 [**Route-un Adlandırılması**](https://docs.gofiber.io/api/app#name)
|
||||
|
||||
```go
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
// GET /api/register
|
||||
app.Get("/api/*", func(c *fiber.Ctx) error {
|
||||
msg := fmt.Sprintf("✋ %s", c.Params("*"))
|
||||
return c.SendString(msg) // => ✋ register
|
||||
}).Name("api")
|
||||
|
||||
data, _ := json.MarshalIndent(app.GetRoute("api"), "", " ")
|
||||
fmt.Print(string(data))
|
||||
// Prints:
|
||||
// {
|
||||
// "method": "GET",
|
||||
// "name": "api",
|
||||
// "path": "/api/*",
|
||||
// "params": [
|
||||
// "*1"
|
||||
// ]
|
||||
// }
|
||||
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
#### 📖 [**Static Fayl Təqdimatı**](https://docs.gofiber.io/api/app#static)
|
||||
|
||||
```go
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
app.Static("/", "./public")
|
||||
// => http://localhost:3000/js/script.js
|
||||
// => http://localhost:3000/css/style.css
|
||||
|
||||
app.Static("/prefix", "./public")
|
||||
// => http://localhost:3000/prefix/js/script.js
|
||||
// => http://localhost:3000/prefix/css/style.css
|
||||
|
||||
app.Static("*", "./public/index.html")
|
||||
// => http://localhost:3000/any/path/shows/index/html
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
#### 📖 [**Middleware & Next**](https://docs.gofiber.io/api/ctx#next)
|
||||
|
||||
```go
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
// Match any route
|
||||
app.Use(func(c *fiber.Ctx) error {
|
||||
fmt.Println("🥇 First handler")
|
||||
return c.Next()
|
||||
})
|
||||
|
||||
// Match all routes starting with /api
|
||||
app.Use("/api", func(c *fiber.Ctx) error {
|
||||
fmt.Println("🥈 Second handler")
|
||||
return c.Next()
|
||||
})
|
||||
|
||||
// GET /api/list
|
||||
app.Get("/api/list", func(c *fiber.Ctx) error {
|
||||
fmt.Println("🥉 Last handler")
|
||||
return c.SendString("Hello, World 👋!")
|
||||
})
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>📚 Daha çox misalllar</summary>
|
||||
|
||||
### Baxış mühərriki (View Engine)
|
||||
|
||||
📖 [Config](https://docs.gofiber.io/api/fiber#config)
|
||||
📖 [Mühərriklər](https://github.com/gofiber/template)
|
||||
📖 [Render](https://docs.gofiber.io/api/ctx#render)
|
||||
|
||||
Fiber baxış mühərriki təyin edilmədikdə [html/template-in](https://pkg.go.dev/html/template/) default formasını alır.
|
||||
|
||||
Əgər siz partial-ı və ya müxtəlif tipdə olan mühərrikləri istifadə etmək istəyirsinizsə, o zaman [amber](https://github.com/eknkc/amber), [handlebars](https://github.com/aymerick/raymond), [mustache](https://github.com/cbroglie/mustache), [pug](https://github.com/Joker/jade) və s. kimi misallara baxa bilərsiniz.
|
||||
|
||||
Çoxsaylı baxış mühərriklərini dəstəkləyən [template](https://github.com/gofiber/template) package-ə göstərilən link vasitəsilə nəzərdən keçirə bilərsiniz.
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/template/pug"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// Baxış mühərrikini tətbiqi başlatzmadan əvvəl quraşdıra bilərsiniz:
|
||||
app := fiber.New(fiber.Config{
|
||||
Views: pug.New("./views", ".pug"),
|
||||
})
|
||||
|
||||
// Və indi `./views/home.pug` template-i bu şəkildə çağıra bilərsiniz:
|
||||
app.Get("/", func(c *fiber.Ctx) error {
|
||||
return c.Render("home", fiber.Map{
|
||||
"title": "Homepage",
|
||||
"year": 1999,
|
||||
})
|
||||
})
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
```
|
||||
|
||||
### Route-ın zəncirlərdə qruplaşdırılması
|
||||
|
||||
📖 [Group](https://docs.gofiber.io/api/app#group)
|
||||
|
||||
```go
|
||||
func middleware(c *fiber.Ctx) error {
|
||||
fmt.Println("Don't mind me!")
|
||||
return c.Next()
|
||||
}
|
||||
|
||||
func handler(c *fiber.Ctx) error {
|
||||
return c.SendString(c.Path())
|
||||
}
|
||||
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
// Root API route
|
||||
api := app.Group("/api", middleware) // /api
|
||||
|
||||
// API v1 routes
|
||||
v1 := api.Group("/v1", middleware) // /api/v1
|
||||
v1.Get("/list", handler) // /api/v1/list
|
||||
v1.Get("/user", handler) // /api/v1/user
|
||||
|
||||
// API v2 routes
|
||||
v2 := api.Group("/v2", middleware) // /api/v2
|
||||
v2.Get("/list", handler) // /api/v2/list
|
||||
v2.Get("/user", handler) // /api/v2/user
|
||||
|
||||
// ...
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
### Middleware Logger
|
||||
|
||||
📖 [Logger](https://docs.gofiber.io/api/middleware/logger)
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/logger"
|
||||
)
|
||||
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
app.Use(logger.New())
|
||||
|
||||
// ...
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
```
|
||||
|
||||
### Cross-Origin Resource Sharing (CORS)
|
||||
|
||||
📖 [CORS](https://docs.gofiber.io/api/middleware/cors)
|
||||
|
||||
```go
|
||||
import (
|
||||
"log"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/cors"
|
||||
)
|
||||
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
app.Use(cors.New())
|
||||
|
||||
// ...
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
```
|
||||
|
||||
"Origin" başlığında istənilən domeni keçməklə CORS-un yoxlanması:
|
||||
|
||||
```bash
|
||||
curl -H "Origin: http://example.com" --verbose http://localhost:3000
|
||||
```
|
||||
|
||||
### Custom 404 response
|
||||
|
||||
📖 [HTTP Methods](https://docs.gofiber.io/api/ctx#status)
|
||||
|
||||
```go
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
app.Static("/", "./public")
|
||||
|
||||
app.Get("/demo", func(c *fiber.Ctx) error {
|
||||
return c.SendString("This is a demo!")
|
||||
})
|
||||
|
||||
app.Post("/register", func(c *fiber.Ctx) error {
|
||||
return c.SendString("Welcome!")
|
||||
})
|
||||
|
||||
// Sonuncu middleware-in hər şeyə uyğunlaşdırılması
|
||||
app.Use(func(c *fiber.Ctx) error {
|
||||
return c.SendStatus(404)
|
||||
// => 404 "Not Found"
|
||||
})
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
```
|
||||
|
||||
### JSON Response
|
||||
|
||||
📖 [JSON](https://docs.gofiber.io/api/ctx#json)
|
||||
|
||||
```go
|
||||
type User struct {
|
||||
Name string `json:"name"`
|
||||
Age int `json:"age"`
|
||||
}
|
||||
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
app.Get("/user", func(c *fiber.Ctx) error {
|
||||
return c.JSON(&User{"John", 20})
|
||||
// => {"name":"John", "age":20}
|
||||
})
|
||||
|
||||
app.Get("/json", func(c *fiber.Ctx) error {
|
||||
return c.JSON(fiber.Map{
|
||||
"success": true,
|
||||
"message": "Hi John!",
|
||||
})
|
||||
// => {"success":true, "message":"Hi John!"}
|
||||
})
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
```
|
||||
|
||||
### WebSocket-in təkminləşdirilməsi (upgrade)
|
||||
|
||||
📖 [Websocket](https://github.com/gofiber/websocket)
|
||||
|
||||
```go
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/websocket"
|
||||
)
|
||||
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
app.Get("/ws", websocket.New(func(c *websocket.Conn) {
|
||||
for {
|
||||
mt, msg, err := c.ReadMessage()
|
||||
if err != nil {
|
||||
log.Println("read:", err)
|
||||
break
|
||||
}
|
||||
log.Printf("recv: %s", msg)
|
||||
err = c.WriteMessage(mt, msg)
|
||||
if err != nil {
|
||||
log.Println("write:", err)
|
||||
break
|
||||
}
|
||||
}
|
||||
}))
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
// ws://localhost:3000/ws
|
||||
}
|
||||
```
|
||||
|
||||
### Server-Sent Events
|
||||
|
||||
📖 [More Info](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events)
|
||||
|
||||
```go
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/valyala/fasthttp"
|
||||
)
|
||||
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
app.Get("/sse", func(c *fiber.Ctx) error {
|
||||
c.Set("Content-Type", "text/event-stream")
|
||||
c.Set("Cache-Control", "no-cache")
|
||||
c.Set("Connection", "keep-alive")
|
||||
c.Set("Transfer-Encoding", "chunked")
|
||||
|
||||
c.Context().SetBodyStreamWriter(fasthttp.StreamWriter(func(w *bufio.Writer) {
|
||||
fmt.Println("WRITER")
|
||||
var i int
|
||||
|
||||
for {
|
||||
i++
|
||||
msg := fmt.Sprintf("%d - the time is %v", i, time.Now())
|
||||
fmt.Fprintf(w, "data: Message: %s\n\n", msg)
|
||||
fmt.Println(msg)
|
||||
|
||||
w.Flush()
|
||||
time.Sleep(5 * time.Second)
|
||||
}
|
||||
}))
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
```
|
||||
|
||||
### Middleware-in Bərpası
|
||||
|
||||
📖 [Recover](https://docs.gofiber.io/api/middleware/recover)
|
||||
|
||||
```go
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/recover"
|
||||
)
|
||||
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
app.Use(recover.New())
|
||||
|
||||
app.Get("/", func(c *fiber.Ctx) error {
|
||||
panic("normally this would crash your app")
|
||||
})
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
### Etibarlı Proxy İstifadəsi
|
||||
|
||||
📖 [Config](https://docs.gofiber.io/api/fiber#config)
|
||||
|
||||
```go
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/recover"
|
||||
)
|
||||
|
||||
func main() {
|
||||
app := fiber.New(fiber.Config{
|
||||
EnableTrustedProxyCheck: true,
|
||||
TrustedProxies: []string{"0.0.0.0", "1.1.1.1/30"}, // IP address or IP address range
|
||||
ProxyHeader: fiber.HeaderXForwardedFor,
|
||||
})
|
||||
|
||||
// ...
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
## 🧬 Daxili Middleware
|
||||
|
||||
Aşağıda Fiber-in daxilində olan middleware-lər siyahı şəklində göstərilmişdir.
|
||||
|
||||
| Middleware | Açıqlama |
|
||||
|:---------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| [basicauth](https://github.com/gofiber/fiber/tree/master/middleware/basicauth) | Sadə bir auth middleware-dir və HTTP Basic Auth yaratmaq üçün istifadə olunur. Keçərli vəsiqə (credentials) bilgiləri üçün sonrakı handler-i, əksik və ya keçərsiz vəsiqə bilgiləri üçün 401 qaytarır. |
|
||||
| [cache](https://github.com/gofiber/fiber/tree/master/middleware/cache) | Response-ı dayandırır və keşə yerləşdirir. |
|
||||
| [compress](https://github.com/gofiber/fiber/tree/master/middleware/compress) | Fiber üçün sıxışdırma (compression) middleware-dir. Default olaraq `deflate`, `gzip` və `brotli` dəstəkləyir. |
|
||||
| [cors](https://github.com/gofiber/fiber/tree/master/middleware/cors) | Çeşidli seçimlərlə başlanğıclar arası mənbə paylaşımı (CORS) aktivləşdirir. |
|
||||
| [csrf](https://github.com/gofiber/fiber/tree/master/middleware/csrf) | CSRF exploit-dən qorunmasını təmin edir. |
|
||||
| [encryptcookie](https://github.com/gofiber/fiber/tree/master/middleware/encryptcookie) | Encrypt middleware-i cookie dəyərlərini şifrələyir. |
|
||||
| [envvar](https://github.com/gofiber/fiber/tree/master/middleware/envvar) | Environment dəyərlərini göstərilən config-ə görə təyin edir. |
|
||||
| [etag](https://github.com/gofiber/fiber/tree/master/middleware/etag) | Keşlərin daha səmərəli istifadəsinə və bant genişliyinə qənaət etməyə imkan verən ETag middleware-i; məzmun dəyişməyibsə veb serverin response-nı təkrar göndərməsinin qarşısını alır. |
|
||||
| [expvar](https://github.com/gofiber/fiber/tree/master/middleware/expvar) | Expvar middleware, HTTP serverlərinin bəzi runtime dəyərlərini JSON formatında göstərir. |
|
||||
| [favicon](https://github.com/gofiber/fiber/tree/master/middleware/favicon) | Əgər faylın yolu (path) göstərilmişdirsə, artıq loglarda olan favicon-u yox sayıb onu saxlanan depodan götürür. |
|
||||
| [filesystem](https://github.com/gofiber/fiber/tree/master/middleware/filesystem) | Fiber üçün fayl sistem middleware-i. Alireza Salary-ə xüsusi təşəkkürlər. |
|
||||
| [limiter](https://github.com/gofiber/fiber/tree/master/middleware/limiter) | Fiber üçün rate limitləyən middleware. Açıq API-ə və ya şifrə yeniləmə kimi endpoint-ə yönəlik təkrarlanan request-in qarşısını alır. |
|
||||
| [logger](https://github.com/gofiber/fiber/tree/master/middleware/logger) | HTTP istək/cavab (request/response) logger-i. |
|
||||
| [monitor](https://github.com/gofiber/fiber/tree/master/middleware/monitor) | Monitor middleware-i serverin metriklərini report edər ("Express-status-monitor"-dan qaynaqlanıb). |
|
||||
| [pprof](https://github.com/gofiber/fiber/tree/master/middleware/pprof) | Matthew Lee-yə xüsusi təşəkkürlər \(@mthli\). |
|
||||
| [proxy](https://github.com/gofiber/fiber/tree/master/middleware/proxy) | Birdən çox server-ə proxy istəyi göndərməyiniz üçündür. |
|
||||
| [recover](https://github.com/gofiber/fiber/tree/master/middleware/recover) | Recover middleware-i stack chain-ni hər hansı bir yerindəki paniklərdən qurtulmasına kömək edir və kontrolu mərkəzləşdirilmiş [ErrorHandler-ə](https://docs.gofiber.io/guide/error-handling) ötürür.|
|
||||
| [requestid](https://github.com/gofiber/fiber/tree/master/middleware/requestid) | Hər request üçün ayrı request id yaradır. |
|
||||
| [session](https://github.com/gofiber/fiber/tree/master/middleware/session) | Session üçün middleware. Qeyd: Bu middleware Fiber-in öz storage struktrunu istifadə edir. |
|
||||
| [skip](https://github.com/gofiber/fiber/tree/master/middleware/skip) | Skip middleware-i verilən şərt true olduğu halda handler-i görməyərək üstündən ötüb keçir. |
|
||||
| [timeout](https://github.com/gofiber/fiber/tree/master/middleware/timeout) | Bir request üçün maksimum vaxt əlavə edir. Əgər arada fasilə yaranarsa, onda proses məhz ErrorHandler-ə göndərilərək icra edilir. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key giriş middleware-i, key əsaslı bir authentication metodudur. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Yönləndirmə üçün middleware. |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware-i verilən qanunlara əsasən URL yolunu (path) yenidən yazır. Geri dönüşün icrası üçün uyğunluq təşkil edən təsviri linklərin yaradılması üçün nəzərdə tutulmuşdur. |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Fiber request handler-dən net/http handler-ə çevirici. @arsmn-ə xüsusi təşəkkürlər! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Fərqli HTTP header istifadə edərək tətbiqi daha təhlükəsiz saxlamağa kömək edir. |
|
||||
|
||||
## 🧬 Xarici Middleware
|
||||
|
||||
[Fiber komandası](https://github.com/orgs/gofiber/people) tərəfindən dəstəklənən və inkişaf etdirilən middleware-in siyahısı.
|
||||
|
||||
| Middleware | Description |
|
||||
| :------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| [jwt](https://github.com/gofiber/jwt) | JWT, JSON Web Token(JWT) girişi qaytaran bir middleware-dir. |
|
||||
| [storage](https://github.com/gofiber/storage) | Fiber-in Storage arxitekturasını dəstəkləyən bir sıra storage driver verir. Bu sayədə storage-ə ehtiyac duyan Fiber middleware-də rahatlıqla istifadə oluna bilər. |
|
||||
| [template](https://github.com/gofiber/template) | Bu paket, Fiber `v1.10.x`, Go versiyası 1.13 və ya daha yuxarı olduqda istifadə oluna bilər. 8 template mühərriki var. |
|
||||
| [websocket](https://github.com/gofiber/websocket) | Yerlilərin dəstəyi ilə WebSocket-ə əsaslanan Fiber üçün Fasthttp. |
|
||||
|
||||
## 🕶️ Möhtəşəm Siyahı
|
||||
|
||||
Əlavə yazılar, middleware-lər, misallar, və alətlər üçün bizim [möhtəşəm siyahımıza](https://github.com/gofiber/awesome-fiber) göz atın.
|
||||
|
||||
## 👍 Dəstək Nümayişi
|
||||
|
||||
Əgər `Fiber`-ə dəstək olmaq və ya **təşəkkür etmək** istəyirsinizsə:
|
||||
|
||||
1. Layihəni [GitHub Ulduzu](https://github.com/gofiber/fiber/stargazers) ilə işarələyin.
|
||||
2. Layihə haqqında [şəxsi twitter hesabınızda](https://twitter.com/intent/tweet?text=Fiber%20is%20an%20Express%20inspired%20%23web%20%23framework%20built%20on%20top%20of%20Fasthttp%2C%20the%20fastest%20HTTP%20engine%20for%20%23Go.%20Designed%20to%20ease%20things%20up%20for%20%23fast%20development%20with%20zero%20memory%20allocation%20and%20%23performance%20in%20mind%20%F0%9F%9A%80%20https%3A%2F%2Fgithub.com%2Fgofiber%2Ffiber) paylaşın.
|
||||
3. [Medium](https://medium.com/), [Dev.to](https://dev.to/) və ya şəxsi bloqunuz üzərindən bir incələmə və ya tədris yönümlü bir yazı dərc edin.
|
||||
4. Bizim üçün, sadəcə bir [fincan kofe alın](https://buymeacoff.ee/fenny).
|
||||
|
||||
## ☕ "Bir fincan kofe almaq" məsələsi
|
||||
|
||||
Fiber açıq qaynaqlı bir layihə olduğu üçün, gəlirlərini yalnız ianələr vasitəsilə təmin edir və bu da domain adı, gitbook, netlify, serverless hosting xərcləri üçün istifadə olunur. Belə olduğu halda, Fiber-ə ən yaxşı dəstək elə bizim üçün ☕ [**bir kofe almaqdan gələ bilər**](https://buymeacoff.ee/fenny).
|
||||
|
||||
| | İstifadəçi | İanə |
|
||||
| :--------------------------------------------------------- | :----------------------------------------------- | :------- |
|
||||
| ![](https://avatars.githubusercontent.com/u/204341?s=25) | [@destari](https://github.com/destari) | ☕ x 10 |
|
||||
| ![](https://avatars.githubusercontent.com/u/63164982?s=25) | [@dembygenesis](https://github.com/dembygenesis) | ☕ x 5 |
|
||||
| ![](https://avatars.githubusercontent.com/u/56607882?s=25) | [@thomasvvugt](https://github.com/thomasvvugt) | ☕ x 5 |
|
||||
| ![](https://avatars.githubusercontent.com/u/27820675?s=25) | [@hendratommy](https://github.com/hendratommy) | ☕ x 5 |
|
||||
| ![](https://avatars.githubusercontent.com/u/1094221?s=25) | [@ekaputra07](https://github.com/ekaputra07) | ☕ x 5 |
|
||||
| ![](https://avatars.githubusercontent.com/u/194590?s=25) | [@jorgefuertes](https://github.com/jorgefuertes) | ☕ x 5 |
|
||||
| ![](https://avatars.githubusercontent.com/u/186637?s=25) | [@candidosales](https://github.com/candidosales) | ☕ x 5 |
|
||||
| ![](https://avatars.githubusercontent.com/u/29659953?s=25) | [@l0nax](https://github.com/l0nax) | ☕ x 3 |
|
||||
| ![](https://avatars.githubusercontent.com/u/635852?s=25) | [@bihe](https://github.com/bihe) | ☕ x 3 |
|
||||
| ![](https://avatars.githubusercontent.com/u/307334?s=25) | [@justdave](https://github.com/justdave) | ☕ x 3 |
|
||||
| ![](https://avatars.githubusercontent.com/u/11155743?s=25) | [@koddr](https://github.com/koddr) | ☕ x 1 |
|
||||
| ![](https://avatars.githubusercontent.com/u/29042462?s=25) | [@lapolinar](https://github.com/lapolinar) | ☕ x 1 |
|
||||
| ![](https://avatars.githubusercontent.com/u/2978730?s=25) | [@diegowifi](https://github.com/diegowifi) | ☕ x 1 |
|
||||
| ![](https://avatars.githubusercontent.com/u/44171355?s=25) | [@ssimk0](https://github.com/ssimk0) | ☕ x 1 |
|
||||
| ![](https://avatars.githubusercontent.com/u/5638101?s=25) | [@raymayemir](https://github.com/raymayemir) | ☕ x 1 |
|
||||
| ![](https://avatars.githubusercontent.com/u/619996?s=25) | [@melkorm](https://github.com/melkorm) | ☕ x 1 |
|
||||
| ![](https://avatars.githubusercontent.com/u/31022056?s=25) | [@marvinjwendt](https://github.com/marvinjwendt) | ☕ x 1 |
|
||||
| ![](https://avatars.githubusercontent.com/u/31921460?s=25) | [@toishy](https://github.com/toishy) | ☕ x 1 |
|
||||
|
||||
## 💻 Koda Töhfə Verənlər
|
||||
|
||||
<img src="https://opencollective.com/fiber/contributors.svg?width=890&button=false" alt="Code Contributors" style="max-width:100%;">
|
||||
|
||||
## ⭐️ Layihəni Ulduzlayanlar
|
||||
|
||||
<img src="https://starchart.cc/gofiber/fiber.svg" alt="Stargazers over time" style="max-width: 100%">
|
||||
|
||||
## ⚠️ Lisenziya Haqqında
|
||||
|
||||
Müəllif Hüququ (c) 2019-bugün [Fenny](https://github.com/fenny) və [Contributors](https://github.com/gofiber/fiber/graphs/contributors). `Fiber` pulsuz və açıq qaynaqlı bir proqram təminatıdır və [MIT License](https://github.com/gofiber/fiber/blob/master/LICENSE) altında lisenziyalaşmışdır. Rəsmi loqo [Vic Shóstak](https://github.com/koddr) tərəfindən yaradılmış və [Creative Commons](https://creativecommons.org/licenses/by-sa/4.0/) lisenziyası altında paylanmışdır (CC BY-SA 4.0 International).
|
||||
|
||||
**Üçüncü Tərəf Kitabxana Lisenziyaları**
|
||||
|
||||
- [colorable](https://github.com/mattn/go-colorable/blob/master/LICENSE)
|
||||
- [isatty](https://github.com/mattn/go-isatty/blob/master/LICENSE)
|
||||
- [runewidth](https://github.com/mattn/go-runewidth/blob/master/LICENSE)
|
||||
- [fasthttp](https://github.com/valyala/fasthttp/blob/master/LICENSE)
|
||||
- [bytebufferpool](https://github.com/valyala/bytebufferpool/blob/master/LICENSE)
|
||||
- [fwd](https://github.com/philhofer/fwd/blob/master/LICENSE.md)
|
||||
- [go-ole](https://github.com/go-ole/go-ole/blob/master/LICENSE)
|
||||
- [gopsutil](https://github.com/shirou/gopsutil/blob/master/LICENSE)
|
||||
- [msgp](https://github.com/tinylib/msgp/blob/master/LICENSE)
|
||||
- [schema](https://github.com/gorilla/schema/blob/master/LICENSE)
|
||||
- [uuid](https://github.com/google/uuid/blob/master/LICENSE)
|
||||
- [wmi](https://github.com/StackExchange/wmi/blob/master/LICENSE)
|
31
.github/README_ckb.md
vendored
31
.github/README_ckb.md
vendored
@ -1,6 +1,11 @@
|
||||
<p align="center">
|
||||
<a href="https://gofiber.io">
|
||||
<img alt="Fiber" height="125" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
|
||||
<picture>
|
||||
<source height="125" media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo-dark.svg">
|
||||
<img height="125" alt="Fiber" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
</picture>
|
||||
|
||||
</a>
|
||||
<br>
|
||||
<!-- base64 flags are available at https://www.phoca.cz/cssflags/ -->
|
||||
@ -58,6 +63,9 @@
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_uk.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/UK-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDU1LjIgMzguNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTUuMiAzOC40IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwhW0NEQVRBWwoJLnN0MHtmaWxsOiNGRkQ1MDA7fQoJLnN0MXtmaWxsOiMwMDVCQkI7fQpdXT48L3N0eWxlPjxnPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0zLjAzLDBoNDkuMTNjMS42NywwLDMuMDMsMS4zNiwzLjAzLDMuMDN2MzIuMzNjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3IFYzLjAzQzAsMS4zNiwxLjM3LDAsMy4wMywwTDMuMDMsMHoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMCwxOS4yaDU1LjJ2MTYuMTdjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3VjE5LjJMMCwxOS4yeiIvPjwvZz48L3N2Zz4=">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_az.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/AZ-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI2MDAiPg0KPHJlY3Qgd2lkdGg9IjEyMDAiIGhlaWdodD0iNjAwIiBmaWxsPSIjNTA5ZTJmIi8+DQo8cmVjdCB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI0MDAiIGZpbGw9IiNlZjMzNDAiLz4NCjxyZWN0IHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0iIzAwYjVlMiIvPg0KPGNpcmNsZSBjeD0iNTcwIiBjeT0iMzAwIiByPSI5MCIgZmlsbD0iI2ZmZiIvPg0KPGNpcmNsZSBjeD0iNTkwIiBjeT0iMzAwIiByPSI3NSIgZmlsbD0iI2VmMzM0MCIvPg0KPHBhdGggZD0iTTY3MCAyNTBsOS41NjcgMjYuOTAzIDI1Ljc4OC0xMi4yNTgtMTIuMjU4IDI1Ljc4OEw3MjAgMzAwbC0yNi45MDMgOS41NjcgMTIuMjU4IDI1Ljc4OC0yNS43ODgtMTIuMjU4TDY3MCAzNTBsLTkuNTY3LTI2LjkwMy0yNS43ODggMTIuMjU4IDEyLjI1OC0yNS43ODhMNjIwIDMwMGwyNi45MDMtOS41NjctMTIuMjU4LTI1Ljc4OCAyNS43ODggMTIuMjU4eiIgZmlsbD0iI2ZmZiIvPg0KPC9zdmc+">
|
||||
</a>
|
||||
<br>
|
||||
<a href="https://pkg.go.dev/github.com/gofiber/fiber/v3#pkg-overview">
|
||||
<img src="https://img.shields.io/badge/%F0%9F%93%9A%20godoc-pkg-00ACD7.svg?color=00ACD7&style=flat-square">
|
||||
@ -114,7 +122,7 @@ func main() {
|
||||
|
||||
## ⚙️ دامەزراندن
|
||||
|
||||
دڵنیا بە لەوەی کە لەناو ئامێرەکەت Go دامەزراوە ([دای بگرە](https://go.dev/dl/)). دەبێت وەشانەکەشی `1.16` یان سەرووتر بێت.
|
||||
دڵنیا بە لەوەی کە لەناو ئامێرەکەت Go دامەزراوە ([دای بگرە](https://go.dev/dl/)). دەبێت وەشانەکەشی `1.17` یان سەرووتر بێت.
|
||||
|
||||
پڕۆژەکەت دەست پێ بکە بە دروستکردنی بوخچەیەک و کار پێ کردنی فەرمانی `go mod init github.com/your/repo` ([زیاتر](https://go.dev/blog/using-go-modules)) لەناو بوخچەکە. دواتریش بەم فەرمانەی خوارەوە فایبەر دامەزرێنە:
|
||||
|
||||
@ -124,12 +132,12 @@ go get -u github.com/gofiber/fiber/v3
|
||||
|
||||
## 🎯 تایبەتمەندییەکان
|
||||
|
||||
- [ناونیشانی ئاڵۆز](https://docs.gofiber.io/routing)
|
||||
- [ناونیشانی ئاڵۆز](https://docs.gofiber.io/guide/routing)
|
||||
- [فایلی جێگیر](https://docs.gofiber.io/api/app#static)
|
||||
- [خێراییەکی](https://docs.gofiber.io/extra/benchmarks) بێوێنە
|
||||
- بەکارهێنانی [میمۆریی کەم](https://docs.gofiber.io/extra/benchmarks)
|
||||
- توانای هەبوونی لقی [API](https://docs.gofiber.io/api/ctx)
|
||||
- پشتگیریی [Middleware](https://docs.gofiber.io/middleware) و [Next](https://docs.gofiber.io/api/ctx#next) وەک Express
|
||||
- پشتگیریی [Middleware](https://docs.gofiber.io/category/-middleware) و [Next](https://docs.gofiber.io/api/ctx#next) وەک Express
|
||||
- پڕۆگرامکردنی [خێرا](https://dev.to/koddr/welcome-to-fiber-an-express-js-styled-fastest-web-framework-written-with-on-golang-497)ی ڕاژە
|
||||
- [داڕێژە](https://github.com/gofiber/template)
|
||||
- پشتگیریی [WebSocket](https://github.com/gofiber/websocket)
|
||||
@ -439,7 +447,7 @@ func main() {
|
||||
|
||||
### وەڵامی JSON
|
||||
|
||||
📖 [JSON](https://docs.gofiber.io/ctx#json)
|
||||
📖 [JSON](https://docs.gofiber.io/api/ctx#json)
|
||||
|
||||
```go
|
||||
type User struct {
|
||||
@ -581,7 +589,7 @@ func main() {
|
||||
app := fiber.New(fiber.Config{
|
||||
EnableTrustedProxyCheck: true,
|
||||
TrustedProxies: []string{"0.0.0.0", "1.1.1.1/30"}, // IP address or IP address range
|
||||
ProxyHeader: fiber.HeaderXForwardedFor},
|
||||
ProxyHeader: fiber.HeaderXForwardedFor,
|
||||
})
|
||||
|
||||
// ...
|
||||
@ -619,6 +627,11 @@ func main() {
|
||||
| [session](https://github.com/gofiber/fiber/tree/master/middleware/session) | Session middleware. NOTE: This middleware uses our Storage package. |
|
||||
| [skip](https://github.com/gofiber/fiber/tree/master/middleware/skip) | Skip middleware that skips a wrapped handler is a predicate is true. |
|
||||
| [timeout](https://github.com/gofiber/fiber/tree/master/middleware/timeout) | Adds a max time for a request and forwards to ErrorHandler if it is exceeded. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth middleware provides a key based authentication. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Redirect middleware |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware rewrites the URL path based on provided rules. It can be helpful for backward compatibility or just creating cleaner and more descriptive links. |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converter for net/http handlers to/from Fiber request handlers, special thanks to @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Helps secure your apps by setting various HTTP headers. |
|
||||
|
||||
## 🧬 کاڵا دەرەکییەکان
|
||||
|
||||
@ -626,12 +639,7 @@ func main() {
|
||||
|
||||
| کاڵا | دەربارە |
|
||||
| :------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converter for net/http handlers to/from Fiber request handlers, special thanks to @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Helps secure your apps by setting various HTTP headers. |
|
||||
| [jwt](https://github.com/gofiber/jwt) | JWT returns a JSON Web Token \(JWT\) auth middleware. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth middleware provides a key based authentication. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Redirect middleware |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware rewrites the URL path based on provided rules. It can be helpful for backward compatibility or just creating cleaner and more descriptive links. |
|
||||
| [storage](https://github.com/gofiber/storage) | Premade storage drivers that implement the Storage interface, designed to be used with various Fiber middlewares. |
|
||||
| [template](https://github.com/gofiber/template) | This package contains 8 template engines that can be used with Fiber `v1.10.x` Go version 1.13 or higher is required. |
|
||||
| [websocket](https://github.com/gofiber/websocket) | Based on Fasthttp WebSocket for Fiber with Locals support! |
|
||||
@ -693,7 +701,6 @@ For more articles, middlewares, examples or tools check our [awesome list](https
|
||||
- [runewidth](https://github.com/mattn/go-runewidth/blob/master/LICENSE)
|
||||
- [fasthttp](https://github.com/valyala/fasthttp/blob/master/LICENSE)
|
||||
- [bytebufferpool](https://github.com/valyala/bytebufferpool/blob/master/LICENSE)
|
||||
- [dictpool](https://github.com/savsgio/dictpool/blob/master/LICENSE)
|
||||
- [fwd](https://github.com/philhofer/fwd/blob/master/LICENSE.md)
|
||||
- [go-ole](https://github.com/go-ole/go-ole/blob/master/LICENSE)
|
||||
- [gopsutil](https://github.com/shirou/gopsutil/blob/master/LICENSE)
|
||||
|
31
.github/README_de.md
vendored
31
.github/README_de.md
vendored
@ -1,6 +1,11 @@
|
||||
<p align="center">
|
||||
<a href="https://gofiber.io">
|
||||
<img alt="Fiber" height="125" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
|
||||
<picture>
|
||||
<source height="125" media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo-dark.svg">
|
||||
<img height="125" alt="Fiber" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
</picture>
|
||||
|
||||
</a>
|
||||
<br>
|
||||
<!-- base64 flags are available at https://www.phoca.cz/cssflags/ -->
|
||||
@ -58,6 +63,9 @@
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_uk.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/UK-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDU1LjIgMzguNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTUuMiAzOC40IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwhW0NEQVRBWwoJLnN0MHtmaWxsOiNGRkQ1MDA7fQoJLnN0MXtmaWxsOiMwMDVCQkI7fQpdXT48L3N0eWxlPjxnPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0zLjAzLDBoNDkuMTNjMS42NywwLDMuMDMsMS4zNiwzLjAzLDMuMDN2MzIuMzNjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3IFYzLjAzQzAsMS4zNiwxLjM3LDAsMy4wMywwTDMuMDMsMHoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMCwxOS4yaDU1LjJ2MTYuMTdjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3VjE5LjJMMCwxOS4yeiIvPjwvZz48L3N2Zz4=">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_az.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/AZ-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI2MDAiPg0KPHJlY3Qgd2lkdGg9IjEyMDAiIGhlaWdodD0iNjAwIiBmaWxsPSIjNTA5ZTJmIi8+DQo8cmVjdCB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI0MDAiIGZpbGw9IiNlZjMzNDAiLz4NCjxyZWN0IHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0iIzAwYjVlMiIvPg0KPGNpcmNsZSBjeD0iNTcwIiBjeT0iMzAwIiByPSI5MCIgZmlsbD0iI2ZmZiIvPg0KPGNpcmNsZSBjeD0iNTkwIiBjeT0iMzAwIiByPSI3NSIgZmlsbD0iI2VmMzM0MCIvPg0KPHBhdGggZD0iTTY3MCAyNTBsOS41NjcgMjYuOTAzIDI1Ljc4OC0xMi4yNTgtMTIuMjU4IDI1Ljc4OEw3MjAgMzAwbC0yNi45MDMgOS41NjcgMTIuMjU4IDI1Ljc4OC0yNS43ODgtMTIuMjU4TDY3MCAzNTBsLTkuNTY3LTI2LjkwMy0yNS43ODggMTIuMjU4IDEyLjI1OC0yNS43ODhMNjIwIDMwMGwyNi45MDMtOS41NjctMTIuMjU4LTI1Ljc4OCAyNS43ODggMTIuMjU4eiIgZmlsbD0iI2ZmZiIvPg0KPC9zdmc+">
|
||||
</a>
|
||||
<br>
|
||||
<a href="https://pkg.go.dev/github.com/gofiber/fiber/v3#pkg-overview">
|
||||
<img src="https://img.shields.io/badge/%F0%9F%93%9A%20godoc-pkg-00ACD7.svg?color=00ACD7&style=flat-square">
|
||||
@ -114,7 +122,7 @@ Diese Tests wurden von [TechEmpower](https://www.techempower.com/benchmarks/#sec
|
||||
|
||||
## ⚙️ Installation
|
||||
|
||||
Stelle sicher, dass du Go installiert hast ([Download hier](https://go.dev/dl/)). Version `1.16` oder neuer wird zu der Nutzung Fibers benötigt.
|
||||
Stelle sicher, dass du Go installiert hast ([Download hier](https://go.dev/dl/)). Version `1.17` oder neuer wird zu der Nutzung Fibers benötigt.
|
||||
|
||||
Erstelle ein neues Project, indem du zunächst einen neuen Ordner erstellst und dort in diesem Ordner `go mod init github.com/dein/repo` ausführst ([hier mehr dazu](https://go.dev/blog/using-go-modules)). Daraufhin kannst du Fiber mit dem [`go get`](https://pkg.go.dev/cmd/go/#hdr-Add_dependencies_to_current_module_and_install_them) Kommandozeilenbefehl installieren:
|
||||
|
||||
@ -124,12 +132,12 @@ go get -u github.com/gofiber/fiber/v3
|
||||
|
||||
## 🎯 Eigenschaften
|
||||
|
||||
- Robustes [Routing](https://docs.gofiber.io/routing)
|
||||
- Robustes [Routing](https://docs.gofiber.io/guide/routing)
|
||||
- Bereitstellen von [statischen Dateien](https://docs.gofiber.io/api/app#static)
|
||||
- Extreme [Performance](https://docs.gofiber.io/extra/benchmarks)
|
||||
- [Geringe Arbeitsspeichernutzung](https://docs.gofiber.io/extra/benchmarks)
|
||||
- Express [API Endpunkte](https://docs.gofiber.io/api/ctx)
|
||||
- [Middleware](https://docs.gofiber.io/middleware) & [Next](https://docs.gofiber.io/api/ctx#next) Support
|
||||
- [Middleware](https://docs.gofiber.io/category/-middleware) & [Next](https://docs.gofiber.io/api/ctx#next) Support
|
||||
- [Schnelle](https://dev.to/koddr/welcome-to-fiber-an-express-js-styled-fastest-web-framework-written-with-on-golang-497) serverseitige Programmierung
|
||||
- [Template engines](https://github.com/gofiber/template)
|
||||
- [WebSocket support](https://github.com/gofiber/websocket)
|
||||
@ -145,7 +153,7 @@ Neue Gopher, welche von [Node.js](https://nodejs.org/en/about/) zu [Go](https://
|
||||
Fiber ist **inspiriert** von Express.js, dem beliebtesten Web-Framework im Internet. Wir haben die **Leichtigkeit** von Express und die **Rohleistung** von Go kombiniert. Wenn du jemals eine Webanwendung mit Node.js implementiert hast (_mit Express.js oder ähnlichem_), werden dir viele Methoden und Prinzipien **sehr vertraut** vorkommen.
|
||||
|
||||
## ⚠️ Limitations
|
||||
* Due to Fiber's usage of unsafe, the library may not always be compatible with the latest Go version. Fiber 2.40.0 has been tested with Go versions 1.16 to 1.20.
|
||||
* Due to Fiber's usage of unsafe, the library may not always be compatible with the latest Go version. Fiber 2.40.0 has been tested with Go versions 1.17 to 1.20.
|
||||
* Fiber is not compatible with net/http interfaces. This means you will not be able to use projects like gqlgen, go-swagger, or any others which are part of the net/http ecosystem.
|
||||
|
||||
## 👀 Beispiele
|
||||
@ -434,7 +442,7 @@ func main() {
|
||||
|
||||
### JSON Response
|
||||
|
||||
📖 [JSON](https://docs.gofiber.io/ctx#json)
|
||||
📖 [JSON](https://docs.gofiber.io/api/ctx#json)
|
||||
|
||||
```go
|
||||
type User struct {
|
||||
@ -589,6 +597,11 @@ Hier finden Sie eine Liste der Middleware, die im Fiber-Framework enthalten ist.
|
||||
| [session](https://github.com/gofiber/fiber/tree/master/middleware/session) | Session middleware. NOTE: This middleware uses our Storage package. |
|
||||
| [skip](https://github.com/gofiber/fiber/tree/master/middleware/skip) | Skip middleware that skips a wrapped handler is a predicate is true. |
|
||||
| [timeout](https://github.com/gofiber/fiber/tree/master/middleware/timeout) | Adds a max time for a request and forwards to ErrorHandler if it is exceeded. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth middleware provides a key based authentication. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Redirect middleware |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware rewrites the URL path based on provided rules. It can be helpful for backward compatibility or just creating cleaner and more descriptive links. |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converter for net/http handlers to/from Fiber request handlers, special thanks to @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Helps secure your apps by setting various HTTP headers. |
|
||||
|
||||
## 🧬 External Middleware
|
||||
|
||||
@ -596,12 +609,7 @@ Liste der extern gehosteten Middleware-Module, die vom [Fiber team](https://gith
|
||||
|
||||
| Middleware | Description |
|
||||
| :------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converter for net/http handlers to/from Fiber request handlers, special thanks to @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Helps secure your apps by setting various HTTP headers. |
|
||||
| [jwt](https://github.com/gofiber/jwt) | JWT returns a JSON Web Token \(JWT\) auth middleware. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth middleware provides a key based authentication. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Redirect middleware |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware rewrites the URL path based on provided rules. It can be helpful for backward compatibility or just creating cleaner and more descriptive links. |
|
||||
| [storage](https://github.com/gofiber/storage) | Premade storage drivers that implement the Storage interface, designed to be used with various Fiber middlewares. || [storage](https://github.com/gofiber/storage) | Premade storage drivers that implement the Storage interface, designed to be used with various Fiber middlewares. |
|
||||
| [template](https://github.com/gofiber/template) | This package contains 8 template engines that can be used with Fiber `v1.10.x` Go version 1.13 or higher is required. |
|
||||
| [websocket](https://github.com/gofiber/websocket) | Based on Fasthttp WebSocket for Fiber with Locals support! |
|
||||
@ -663,7 +671,6 @@ Copyright (c) 2019-present [Fenny](https://github.com/fenny) and [Contributors](
|
||||
- [runewidth](https://github.com/mattn/go-runewidth/blob/master/LICENSE)
|
||||
- [fasthttp](https://github.com/valyala/fasthttp/blob/master/LICENSE)
|
||||
- [bytebufferpool](https://github.com/valyala/bytebufferpool/blob/master/LICENSE)
|
||||
- [dictpool](https://github.com/savsgio/dictpool/blob/master/LICENSE)
|
||||
- [fwd](https://github.com/philhofer/fwd/blob/master/LICENSE.md)
|
||||
- [go-ole](https://github.com/go-ole/go-ole/blob/master/LICENSE)
|
||||
- [gopsutil](https://github.com/shirou/gopsutil/blob/master/LICENSE)
|
||||
|
29
.github/README_es.md
vendored
29
.github/README_es.md
vendored
@ -1,6 +1,11 @@
|
||||
<p align="center">
|
||||
<a href="https://gofiber.io">
|
||||
<img alt="Fiber" height="125" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
|
||||
<picture>
|
||||
<source height="125" media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo-dark.svg">
|
||||
<img height="125" alt="Fiber" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
</picture>
|
||||
|
||||
</a>
|
||||
<br>
|
||||
<!-- base64 flags are available at https://www.phoca.cz/cssflags/ -->
|
||||
@ -58,6 +63,9 @@
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_uk.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/UK-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDU1LjIgMzguNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTUuMiAzOC40IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwhW0NEQVRBWwoJLnN0MHtmaWxsOiNGRkQ1MDA7fQoJLnN0MXtmaWxsOiMwMDVCQkI7fQpdXT48L3N0eWxlPjxnPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0zLjAzLDBoNDkuMTNjMS42NywwLDMuMDMsMS4zNiwzLjAzLDMuMDN2MzIuMzNjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3IFYzLjAzQzAsMS4zNiwxLjM3LDAsMy4wMywwTDMuMDMsMHoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMCwxOS4yaDU1LjJ2MTYuMTdjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3VjE5LjJMMCwxOS4yeiIvPjwvZz48L3N2Zz4=">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_az.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/AZ-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI2MDAiPg0KPHJlY3Qgd2lkdGg9IjEyMDAiIGhlaWdodD0iNjAwIiBmaWxsPSIjNTA5ZTJmIi8+DQo8cmVjdCB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI0MDAiIGZpbGw9IiNlZjMzNDAiLz4NCjxyZWN0IHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0iIzAwYjVlMiIvPg0KPGNpcmNsZSBjeD0iNTcwIiBjeT0iMzAwIiByPSI5MCIgZmlsbD0iI2ZmZiIvPg0KPGNpcmNsZSBjeD0iNTkwIiBjeT0iMzAwIiByPSI3NSIgZmlsbD0iI2VmMzM0MCIvPg0KPHBhdGggZD0iTTY3MCAyNTBsOS41NjcgMjYuOTAzIDI1Ljc4OC0xMi4yNTgtMTIuMjU4IDI1Ljc4OEw3MjAgMzAwbC0yNi45MDMgOS41NjcgMTIuMjU4IDI1Ljc4OC0yNS43ODgtMTIuMjU4TDY3MCAzNTBsLTkuNTY3LTI2LjkwMy0yNS43ODggMTIuMjU4IDEyLjI1OC0yNS43ODhMNjIwIDMwMGwyNi45MDMtOS41NjctMTIuMjU4LTI1Ljc4OCAyNS43ODggMTIuMjU4eiIgZmlsbD0iI2ZmZiIvPg0KPC9zdmc+">
|
||||
</a>
|
||||
<br>
|
||||
<a href="https://pkg.go.dev/github.com/gofiber/fiber/v3#pkg-overview">
|
||||
<img src="https://img.shields.io/badge/%F0%9F%93%9A%20godoc-pkg-00ACD7.svg?color=00ACD7&style=flat-square">
|
||||
@ -114,7 +122,7 @@ Estas pruebas son realizadas por [TechEmpower](https://www.techempower.com/bench
|
||||
|
||||
## ⚙️ Instalación
|
||||
|
||||
Asegúrese de tener instalado Go ([descargar](https://go.dev/dl/)). Versión `1.16` o superior.
|
||||
Asegúrese de tener instalado Go ([descargar](https://go.dev/dl/)). Versión `1.17` o superior.
|
||||
|
||||
Arranque su proyecto creando una nueva carpeta y ejecutando `go mod init github.com/your/repo` ([mas información](https://go.dev/blog/using-go-modules)) dentro del mismo directorio. Después instale Fiber mediante el comando [`go get`](https://pkg.go.dev/cmd/go/#hdr-Add_dependencies_to_current_module_and_install_them):
|
||||
|
||||
@ -124,7 +132,7 @@ go get -u github.com/gofiber/fiber/v3
|
||||
|
||||
## 🎯 Características
|
||||
|
||||
- [Enrutamiento](https://docs.gofiber.io/routing) robusto
|
||||
- [Enrutamiento](https://docs.gofiber.io/guide/routing) robusto
|
||||
- Servir [archivos estáticos](https://docs.gofiber.io/api/app#static)
|
||||
- [Rendimiento](https://docs.gofiber.io/extra/benchmarks) extremo
|
||||
- [Bajo](https://docs.gofiber.io/extra/benchmarks) uso de [memoria](https://docs.gofiber.io/extra/benchmarks)
|
||||
@ -145,7 +153,7 @@ Los nuevos gophers que hacen el cambio de [Node.js](https://nodejs.org/en/about/
|
||||
Fiber está **inspirado** en Expressjs, el framework web más popular en Internet. Combinamos la **facilidad** de Express y **el rendimiento bruto** de Go. Si alguna vez ha implementado una aplicación web en Node.js ( _utilizando Express.js o similar_ ), muchos métodos y principios le parecerán **muy comunes** .
|
||||
|
||||
## ⚠️ Limitantes
|
||||
* Debido a que Fiber utiliza unsafe, la biblioteca no siempre será compatible con la última versión de Go. Fiber 2.40.0 ha sido probado con las versiones de Go 1.16 a 1.20.
|
||||
* Debido a que Fiber utiliza unsafe, la biblioteca no siempre será compatible con la última versión de Go. Fiber 2.40.0 ha sido probado con las versiones de Go 1.17 a 1.20.
|
||||
* Fiber no es compatible con interfaces net/http. Esto significa que no lo podrá usar en proyectos como qglgen, go-swagger, u otros que son parte del ecosistema net/http.
|
||||
|
||||
## 👀 Ejemplos
|
||||
@ -434,7 +442,7 @@ func main() {
|
||||
|
||||
### Respuesta JSON
|
||||
|
||||
📖 [JSON](https://docs.gofiber.io/ctx#json)
|
||||
📖 [JSON](https://docs.gofiber.io/api/ctx#json)
|
||||
|
||||
```go
|
||||
type User struct {
|
||||
@ -589,6 +597,11 @@ Aquí está una lista del middleware incluido en el marco web Fiber.
|
||||
| [session](https://github.com/gofiber/fiber/tree/master/middleware/session) | Session middleware. NOTE: This middleware uses our Storage package. |
|
||||
| [skip](https://github.com/gofiber/fiber/tree/master/middleware/skip) | Skip middleware that skips a wrapped handler is a predicate is true. |
|
||||
| [timeout](https://github.com/gofiber/fiber/tree/master/middleware/timeout) | Adds a max time for a request and forwards to ErrorHandler if it is exceeded. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth middleware provides a key based authentication. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Redirect middleware |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware rewrites the URL path based on provided rules. It can be helpful for backward compatibility or just creating cleaner and more descriptive links. |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converter for net/http handlers to/from Fiber request handlers, special thanks to @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Helps secure your apps by setting various HTTP headers. |
|
||||
|
||||
## 🧬 Middleware Externo
|
||||
|
||||
@ -596,12 +609,7 @@ Lista de módulos de middleware alojados externamente, y mantenidos por el [equi
|
||||
|
||||
| Middleware | Descripción |
|
||||
| :------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converter for net/http handlers to/from Fiber request handlers, special thanks to @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Helps secure your apps by setting various HTTP headers. |
|
||||
| [jwt](https://github.com/gofiber/jwt) | JWT returns a JSON Web Token \(JWT\) auth middleware. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth middleware provides a key based authentication. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Redirect middleware |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware rewrites the URL path based on provided rules. It can be helpful for backward compatibility or just creating cleaner and more descriptive links. |
|
||||
| [storage](https://github.com/gofiber/storage) | Premade storage drivers that implement the Storage interface, designed to be used with various Fiber middlewares. |
|
||||
| [template](https://github.com/gofiber/template) | This package contains 8 template engines that can be used with Fiber `v1.10.x` Go version 1.13 or higher is required. |
|
||||
| [websocket](https://github.com/gofiber/websocket) | Based on Fasthttp WebSocket for Fiber with Locals support! |
|
||||
@ -663,7 +671,6 @@ Copyright (c) 2019-presente [Fenny](https://github.com/fenny) y [contribuyentes]
|
||||
- [runewidth](https://github.com/mattn/go-runewidth/blob/master/LICENSE)
|
||||
- [fasthttp](https://github.com/valyala/fasthttp/blob/master/LICENSE)
|
||||
- [bytebufferpool](https://github.com/valyala/bytebufferpool/blob/master/LICENSE)
|
||||
- [dictpool](https://github.com/savsgio/dictpool/blob/master/LICENSE)
|
||||
- [fwd](https://github.com/philhofer/fwd/blob/master/LICENSE.md)
|
||||
- [go-ole](https://github.com/go-ole/go-ole/blob/master/LICENSE)
|
||||
- [gopsutil](https://github.com/shirou/gopsutil/blob/master/LICENSE)
|
||||
|
55
.github/README_fa.md
vendored
55
.github/README_fa.md
vendored
@ -1,6 +1,11 @@
|
||||
<p align="center">
|
||||
<a href="https://gofiber.io">
|
||||
<img alt="Fiber" height="125" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
|
||||
<picture>
|
||||
<source height="125" media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo-dark.svg">
|
||||
<img height="125" alt="Fiber" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
</picture>
|
||||
|
||||
</a>
|
||||
<br>
|
||||
<!-- base64 flags are available at https://www.phoca.cz/cssflags/ -->
|
||||
@ -58,6 +63,9 @@
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_uk.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/UK-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDU1LjIgMzguNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTUuMiAzOC40IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwhW0NEQVRBWwoJLnN0MHtmaWxsOiNGRkQ1MDA7fQoJLnN0MXtmaWxsOiMwMDVCQkI7fQpdXT48L3N0eWxlPjxnPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0zLjAzLDBoNDkuMTNjMS42NywwLDMuMDMsMS4zNiwzLjAzLDMuMDN2MzIuMzNjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3IFYzLjAzQzAsMS4zNiwxLjM3LDAsMy4wMywwTDMuMDMsMHoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMCwxOS4yaDU1LjJ2MTYuMTdjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3VjE5LjJMMCwxOS4yeiIvPjwvZz48L3N2Zz4=">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_az.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/AZ-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI2MDAiPg0KPHJlY3Qgd2lkdGg9IjEyMDAiIGhlaWdodD0iNjAwIiBmaWxsPSIjNTA5ZTJmIi8+DQo8cmVjdCB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI0MDAiIGZpbGw9IiNlZjMzNDAiLz4NCjxyZWN0IHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0iIzAwYjVlMiIvPg0KPGNpcmNsZSBjeD0iNTcwIiBjeT0iMzAwIiByPSI5MCIgZmlsbD0iI2ZmZiIvPg0KPGNpcmNsZSBjeD0iNTkwIiBjeT0iMzAwIiByPSI3NSIgZmlsbD0iI2VmMzM0MCIvPg0KPHBhdGggZD0iTTY3MCAyNTBsOS41NjcgMjYuOTAzIDI1Ljc4OC0xMi4yNTgtMTIuMjU4IDI1Ljc4OEw3MjAgMzAwbC0yNi45MDMgOS41NjcgMTIuMjU4IDI1Ljc4OC0yNS43ODgtMTIuMjU4TDY3MCAzNTBsLTkuNTY3LTI2LjkwMy0yNS43ODggMTIuMjU4IDEyLjI1OC0yNS43ODhMNjIwIDMwMGwyNi45MDMtOS41NjctMTIuMjU4LTI1Ljc4OCAyNS43ODggMTIuMjU4eiIgZmlsbD0iI2ZmZiIvPg0KPC9zdmc+">
|
||||
</a>
|
||||
<br>
|
||||
<a href="https://pkg.go.dev/github.com/gofiber/fiber/v3#pkg-overview">
|
||||
<img src="https://img.shields.io/badge/%F0%9F%93%9A%20godoc-pkg-00ACD7.svg?color=00ACD7&style=flat-square">
|
||||
@ -133,7 +141,7 @@ func main() {
|
||||
<br>
|
||||
<p align="center">
|
||||
<div dir="rtl">
|
||||
مطمئن شوید Go را نصب (<a href="https://go.dev/dl/">دانلود</a>) کرده اید. نسخه 1.16 یا بیشتر مورد نیاز است.<br>
|
||||
مطمئن شوید Go را نصب (<a href="https://go.dev/dl/">دانلود</a>) کرده اید. نسخه 1.17 یا بیشتر مورد نیاز است.<br>
|
||||
پروژه خود را با ساختن یک پوشه و سپس اجرای <code>go mod init github.com/your/repo</code> داخل پوشه (<a href="https://go.dev/blog/using-go-modules">یادگیری بیشتر</a>) راه اندازی کنید. سپس Fiber را با دستور <code><a href="https://pkg.go.dev/cmd/go/#hdr-Add_dependencies_to_current_module_and_install_them">go get</a></code> نصب کنید :
|
||||
<div dir="rtl">
|
||||
<br>
|
||||
@ -153,12 +161,12 @@ go get -u github.com/gofiber/fiber/v3
|
||||
|
||||
</br>
|
||||
|
||||
- [مسیریابی](https://docs.gofiber.io/routing) قدرتمند
|
||||
- [مسیریابی](https://docs.gofiber.io/guide/routing) قدرتمند
|
||||
- Serve [پرونده های ثابت](https://docs.gofiber.io/api/app#static)
|
||||
- حداکثر [عملکرد](https://docs.gofiber.io/extra/benchmarks)
|
||||
- مصرف [حافظه کم](https://docs.gofiber.io/extra/benchmarks)
|
||||
- قابلیت [API endpoints](https://docs.gofiber.io/api/ctx)
|
||||
- پشتیبانی از [Middleware](https://docs.gofiber.io/middleware) & [Next](https://docs.gofiber.io/api/ctx#next)
|
||||
- پشتیبانی از [Middleware](https://docs.gofiber.io/category/-middleware) & [Next](https://docs.gofiber.io/api/ctx#next)
|
||||
- برنامه نویسی سمت سرور [سریع](https://dev.to/koddr/welcome-to-fiber-an-express-js-styled-fastest-web-framework-written-with-on-golang-497)
|
||||
- دارای [Template engines](https://github.com/gofiber/template) اختصاصی
|
||||
- [پشتیبانی از وب سوکت](https://github.com/gofiber/websocket)
|
||||
@ -185,7 +193,7 @@ Fiber از Express <b>الهام گرفته</b>, که محبوب ترین فری
|
||||
</p>
|
||||
|
||||
## ⚠️ محدودیت ها
|
||||
* به دلیل استفاده ناامن از Fiber, ممکن است کتابخانه همیشه با آخرین نسخه Go سازگار نباشد. Fiber 2.40.0 با زبان گو نسخه 1.16 تا 1.20 تست شده است.
|
||||
* به دلیل استفاده ناامن از Fiber, ممکن است کتابخانه همیشه با آخرین نسخه Go سازگار نباشد. Fiber 2.40.0 با زبان گو نسخه 1.17 تا 1.20 تست شده است.
|
||||
* فریمورک Fiber با پکیج net/http سازگار نیست. این بدان معناست شما نمی توانید از پکیج های مانند go-swagger, gqlgen یا سایر پروژه هایی که بخشی از اکوسیستم net/http هستند استفاده کنید.
|
||||
|
||||
<br>
|
||||
@ -530,7 +538,7 @@ func main() {
|
||||
|
||||
### JSON Response
|
||||
|
||||
📖 [JSON](https://docs.gofiber.io/ctx#json)
|
||||
📖 [JSON](https://docs.gofiber.io/api/ctx#json)
|
||||
|
||||
<div dir="ltr">
|
||||
|
||||
@ -666,6 +674,28 @@ func main() {
|
||||
}
|
||||
```
|
||||
|
||||
### Using Trusted Proxy
|
||||
|
||||
📖 [Config](https://docs.gofiber.io/api/fiber#config)
|
||||
|
||||
```go
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/recover"
|
||||
)
|
||||
|
||||
func main() {
|
||||
app := fiber.New(fiber.Config{
|
||||
EnableTrustedProxyCheck: true,
|
||||
TrustedProxies: []string{"0.0.0.0", "1.1.1.1/30"}, // IP address or IP address range
|
||||
ProxyHeader: fiber.HeaderXForwardedFor,
|
||||
})
|
||||
|
||||
// ...
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
```
|
||||
</div>
|
||||
|
||||
</details>
|
||||
@ -704,6 +734,11 @@ func main() {
|
||||
| [session](https://github.com/gofiber/fiber/tree/master/middleware/session) |برای ذخیره و مدیریت شناسه کاربری یا session بازدید کنندگان استفاده .میشود|
|
||||
| [skip](https://github.com/gofiber/fiber/tree/master/middleware/skip) |این میدلور میتواند با استفاده از شرط های تعیین شده درخواست هایی را نادیده بگیرد.|
|
||||
| [timeout](https://github.com/gofiber/fiber/tree/master/middleware/timeout) |این میدلور محدودیت زمانی ای را برای درخواست ها تنظیم میکند، در صورتی که محدودیت به پایان برسد ErrorHandler صدا زده میشود.|
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | این میدلور احراز هویت مبتنی بر کلید را فراهم می کند. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | برای ریدایرکت کردن از این میدلور میتوانید استفاده کنید. |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | مسیر URL را براساس قوانین مشخص شده بازنویسی می کند. این میتواند برای سازگاری با ورژن های قبلی یا برای ساخت لینک های تمیز تر و توصیفی تر مفید باشد. |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converter for net/http handlers to/from Fiber request handlers, special thanks to @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | با استفاده از HTTP هدر های مختلف به ایمن سازی برنامه شما کمک می کند. |
|
||||
|
||||
</div>
|
||||
</br></br>
|
||||
@ -720,19 +755,14 @@ func main() {
|
||||
|
||||
| Middleware | توضیحات |
|
||||
| :------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converter for net/http handlers to/from Fiber request handlers, special thanks to @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Helps secure your apps by setting various HTTP headers. |
|
||||
| [jwt](https://github.com/gofiber/jwt) | JWT returns a JSON Web Token \(JWT\) auth middleware. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth middleware provides a key based authentication. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Redirect middleware |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware rewrites the URL path based on provided rules. It can be helpful for backward compatibility or just creating cleaner and more descriptive links. |
|
||||
| [storage](https://github.com/gofiber/storage) | Premade storage drivers that implement the Storage interface, designed to be used with various Fiber middlewares. |
|
||||
| [template](https://github.com/gofiber/template) | This package contains 8 template engines that can be used with Fiber `v1.10.x` Go version 1.13 or higher is required. |
|
||||
| [websocket](https://github.com/gofiber/websocket) | Based on Fasthttp WebSocket for Fiber with Locals support! |
|
||||
|
||||
## 🕶️ Awesome List
|
||||
|
||||
For more articles, middlewares, examples or tools check our [awesome list](https://github.com/gofiber/awesome-fiber).
|
||||
[awesome list](https://github.com/gofiber/awesome-fiber) برای مقاله، میدلور، مثال ها و ابزار های بیشتر لطفا از این لینک بازدید کنید
|
||||
|
||||
</br>
|
||||
|
||||
@ -815,7 +845,6 @@ Copyright (c) 2019-present [Fenny](https://github.com/fenny) and [Contributors](
|
||||
- [runewidth](https://github.com/mattn/go-runewidth/blob/master/LICENSE)
|
||||
- [fasthttp](https://github.com/valyala/fasthttp/blob/master/LICENSE)
|
||||
- [bytebufferpool](https://github.com/valyala/bytebufferpool/blob/master/LICENSE)
|
||||
- [dictpool](https://github.com/savsgio/dictpool/blob/master/LICENSE)
|
||||
- [fwd](https://github.com/philhofer/fwd/blob/master/LICENSE.md)
|
||||
- [go-ole](https://github.com/go-ole/go-ole/blob/master/LICENSE)
|
||||
- [gopsutil](https://github.com/shirou/gopsutil/blob/master/LICENSE)
|
||||
|
29
.github/README_fr.md
vendored
29
.github/README_fr.md
vendored
@ -1,6 +1,11 @@
|
||||
<p align="center">
|
||||
<a href="https://gofiber.io">
|
||||
<img alt="Fiber" height="125" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
|
||||
<picture>
|
||||
<source height="125" media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo-dark.svg">
|
||||
<img height="125" alt="Fiber" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
</picture>
|
||||
|
||||
</a>
|
||||
<br>
|
||||
<!-- base64 flags are available at https://www.phoca.cz/cssflags/ -->
|
||||
@ -58,6 +63,9 @@
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_uk.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/UK-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDU1LjIgMzguNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTUuMiAzOC40IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwhW0NEQVRBWwoJLnN0MHtmaWxsOiNGRkQ1MDA7fQoJLnN0MXtmaWxsOiMwMDVCQkI7fQpdXT48L3N0eWxlPjxnPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0zLjAzLDBoNDkuMTNjMS42NywwLDMuMDMsMS4zNiwzLjAzLDMuMDN2MzIuMzNjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3IFYzLjAzQzAsMS4zNiwxLjM3LDAsMy4wMywwTDMuMDMsMHoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMCwxOS4yaDU1LjJ2MTYuMTdjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3VjE5LjJMMCwxOS4yeiIvPjwvZz48L3N2Zz4=">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_az.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/AZ-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI2MDAiPg0KPHJlY3Qgd2lkdGg9IjEyMDAiIGhlaWdodD0iNjAwIiBmaWxsPSIjNTA5ZTJmIi8+DQo8cmVjdCB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI0MDAiIGZpbGw9IiNlZjMzNDAiLz4NCjxyZWN0IHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0iIzAwYjVlMiIvPg0KPGNpcmNsZSBjeD0iNTcwIiBjeT0iMzAwIiByPSI5MCIgZmlsbD0iI2ZmZiIvPg0KPGNpcmNsZSBjeD0iNTkwIiBjeT0iMzAwIiByPSI3NSIgZmlsbD0iI2VmMzM0MCIvPg0KPHBhdGggZD0iTTY3MCAyNTBsOS41NjcgMjYuOTAzIDI1Ljc4OC0xMi4yNTgtMTIuMjU4IDI1Ljc4OEw3MjAgMzAwbC0yNi45MDMgOS41NjcgMTIuMjU4IDI1Ljc4OC0yNS43ODgtMTIuMjU4TDY3MCAzNTBsLTkuNTY3LTI2LjkwMy0yNS43ODggMTIuMjU4IDEyLjI1OC0yNS43ODhMNjIwIDMwMGwyNi45MDMtOS41NjctMTIuMjU4LTI1Ljc4OCAyNS43ODggMTIuMjU4eiIgZmlsbD0iI2ZmZiIvPg0KPC9zdmc+">
|
||||
</a>
|
||||
<br>
|
||||
<a href="https://pkg.go.dev/github.com/gofiber/fiber/v3#pkg-overview">
|
||||
<img src="https://img.shields.io/badge/%F0%9F%93%9A%20godoc-pkg-00ACD7.svg?color=00ACD7&style=flat-square">
|
||||
@ -114,7 +122,7 @@ Ces tests sont effectués par [TechEmpower](https://www.techempower.com/benchmar
|
||||
|
||||
## ⚙️ Installation
|
||||
|
||||
Make sure you have Go installed ([download](https://go.dev/dl/)). Version `1.16` or higher is required.
|
||||
Make sure you have Go installed ([download](https://go.dev/dl/)). Version `1.17` or higher is required.
|
||||
|
||||
Initialize your project by creating a folder and then running `go mod init github.com/your/repo` ([learn more](https://go.dev/blog/using-go-modules)) inside the folder. Then install Fiber with the [`go get`](https://pkg.go.dev/cmd/go/#hdr-Add_dependencies_to_current_module_and_install_them) command:
|
||||
|
||||
@ -124,7 +132,7 @@ go get -u github.com/gofiber/fiber/v3
|
||||
|
||||
## 🎯 Features
|
||||
|
||||
- [Routing](https://docs.gofiber.io/routing) robuste
|
||||
- [Routing](https://docs.gofiber.io/guide/routing) robuste
|
||||
- Serve [static files](https://docs.gofiber.io/api/app#static)
|
||||
- [Performances](https://docs.gofiber.io/extra/benchmarks) extrêmes
|
||||
- [Faible empreinte mémoire](https://docs.gofiber.io/extra/benchmarks)
|
||||
@ -145,7 +153,7 @@ Les nouveaux gophers qui passent de [Node.js](https://nodejs.org/en/about/) à [
|
||||
Fiber est **inspiré** par Express, le framework web le plus populaire d'Internet. Nous avons combiné la **facilité** d'Express, et la **performance brute** de Go. Si vous avez déja développé une application web en Node.js (_en utilisant Express ou équivalent_), alors de nombreuses méthodes et principes vous sembleront **familiers**.
|
||||
|
||||
## ⚠️ Limitations
|
||||
* Due to Fiber's usage of unsafe, the library may not always be compatible with the latest Go version. Fiber 2.40.0 has been tested with Go versions 1.16 to 1.20.
|
||||
* Due to Fiber's usage of unsafe, the library may not always be compatible with the latest Go version. Fiber 2.40.0 has been tested with Go versions 1.17 to 1.20.
|
||||
* Fiber is not compatible with net/http interfaces. This means you will not be able to use projects like gqlgen, go-swagger, or any others which are part of the net/http ecosystem.
|
||||
|
||||
## 👀 Exemples
|
||||
@ -436,7 +444,7 @@ func main() {
|
||||
|
||||
### JSON Response
|
||||
|
||||
📖 [JSON](https://docs.gofiber.io/ctx#json)
|
||||
📖 [JSON](https://docs.gofiber.io/api/ctx#json)
|
||||
|
||||
```go
|
||||
type User struct {
|
||||
@ -591,6 +599,11 @@ Here is a list of middleware that are included within the Fiber framework.
|
||||
| [session](https://github.com/gofiber/fiber/tree/master/middleware/session) | Session middleware. NOTE: This middleware uses our Storage package. |
|
||||
| [skip](https://github.com/gofiber/fiber/tree/master/middleware/skip) | Skip middleware that skips a wrapped handler is a predicate is true. |
|
||||
| [timeout](https://github.com/gofiber/fiber/tree/master/middleware/timeout) | Adds a max time for a request and forwards to ErrorHandler if it is exceeded. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth middleware provides a key based authentication. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Redirect middleware |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware rewrites the URL path based on provided rules. It can be helpful for backward compatibility or just creating cleaner and more descriptive links. |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converter for net/http handlers to/from Fiber request handlers, special thanks to @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Helps secure your apps by setting various HTTP headers. |
|
||||
|
||||
## 🧬 External Middleware
|
||||
|
||||
@ -598,12 +611,7 @@ List of externally hosted middleware modules and maintained by the [Fiber team](
|
||||
|
||||
| Middleware | Description |
|
||||
| :------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converter for net/http handlers to/from Fiber request handlers, special thanks to @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Helps secure your apps by setting various HTTP headers. |
|
||||
| [jwt](https://github.com/gofiber/jwt) | JWT returns a JSON Web Token \(JWT\) auth middleware. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth middleware provides a key based authentication. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Redirect middleware |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware rewrites the URL path based on provided rules. It can be helpful for backward compatibility or just creating cleaner and more descriptive links. |
|
||||
| [storage](https://github.com/gofiber/storage) | Premade storage drivers that implement the Storage interface, designed to be used with various Fiber middlewares. |
|
||||
| [template](https://github.com/gofiber/template) | This package contains 8 template engines that can be used with Fiber `v1.10.x` Go version 1.13 or higher is required. |
|
||||
| [websocket](https://github.com/gofiber/websocket) | Based on Fasthttp WebSocket for Fiber with Locals support! |
|
||||
@ -665,7 +673,6 @@ Copyright (c) 2019-present [Fenny](https://github.com/fenny) and [Contributors](
|
||||
- [runewidth](https://github.com/mattn/go-runewidth/blob/master/LICENSE)
|
||||
- [fasthttp](https://github.com/valyala/fasthttp/blob/master/LICENSE)
|
||||
- [bytebufferpool](https://github.com/valyala/bytebufferpool/blob/master/LICENSE)
|
||||
- [dictpool](https://github.com/savsgio/dictpool/blob/master/LICENSE)
|
||||
- [fwd](https://github.com/philhofer/fwd/blob/master/LICENSE.md)
|
||||
- [go-ole](https://github.com/go-ole/go-ole/blob/master/LICENSE)
|
||||
- [gopsutil](https://github.com/shirou/gopsutil/blob/master/LICENSE)
|
||||
|
33
.github/README_he.md
vendored
33
.github/README_he.md
vendored
@ -1,6 +1,11 @@
|
||||
<p align="center">
|
||||
<a href="https://gofiber.io">
|
||||
<img alt="Fiber" height="125" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
|
||||
<picture>
|
||||
<source height="125" media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo-dark.svg">
|
||||
<img height="125" alt="Fiber" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
</picture>
|
||||
|
||||
</a>
|
||||
<br>
|
||||
<!-- base64 flags are available at https://www.phoca.cz/cssflags/ -->
|
||||
@ -58,6 +63,9 @@
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_uk.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/UK-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDU1LjIgMzguNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTUuMiAzOC40IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwhW0NEQVRBWwoJLnN0MHtmaWxsOiNGRkQ1MDA7fQoJLnN0MXtmaWxsOiMwMDVCQkI7fQpdXT48L3N0eWxlPjxnPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0zLjAzLDBoNDkuMTNjMS42NywwLDMuMDMsMS4zNiwzLjAzLDMuMDN2MzIuMzNjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3IFYzLjAzQzAsMS4zNiwxLjM3LDAsMy4wMywwTDMuMDMsMHoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMCwxOS4yaDU1LjJ2MTYuMTdjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3VjE5LjJMMCwxOS4yeiIvPjwvZz48L3N2Zz4=">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_az.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/AZ-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI2MDAiPg0KPHJlY3Qgd2lkdGg9IjEyMDAiIGhlaWdodD0iNjAwIiBmaWxsPSIjNTA5ZTJmIi8+DQo8cmVjdCB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI0MDAiIGZpbGw9IiNlZjMzNDAiLz4NCjxyZWN0IHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0iIzAwYjVlMiIvPg0KPGNpcmNsZSBjeD0iNTcwIiBjeT0iMzAwIiByPSI5MCIgZmlsbD0iI2ZmZiIvPg0KPGNpcmNsZSBjeD0iNTkwIiBjeT0iMzAwIiByPSI3NSIgZmlsbD0iI2VmMzM0MCIvPg0KPHBhdGggZD0iTTY3MCAyNTBsOS41NjcgMjYuOTAzIDI1Ljc4OC0xMi4yNTgtMTIuMjU4IDI1Ljc4OEw3MjAgMzAwbC0yNi45MDMgOS41NjcgMTIuMjU4IDI1Ljc4OC0yNS43ODgtMTIuMjU4TDY3MCAzNTBsLTkuNTY3LTI2LjkwMy0yNS43ODggMTIuMjU4IDEyLjI1OC0yNS43ODhMNjIwIDMwMGwyNi45MDMtOS41NjctMTIuMjU4LTI1Ljc4OCAyNS43ODggMTIuMjU4eiIgZmlsbD0iI2ZmZiIvPg0KPC9zdmc+">
|
||||
</a>
|
||||
<br>
|
||||
<a href="https://pkg.go.dev/github.com/gofiber/fiber/v3#pkg-overview">
|
||||
<img src="https://img.shields.io/badge/%F0%9F%93%9A%20godoc-pkg-00ACD7.svg?color=00ACD7&style=flat-square">
|
||||
@ -133,7 +141,7 @@ func main() {
|
||||
|
||||
## ⚙️ התקנה
|
||||
|
||||
Make sure you have Go installed ([download](https://go.dev/dl/)). Version `1.16` or higher is required.
|
||||
Make sure you have Go installed ([download](https://go.dev/dl/)). Version `1.17` or higher is required.
|
||||
|
||||
Initialize your project by creating a folder and then running `go mod init github.com/your/repo` ([learn more](https://go.dev/blog/using-go-modules)) inside the folder. Then install Fiber with the [`go get`](https://pkg.go.dev/cmd/go/#hdr-Add_dependencies_to_current_module_and_install_them) command:
|
||||
|
||||
@ -147,14 +155,14 @@ go get -u github.com/gofiber/fiber/v3
|
||||
|
||||
<div dir="rtl">
|
||||
|
||||
- [ניתוב](https://docs.gofiber.io/routing) רובסטי
|
||||
- [ניתוב](https://docs.gofiber.io/guide/routing) רובסטי
|
||||
- הנגשת [קבצים סטטיים](https://docs.gofiber.io/api/app#static)
|
||||
- [ביצועים](https://docs.gofiber.io/extra/benchmarks) גבוהים במיוחד
|
||||
- צורך כמות [זכרון קטנה](https://docs.gofiber.io/extra/benchmarks)
|
||||
- [נקודות קצה עבור API](https://docs.gofiber.io/api/ctx)
|
||||
- תמיכה ב-[Middleware](https://docs.gofiber.io/middleware) & [Next](https://docs.gofiber.io/api/ctx#next)
|
||||
- תמיכה ב-[Middleware](https://docs.gofiber.io/category/-middleware) & [Next](https://docs.gofiber.io/api/ctx#next)
|
||||
- תכנות [מהיר](https://dev.to/koddr/welcome-to-fiber-an-express-js-styled-fastest-web-framework-written-with-on-golang-497) של צד שרת
|
||||
- [מנועי תבניות](https://docs.gofiber.io/middleware#template)
|
||||
- [מנועי תבניות](https://docs.gofiber.io/category/-middleware#template)
|
||||
- [תמיכה ב-WebSocket](https://github.com/gofiber/websocket)
|
||||
- [Server-Sent events](https://github.com/gofiber/recipes/tree/master/sse)
|
||||
- [הגבלת קצבים ובקשות](https://docs.gofiber.io/api/middleware/limiter)
|
||||
@ -190,7 +198,7 @@ Fiber נוצרה **בהשראת** Express, ה-web framework הפופולרית
|
||||
<div dir="rtl">
|
||||
|
||||
## ⚠️ Limitations
|
||||
* Due to Fiber's usage of unsafe, the library may not always be compatible with the latest Go version. Fiber 2.40.0 has been tested with Go versions 1.16 to 1.20.
|
||||
* Due to Fiber's usage of unsafe, the library may not always be compatible with the latest Go version. Fiber 2.40.0 has been tested with Go versions 1.17 to 1.20.
|
||||
* Fiber is not compatible with net/http interfaces. This means you will not be able to use projects like gqlgen, go-swagger, or any others which are part of the net/http ecosystem.
|
||||
|
||||
## 👀 דוגמאות
|
||||
@ -526,7 +534,7 @@ func main() {
|
||||
|
||||
### תגובת JSON
|
||||
|
||||
📖 [JSON](https://docs.gofiber.io/ctx#json)
|
||||
📖 [JSON](https://docs.gofiber.io/api/ctx#json)
|
||||
|
||||
<div dir="ltr">
|
||||
|
||||
@ -707,6 +715,11 @@ Here is a list of middleware that are included within the Fiber framework.
|
||||
| [session](https://github.com/gofiber/fiber/tree/master/middleware/session) | Session middleware. NOTE: This middleware uses our Storage package. |
|
||||
| [skip](https://github.com/gofiber/fiber/tree/master/middleware/skip) | Skip middleware that skips a wrapped handler is a predicate is true. |
|
||||
| [timeout](https://github.com/gofiber/fiber/tree/master/middleware/timeout) | Adds a max time for a request and forwards to ErrorHandler if it is exceeded. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth middleware provides a key based authentication. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Redirect middleware |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware rewrites the URL path based on provided rules. It can be helpful for backward compatibility or just creating cleaner and more descriptive links. |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converter for net/http handlers to/from Fiber request handlers, special thanks to @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Helps secure your apps by setting various HTTP headers. |
|
||||
|
||||
</div>
|
||||
|
||||
@ -726,12 +739,7 @@ Here is a list of middleware that are included within the Fiber framework.
|
||||
|
||||
| Middleware | Description |
|
||||
| :------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converter for net/http handlers to/from Fiber request handlers, special thanks to @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Helps secure your apps by setting various HTTP headers. |
|
||||
| [jwt](https://github.com/gofiber/jwt) | JWT returns a JSON Web Token \(JWT\) auth middleware. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth middleware provides a key based authentication. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Redirect middleware |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware rewrites the URL path based on provided rules. It can be helpful for backward compatibility or just creating cleaner and more descriptive links. |
|
||||
| [storage](https://github.com/gofiber/storage) | Premade storage drivers that implement the Storage interface, designed to be used with various Fiber middlewares. |
|
||||
| [template](https://github.com/gofiber/template) | This package contains 8 template engines that can be used with Fiber `v1.10.x` Go version 1.13 or higher is required. |
|
||||
| [websocket](https://github.com/gofiber/websocket) | Based on Fasthttp WebSocket for Fiber with Locals support! |
|
||||
@ -840,7 +848,6 @@ Copyright (c) 2019-present [Fenny](https://github.com/fenny) and [Contributors](
|
||||
- [runewidth](https://github.com/mattn/go-runewidth/blob/master/LICENSE)
|
||||
- [fasthttp](https://github.com/valyala/fasthttp/blob/master/LICENSE)
|
||||
- [bytebufferpool](https://github.com/valyala/bytebufferpool/blob/master/LICENSE)
|
||||
- [dictpool](https://github.com/savsgio/dictpool/blob/master/LICENSE)
|
||||
- [fwd](https://github.com/philhofer/fwd/blob/master/LICENSE.md)
|
||||
- [go-ole](https://github.com/go-ole/go-ole/blob/master/LICENSE)
|
||||
- [gopsutil](https://github.com/shirou/gopsutil/blob/master/LICENSE)
|
||||
|
29
.github/README_id.md
vendored
29
.github/README_id.md
vendored
@ -1,6 +1,11 @@
|
||||
<p align="center">
|
||||
<a href="https://gofiber.io">
|
||||
<img alt="Fiber" height="125" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
|
||||
<picture>
|
||||
<source height="125" media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo-dark.svg">
|
||||
<img height="125" alt="Fiber" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
</picture>
|
||||
|
||||
</a>
|
||||
<br>
|
||||
<!-- base64 flags are available at https://www.phoca.cz/cssflags/ -->
|
||||
@ -58,6 +63,9 @@
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_uk.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/UK-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDU1LjIgMzguNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTUuMiAzOC40IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwhW0NEQVRBWwoJLnN0MHtmaWxsOiNGRkQ1MDA7fQoJLnN0MXtmaWxsOiMwMDVCQkI7fQpdXT48L3N0eWxlPjxnPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0zLjAzLDBoNDkuMTNjMS42NywwLDMuMDMsMS4zNiwzLjAzLDMuMDN2MzIuMzNjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3IFYzLjAzQzAsMS4zNiwxLjM3LDAsMy4wMywwTDMuMDMsMHoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMCwxOS4yaDU1LjJ2MTYuMTdjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3VjE5LjJMMCwxOS4yeiIvPjwvZz48L3N2Zz4=">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_az.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/AZ-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI2MDAiPg0KPHJlY3Qgd2lkdGg9IjEyMDAiIGhlaWdodD0iNjAwIiBmaWxsPSIjNTA5ZTJmIi8+DQo8cmVjdCB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI0MDAiIGZpbGw9IiNlZjMzNDAiLz4NCjxyZWN0IHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0iIzAwYjVlMiIvPg0KPGNpcmNsZSBjeD0iNTcwIiBjeT0iMzAwIiByPSI5MCIgZmlsbD0iI2ZmZiIvPg0KPGNpcmNsZSBjeD0iNTkwIiBjeT0iMzAwIiByPSI3NSIgZmlsbD0iI2VmMzM0MCIvPg0KPHBhdGggZD0iTTY3MCAyNTBsOS41NjcgMjYuOTAzIDI1Ljc4OC0xMi4yNTgtMTIuMjU4IDI1Ljc4OEw3MjAgMzAwbC0yNi45MDMgOS41NjcgMTIuMjU4IDI1Ljc4OC0yNS43ODgtMTIuMjU4TDY3MCAzNTBsLTkuNTY3LTI2LjkwMy0yNS43ODggMTIuMjU4IDEyLjI1OC0yNS43ODhMNjIwIDMwMGwyNi45MDMtOS41NjctMTIuMjU4LTI1Ljc4OCAyNS43ODggMTIuMjU4eiIgZmlsbD0iI2ZmZiIvPg0KPC9zdmc+">
|
||||
</a>
|
||||
<br>
|
||||
<a href="https://pkg.go.dev/github.com/gofiber/fiber/v3#pkg-overview">
|
||||
<img src="https://img.shields.io/badge/%F0%9F%93%9A%20godoc-pkg-00ACD7.svg?color=00ACD7&style=flat-square">
|
||||
@ -114,7 +122,7 @@ Pengukuran ini dilakukan oleh [TechEmpower](https://www.techempower.com/benchmar
|
||||
|
||||
## ⚙️ Instalasi
|
||||
|
||||
Pastikan kamu sudah menginstalasi Golang ([unduh](https://go.dev/dl/)). Dengan versi `1.16` atau lebih tinggi [ Direkomendasikan ].
|
||||
Pastikan kamu sudah menginstalasi Golang ([unduh](https://go.dev/dl/)). Dengan versi `1.17` atau lebih tinggi [ Direkomendasikan ].
|
||||
|
||||
Inisialisasi proyek kamu dengan membuat folder lalu jalankan `go mod init github.com/nama-kamu/repo` ([belajar lebih banyak](https://go.dev/blog/using-go-modules)) di dalam folder. Kemudian instal Fiber dengan perintah [`go get`](https://pkg.go.dev/cmd/go/#hdr-Add_dependencies_to_current_module_and_install_them):
|
||||
|
||||
@ -124,7 +132,7 @@ go get -u github.com/gofiber/fiber/v3
|
||||
|
||||
## 🎯 Fitur
|
||||
|
||||
- Sistem [Routing](https://docs.gofiber.io/routing) yang padu
|
||||
- Sistem [Routing](https://docs.gofiber.io/guide/routing) yang padu
|
||||
- Menyajikan [file statis](https://docs.gofiber.io/api/app#static)
|
||||
- [Kinerja](https://docs.gofiber.io/extra/benchmarks) ekstrim
|
||||
- [Penggunaan memori](https://docs.gofiber.io/extra/benchmarks) yang kecil
|
||||
@ -148,7 +156,7 @@ Kami **mendengarkan** para pengguna di [GitHub Issues](https://github.com/gofibe
|
||||
|
||||
## ⚠️ Limitasi
|
||||
|
||||
* Karena penggunaan Fiber yang tidak aman, perpustakaan mungkin tidak selalu kompatibel dengan versi Go terbaru. Fiber 2.40.0 telah diuji dengan Go versi 1.16 hingga 1.20.
|
||||
* Karena penggunaan Fiber yang tidak aman, perpustakaan mungkin tidak selalu kompatibel dengan versi Go terbaru. Fiber 2.40.0 telah diuji dengan Go versi 1.17 hingga 1.20.
|
||||
* Fiber tidak kompatibel dengan antarmuka net/http. Ini berarti kamu tidak akan dapat menggunakan proyek seperti gqlgen, go-swagger, atau lainnya yang merupakan bagian dari ekosistem net/http.
|
||||
|
||||
## 👀 Contoh
|
||||
@ -437,7 +445,7 @@ func main() {
|
||||
|
||||
### JSON Response
|
||||
|
||||
📖 [JSON](https://docs.gofiber.io/ctx#json)
|
||||
📖 [JSON](https://docs.gofiber.io/api/ctx#json)
|
||||
|
||||
```go
|
||||
type User struct {
|
||||
@ -592,6 +600,11 @@ Kumpulan `middleware` yang ada didalam kerangka kerja Fiber.
|
||||
| [session](https://github.com/gofiber/fiber/tree/master/middleware/session) | Session middleware. NOTE: This middleware uses our Storage package. |
|
||||
| [skip](https://github.com/gofiber/fiber/tree/master/middleware/skip) | Skip middleware that skips a wrapped handler is a predicate is true. |
|
||||
| [timeout](https://github.com/gofiber/fiber/tree/master/middleware/timeout) | Adds a max time for a request and forwards to ErrorHandler if it is exceeded. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth middleware provides a key based authentication. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Redirect middleware |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware rewrites the URL path based on provided rules. It can be helpful for backward compatibility or just creating cleaner and more descriptive links. |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converter for net/http handlers to/from Fiber request handlers, special thanks to @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Helps secure your apps by setting various HTTP headers. |
|
||||
|
||||
## 🧬 Middleware External
|
||||
|
||||
@ -599,12 +612,7 @@ Kumpulan `middleware` yang dihost external dan diurus oleh [Tim Fiber](https://g
|
||||
|
||||
| Middleware | Description |
|
||||
| :------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converter for net/http handlers to/from Fiber request handlers, special thanks to @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Helps secure your apps by setting various HTTP headers. |
|
||||
| [jwt](https://github.com/gofiber/jwt) | JWT returns a JSON Web Token \(JWT\) auth middleware. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth middleware provides a key based authentication. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Redirect middleware |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware rewrites the URL path based on provided rules. It can be helpful for backward compatibility or just creating cleaner and more descriptive links. |
|
||||
| [storage](https://github.com/gofiber/storage) | Premade storage drivers that implement the Storage interface, designed to be used with various Fiber middlewares. |
|
||||
| [template](https://github.com/gofiber/template) | This package contains 8 template engines that can be used with Fiber `v1.10.x` Go version 1.13 or higher is required. |
|
||||
| [websocket](https://github.com/gofiber/websocket) | Based on Fasthttp WebSocket for Fiber with Locals support! |
|
||||
@ -666,7 +674,6 @@ Copyright (c) 2019-present [Fenny](https://github.com/fenny) and [Contributors](
|
||||
- [runewidth](https://github.com/mattn/go-runewidth/blob/master/LICENSE)
|
||||
- [fasthttp](https://github.com/valyala/fasthttp/blob/master/LICENSE)
|
||||
- [bytebufferpool](https://github.com/valyala/bytebufferpool/blob/master/LICENSE)
|
||||
- [dictpool](https://github.com/savsgio/dictpool/blob/master/LICENSE)
|
||||
- [fwd](https://github.com/philhofer/fwd/blob/master/LICENSE.md)
|
||||
- [go-ole](https://github.com/go-ole/go-ole/blob/master/LICENSE)
|
||||
- [gopsutil](https://github.com/shirou/gopsutil/blob/master/LICENSE)
|
||||
|
49
.github/README_it.md
vendored
49
.github/README_it.md
vendored
@ -1,6 +1,11 @@
|
||||
<p align="center">
|
||||
<a href="https://gofiber.io">
|
||||
<img alt="Fiber" height="125" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
|
||||
<picture>
|
||||
<source height="125" media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo-dark.svg">
|
||||
<img height="125" alt="Fiber" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
</picture>
|
||||
|
||||
</a>
|
||||
<br>
|
||||
<!-- base64 flags are available at https://www.phoca.cz/cssflags/ -->
|
||||
@ -58,6 +63,9 @@
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_uk.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/UK-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDU1LjIgMzguNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTUuMiAzOC40IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwhW0NEQVRBWwoJLnN0MHtmaWxsOiNGRkQ1MDA7fQoJLnN0MXtmaWxsOiMwMDVCQkI7fQpdXT48L3N0eWxlPjxnPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0zLjAzLDBoNDkuMTNjMS42NywwLDMuMDMsMS4zNiwzLjAzLDMuMDN2MzIuMzNjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3IFYzLjAzQzAsMS4zNiwxLjM3LDAsMy4wMywwTDMuMDMsMHoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMCwxOS4yaDU1LjJ2MTYuMTdjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3VjE5LjJMMCwxOS4yeiIvPjwvZz48L3N2Zz4=">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_az.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/AZ-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI2MDAiPg0KPHJlY3Qgd2lkdGg9IjEyMDAiIGhlaWdodD0iNjAwIiBmaWxsPSIjNTA5ZTJmIi8+DQo8cmVjdCB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI0MDAiIGZpbGw9IiNlZjMzNDAiLz4NCjxyZWN0IHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0iIzAwYjVlMiIvPg0KPGNpcmNsZSBjeD0iNTcwIiBjeT0iMzAwIiByPSI5MCIgZmlsbD0iI2ZmZiIvPg0KPGNpcmNsZSBjeD0iNTkwIiBjeT0iMzAwIiByPSI3NSIgZmlsbD0iI2VmMzM0MCIvPg0KPHBhdGggZD0iTTY3MCAyNTBsOS41NjcgMjYuOTAzIDI1Ljc4OC0xMi4yNTgtMTIuMjU4IDI1Ljc4OEw3MjAgMzAwbC0yNi45MDMgOS41NjcgMTIuMjU4IDI1Ljc4OC0yNS43ODgtMTIuMjU4TDY3MCAzNTBsLTkuNTY3LTI2LjkwMy0yNS43ODggMTIuMjU4IDEyLjI1OC0yNS43ODhMNjIwIDMwMGwyNi45MDMtOS41NjctMTIuMjU4LTI1Ljc4OCAyNS43ODggMTIuMjU4eiIgZmlsbD0iI2ZmZiIvPg0KPC9zdmc+">
|
||||
</a>
|
||||
<br>
|
||||
<a href="https://pkg.go.dev/github.com/gofiber/fiber/v3#pkg-overview">
|
||||
<img src="https://img.shields.io/badge/%F0%9F%93%9A%20godoc-pkg-00ACD7.svg?color=00ACD7&style=flat-square">
|
||||
@ -114,7 +122,7 @@ Questi test sono stati eseguiti da [TechEmpower](https://www.techempower.com/ben
|
||||
|
||||
## ⚙️ Installazione
|
||||
|
||||
Assicurati di avere Go ([per scaricalro](https://go.dev/dl/)) installato. Devi avere la versione `1.16` o superiore.
|
||||
Assicurati di avere Go ([per scaricarlo](https://go.dev/dl/)) installato. Devi avere la versione `1.17` o superiore.
|
||||
|
||||
Inizializza il tuo progetto creando una cartella e successivamente usando il comando `go mod init github.com/la-tua/repo` ([per maggiori informazioni](https://go.dev/blog/using-go-modules)) dentro la cartella. Dopodiche installa Fiber con il comando [`go get`](https://pkg.go.dev/cmd/go/#hdr-Add_dependencies_to_current_module_and_install_them):
|
||||
|
||||
@ -124,7 +132,7 @@ go get -u github.com/gofiber/fiber/v3
|
||||
|
||||
## 🎯 Caratteristiche
|
||||
|
||||
- [Routing](https://docs.gofiber.io/routing) solido
|
||||
- [Routing](https://docs.gofiber.io/guide/routing) solido
|
||||
- Serve [file statici](https://docs.gofiber.io/api/app#static)
|
||||
- [Perfomance](https://docs.gofiber.io/extra/benchmarks) estreme
|
||||
- [Basso](https://docs.gofiber.io/extra/benchmarks) utilizzo di [memoria](https://docs.gofiber.io/extra/benchmarks)
|
||||
@ -142,11 +150,11 @@ go get -u github.com/gofiber/fiber/v3
|
||||
|
||||
I nuovi gopher che passano da [Node.js](https://nodejs.org/en/about/) a [Go](https://go.dev/doc/) hanno a che fare con una curva di apprendimento prima di poter iniziare a creare le proprie applicazioni web o microservizi. Fiber, come **web framework** , è stato creato con l'idea di **minimalismo** e seguendo lo '**UNIX way**' , così i nuovi gopher posso entrare rapidamente nel mondo di Go con un caldo e fidato benvenuto.
|
||||
|
||||
Fiber è **ispirato** da Express, il web framework più popolare su internet. Abbiamo combiniamo la **facilità** di Express e **le prestazioni** di Go. Se hai mai implementato una applicazione web in Node.js (_utilizzando Express o simili_), allora i tanti metodi e principi ti saranno **molto familiari**.
|
||||
Fiber è **ispirato** da Express, il web framework più popolare su internet. Abbiamo combinato la **facilità** di Express e **le prestazioni** di Go. Se hai mai implementato una applicazione web in Node.js (_utilizzando Express o simili_), allora i tanti metodi e principi ti saranno **molto familiari**.
|
||||
|
||||
## ⚠️ Limitazioni
|
||||
|
||||
* Dato che Fiber utilizza unsafe, la libreria non sempre potrebbe essere compatibile con l'ultima versione di Go. Fiber 2.40.0 è stato testato con la versioni 1.16 alla 1.20 di Go.
|
||||
* Dato che Fiber utilizza unsafe, la libreria non sempre potrebbe essere compatibile con l'ultima versione di Go. Fiber 2.40.0 è stato testato con la versioni 1.17 alla 1.20 di Go.
|
||||
* Fiber non è compatibile con le interfacce net/http. Questo significa che non è possibile utilizzare progetti come qglgen, go-swagger, o altri che fanno parte dell'ecosistema net/http.
|
||||
|
||||
## 👀 Esempi
|
||||
@ -435,7 +443,7 @@ func main() {
|
||||
|
||||
### Risposte JSON
|
||||
|
||||
📖 [JSON](https://docs.gofiber.io/ctx#json)
|
||||
📖 [JSON](https://docs.gofiber.io/api/ctx#json)
|
||||
|
||||
```go
|
||||
type User struct {
|
||||
@ -577,7 +585,7 @@ func main() {
|
||||
app := fiber.New(fiber.Config{
|
||||
EnableTrustedProxyCheck: true,
|
||||
TrustedProxies: []string{"0.0.0.0", "1.1.1.1/30"}, // IP address or IP address range
|
||||
ProxyHeader: fiber.HeaderXForwardedFor},
|
||||
ProxyHeader: fiber.HeaderXForwardedFor,
|
||||
})
|
||||
|
||||
// ...
|
||||
@ -594,27 +602,32 @@ Qui una lista dei middleware inclusi con Fiber.
|
||||
|
||||
| Middleware | Descrizione |
|
||||
| :------------------------------------------------------------------------------------- |:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| [basicauth](https://github.com/gofiber/fiber/tree/master/middleware/basicauth) | Middleware basico di autenticazione usando http. Chiama il suo handler se le credenziali sono guiste e il codice 401 Unauthorized per credenziali mancanti o invailde. |
|
||||
| [basicauth](https://github.com/gofiber/fiber/tree/master/middleware/basicauth) | Middleware basico di autenticazione usando http. Chiama il suo handler se le credenziali sono giuste e il codice 401 Unauthorized per credenziali mancanti o invalide. |
|
||||
| [cache](https://github.com/gofiber/fiber/tree/master/middleware/cache) | Intercetta e mette nella cache la risposta |
|
||||
| [compress](https://github.com/gofiber/fiber/tree/master/middleware/compress) | Middlewere di compressione per Fiber, supporta `deflate`, `gzip` e `brotli` di default. |
|
||||
| [cors](https://github.com/gofiber/fiber/tree/master/middleware/cors) | Ti permette di usare cross-origin resource sharing \(CORS\) con tante optzioni. |
|
||||
| [compress](https://github.com/gofiber/fiber/tree/master/middleware/compress) | Middleware di compressione per Fiber, supporta `deflate`, `gzip` e `brotli` di default. |
|
||||
| [cors](https://github.com/gofiber/fiber/tree/master/middleware/cors) | Ti permette di usare cross-origin resource sharing \(CORS\) con tante opzioni. |
|
||||
| [csrf](https://github.com/gofiber/fiber/tree/master/middleware/csrf) | Ti protegge da attachi CSRF. |
|
||||
| [encryptcookie](https://github.com/gofiber/fiber/tree/master/middleware/encryptcookie) | Middleware che encrypta i valori dei cookie. |
|
||||
| [envvar](https://github.com/gofiber/fiber/tree/master/middleware/envvar) | Esporre le variabili di ambiente fornendo una configurazione facoltativa. |
|
||||
| [etag](https://github.com/gofiber/fiber/tree/master/middleware/etag) | Middlewere che permette alle cache di essere piu efficienti e salvare banda, come un web server non deve rimandare il messagio pieno se il contenuto non è cambiato. |
|
||||
| [etag](https://github.com/gofiber/fiber/tree/master/middleware/etag) | Middleware che permette alle cache di essere più efficienti e salvare banda, come un web server che non deve rimandare il messagio pieno se il contenuto non è cambiato. |
|
||||
| [expvar](https://github.com/gofiber/fiber/tree/master/middleware/expvar) | Middleware che serve via il suo runtime server HTTP varianti esposte in formato JSON. |
|
||||
| [favicon](https://github.com/gofiber/fiber/tree/master/middleware/favicon) | Ignora favicon dai logs o serve dalla memoria se un filepath si dà. |
|
||||
| [favicon](https://github.com/gofiber/fiber/tree/master/middleware/favicon) | Ignora favicon dai logs o serve dalla memoria se un filepath è specificato. |
|
||||
| [filesystem](https://github.com/gofiber/fiber/tree/master/middleware/filesystem) | Middleware per il FileSystem per Fiber, grazie tante e crediti a Alireza Salary |
|
||||
| [limiter](https://github.com/gofiber/fiber/tree/master/middleware/limiter) | Middelwere per Rate-limiting per Fiber. Usato per limitare richieste continue agli APIs publici e/o endpoints come un password reset. |
|
||||
| [limiter](https://github.com/gofiber/fiber/tree/master/middleware/limiter) | Middleware per Rate-limiting per Fiber. Usato per limitare richieste continue agli APIs publici e/o endpoints come un password reset. |
|
||||
| [logger](https://github.com/gofiber/fiber/tree/master/middleware/logger) | Logger HTTP per richiesta/risposta. |
|
||||
| [monitor](https://github.com/gofiber/fiber/tree/master/middleware/monitor) | Middleware per monitorare che riporta metriche server, ispirato da express-status-monitor |
|
||||
| [pprof](https://github.com/gofiber/fiber/tree/master/middleware/pprof) | Grazie tante a Matthew Lee \(@mthli\) |
|
||||
| [proxy](https://github.com/gofiber/fiber/tree/master/middleware/proxy) | Ti permette di fare richieste proxy a multipli server. |
|
||||
| [recover](https://github.com/gofiber/fiber/tree/master/middleware/recover) | Middleware per recuperare dai attachi di panico da tutte le parti nella stack chain e da il controllo al centralizzato[ ErrorHandler](https://docs.gofiber.io/guide/error-handling). |
|
||||
| [recover](https://github.com/gofiber/fiber/tree/master/middleware/recover) | Middleware per recuperare dagli attachi di panico da tutte le parti nella stack chain e affida il controllo al [ ErrorHandler](https://docs.gofiber.io/guide/error-handling) centralizzato. |
|
||||
| [requestid](https://github.com/gofiber/fiber/tree/master/middleware/requestid) | Aggiunge un requestid a ogni richiesta. |
|
||||
| [session](https://github.com/gofiber/fiber/tree/master/middleware/session) | Middelwere per sessioni. NOTA: Questo middleware usa il nostro Storage package. |
|
||||
| [session](https://github.com/gofiber/fiber/tree/master/middleware/session) | Middleware per sessioni. NOTA: Questo middleware usa il nostro Storage package. |
|
||||
| [skip](https://github.com/gofiber/fiber/tree/master/middleware/skip) | Middleware che salta un wrapped handler se un predicate è vero. |
|
||||
| [timeout](https://github.com/gofiber/fiber/tree/master/middleware/timeout) | Aggiunge un tempo massimo per una richiesta e lo manda a ErrorHandler se si supera. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Usa auth basato su chiavi. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Middleware per reinderizzare |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Riscrive la path all URL con le regole date. Può essere di aiuto per compatibilità o per creare link puliti e più descrittivi. |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converte gli handler net/http a/da i request handlers di Fiber, grazie tante a @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Aiuta a mettere sicurezza alla tua app usando vari header HTTP. |
|
||||
|
||||
## 🧬 Middleware Esterni
|
||||
|
||||
@ -622,12 +635,7 @@ La lista dei moduli middleware hostati esternamente e mantenuti dal [team di Fib
|
||||
|
||||
| Middleware | Descrizione |
|
||||
| :------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converte gli handler net/http a/da i request handlers di Fiber, grazie tante a @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Aiuta a mettere sicurezza alla tua app usando vari header HTTP. |
|
||||
| [jwt](https://github.com/gofiber/jwt) | Usa JSON Web Token \(JWT\) auth. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Usa auth basato su chiavi. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Middleware per reinderizzare |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Riscrive la path all URL con le regole date. Puo essere di aiuto per compatibilita o per creare link puliti e piu descrittivi. |
|
||||
| [storage](https://github.com/gofiber/storage) | Dirver di storage che implementa la interfaccia Storage, fatto per essere usato con vari Fiber middleware. |
|
||||
| [template](https://github.com/gofiber/template) | Questo pachetto contiene 8 motori template che possono essere usati con Fiber `v1.10.x`. Versione di go neccesaria: 1.13+. |
|
||||
| [websocket](https://github.com/gofiber/websocket) | Basato su Fasthttp WebSocket per Fiber con supporto per Locals! |
|
||||
@ -689,7 +697,6 @@ Copyright (c) 2019-ora [Fenny](https://github.com/fenny) e [Contributors](https:
|
||||
- [runewidth](https://github.com/mattn/go-runewidth/blob/master/LICENSE)
|
||||
- [fasthttp](https://github.com/valyala/fasthttp/blob/master/LICENSE)
|
||||
- [bytebufferpool](https://github.com/valyala/bytebufferpool/blob/master/LICENSE)
|
||||
- [dictpool](https://github.com/savsgio/dictpool/blob/master/LICENSE)
|
||||
- [fwd](https://github.com/philhofer/fwd/blob/master/LICENSE.md)
|
||||
- [go-ole](https://github.com/go-ole/go-ole/blob/master/LICENSE)
|
||||
- [gopsutil](https://github.com/shirou/gopsutil/blob/master/LICENSE)
|
||||
|
29
.github/README_ja.md
vendored
29
.github/README_ja.md
vendored
@ -1,6 +1,11 @@
|
||||
<p align="center">
|
||||
<a href="https://gofiber.io">
|
||||
<img alt="Fiber" height="125" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
|
||||
<picture>
|
||||
<source height="125" media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo-dark.svg">
|
||||
<img height="125" alt="Fiber" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
</picture>
|
||||
|
||||
</a>
|
||||
<br>
|
||||
<!-- base64 flags are available at https://www.phoca.cz/cssflags/ -->
|
||||
@ -58,6 +63,9 @@
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_uk.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/UK-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDU1LjIgMzguNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTUuMiAzOC40IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwhW0NEQVRBWwoJLnN0MHtmaWxsOiNGRkQ1MDA7fQoJLnN0MXtmaWxsOiMwMDVCQkI7fQpdXT48L3N0eWxlPjxnPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0zLjAzLDBoNDkuMTNjMS42NywwLDMuMDMsMS4zNiwzLjAzLDMuMDN2MzIuMzNjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3IFYzLjAzQzAsMS4zNiwxLjM3LDAsMy4wMywwTDMuMDMsMHoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMCwxOS4yaDU1LjJ2MTYuMTdjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3VjE5LjJMMCwxOS4yeiIvPjwvZz48L3N2Zz4=">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_az.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/AZ-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI2MDAiPg0KPHJlY3Qgd2lkdGg9IjEyMDAiIGhlaWdodD0iNjAwIiBmaWxsPSIjNTA5ZTJmIi8+DQo8cmVjdCB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI0MDAiIGZpbGw9IiNlZjMzNDAiLz4NCjxyZWN0IHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0iIzAwYjVlMiIvPg0KPGNpcmNsZSBjeD0iNTcwIiBjeT0iMzAwIiByPSI5MCIgZmlsbD0iI2ZmZiIvPg0KPGNpcmNsZSBjeD0iNTkwIiBjeT0iMzAwIiByPSI3NSIgZmlsbD0iI2VmMzM0MCIvPg0KPHBhdGggZD0iTTY3MCAyNTBsOS41NjcgMjYuOTAzIDI1Ljc4OC0xMi4yNTgtMTIuMjU4IDI1Ljc4OEw3MjAgMzAwbC0yNi45MDMgOS41NjcgMTIuMjU4IDI1Ljc4OC0yNS43ODgtMTIuMjU4TDY3MCAzNTBsLTkuNTY3LTI2LjkwMy0yNS43ODggMTIuMjU4IDEyLjI1OC0yNS43ODhMNjIwIDMwMGwyNi45MDMtOS41NjctMTIuMjU4LTI1Ljc4OCAyNS43ODggMTIuMjU4eiIgZmlsbD0iI2ZmZiIvPg0KPC9zdmc+">
|
||||
</a>
|
||||
<br>
|
||||
<a href="https://pkg.go.dev/github.com/gofiber/fiber/v3#pkg-overview">
|
||||
<img src="https://img.shields.io/badge/%F0%9F%93%9A%20godoc-pkg-00ACD7.svg?color=00ACD7&style=flat-square">
|
||||
@ -115,7 +123,7 @@ func main() {
|
||||
|
||||
## ⚙️ インストール
|
||||
|
||||
Go がインストールされていることを確認してください ([ダウンロード](https://go.dev/dl/)). バージョン `1.16` またはそれ以上であることが必要です。
|
||||
Go がインストールされていることを確認してください ([ダウンロード](https://go.dev/dl/)). バージョン `1.17` またはそれ以上であることが必要です。
|
||||
|
||||
フォルダを作成し、フォルダ内で `go mod init github.com/your/repo` ([learn more](https://go.dev/blog/using-go-modules)) を実行してプロジェクトを初期化してください。その後、 Fiber を以下の [`go get`](https://pkg.go.dev/cmd/go/#hdr-Add_dependencies_to_current_module_and_install_them) コマンドでインストールしてください。
|
||||
|
||||
@ -125,7 +133,7 @@ go get -u github.com/gofiber/fiber/v3
|
||||
|
||||
## 🎯 機能
|
||||
|
||||
- 堅牢な[ルーティング](https://docs.gofiber.io/routing)
|
||||
- 堅牢な[ルーティング](https://docs.gofiber.io/guide/routing)
|
||||
- [静的ファイル](https://docs.gofiber.io/api/app#static)のサポート
|
||||
- 究極の[パフォーマンス](https://docs.gofiber.io/extra/benchmarks)
|
||||
- [低メモリ](https://docs.gofiber.io/extra/benchmarks)フットプリント
|
||||
@ -150,7 +158,7 @@ Fiber は人気の高い Web フレームワークである Expressjs に**イ
|
||||
|
||||
## ⚠️ 制限事項
|
||||
|
||||
- Fiber は unsafe パッケージを使用しているため、最新の Go バージョンと互換性がない場合があります。Fiber 2.40.0 は、Go のバージョン 1.16 から 1.20 でテストされています。
|
||||
- Fiber は unsafe パッケージを使用しているため、最新の Go バージョンと互換性がない場合があります。Fiber 2.40.0 は、Go のバージョン 1.17 から 1.20 でテストされています。
|
||||
- Fiber は net/http インターフェースと互換性がありません。つまり、gqlgen や go-swagger など、net/http のエコシステムの一部であるプロジェクトを使用することができません。
|
||||
|
||||
## 👀 例
|
||||
@ -439,7 +447,7 @@ func main() {
|
||||
|
||||
### JSON Response
|
||||
|
||||
📖 [JSON](https://docs.gofiber.io/ctx#json)
|
||||
📖 [JSON](https://docs.gofiber.io/api/ctx#json)
|
||||
|
||||
```go
|
||||
type User struct {
|
||||
@ -594,6 +602,11 @@ func main() {
|
||||
| [session](https://github.com/gofiber/fiber/tree/master/middleware/session) | Session middleware. NOTE: This middleware uses our Storage package. |
|
||||
| [skip](https://github.com/gofiber/fiber/tree/master/middleware/skip) | Skip middleware that skips a wrapped handler is a predicate is true. |
|
||||
| [timeout](https://github.com/gofiber/fiber/tree/master/middleware/timeout) | Adds a max time for a request and forwards to ErrorHandler if it is exceeded. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth middleware provides a key based authentication. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Redirect middleware |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware rewrites the URL path based on provided rules. It can be helpful for backward compatibility or just creating cleaner and more descriptive links. |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converter for net/http handlers to/from Fiber request handlers, special thanks to @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Helps secure your apps by setting various HTTP headers. |
|
||||
|
||||
## 🧬 外部ミドルウェア
|
||||
|
||||
@ -601,12 +614,7 @@ func main() {
|
||||
|
||||
| Middleware | Description |
|
||||
| :------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converter for net/http handlers to/from Fiber request handlers, special thanks to @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Helps secure your apps by setting various HTTP headers. |
|
||||
| [jwt](https://github.com/gofiber/jwt) | JWT returns a JSON Web Token \(JWT\) auth middleware. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth middleware provides a key based authentication. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Redirect middleware |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware rewrites the URL path based on provided rules. It can be helpful for backward compatibility or just creating cleaner and more descriptive links. |
|
||||
| [storage](https://github.com/gofiber/storage) | Premade storage drivers that implement the Storage interface, designed to be used with various Fiber middlewares. |
|
||||
| [template](https://github.com/gofiber/template) | This package contains 8 template engines that can be used with Fiber `v1.10.x` Go version 1.13 or higher is required. |
|
||||
| [websocket](https://github.com/gofiber/websocket) | Based on Fasthttp WebSocket for Fiber with Locals support! |
|
||||
@ -668,7 +676,6 @@ Copyright (c) 2019-present [Fenny](https://github.com/fenny) and [Contributors](
|
||||
- [runewidth](https://github.com/mattn/go-runewidth/blob/master/LICENSE)
|
||||
- [fasthttp](https://github.com/valyala/fasthttp/blob/master/LICENSE)
|
||||
- [bytebufferpool](https://github.com/valyala/bytebufferpool/blob/master/LICENSE)
|
||||
- [dictpool](https://github.com/savsgio/dictpool/blob/master/LICENSE)
|
||||
- [fwd](https://github.com/philhofer/fwd/blob/master/LICENSE.md)
|
||||
- [go-ole](https://github.com/go-ole/go-ole/blob/master/LICENSE)
|
||||
- [gopsutil](https://github.com/shirou/gopsutil/blob/master/LICENSE)
|
||||
|
29
.github/README_ko.md
vendored
29
.github/README_ko.md
vendored
@ -1,6 +1,11 @@
|
||||
<p align="center">
|
||||
<a href="https://gofiber.io">
|
||||
<img alt="Fiber" height="125" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
|
||||
<picture>
|
||||
<source height="125" media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo-dark.svg">
|
||||
<img height="125" alt="Fiber" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
</picture>
|
||||
|
||||
</a>
|
||||
<br>
|
||||
<!-- base64 flags are available at https://www.phoca.cz/cssflags/ -->
|
||||
@ -58,6 +63,9 @@
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_uk.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/UK-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDU1LjIgMzguNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTUuMiAzOC40IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwhW0NEQVRBWwoJLnN0MHtmaWxsOiNGRkQ1MDA7fQoJLnN0MXtmaWxsOiMwMDVCQkI7fQpdXT48L3N0eWxlPjxnPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0zLjAzLDBoNDkuMTNjMS42NywwLDMuMDMsMS4zNiwzLjAzLDMuMDN2MzIuMzNjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3IFYzLjAzQzAsMS4zNiwxLjM3LDAsMy4wMywwTDMuMDMsMHoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMCwxOS4yaDU1LjJ2MTYuMTdjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3VjE5LjJMMCwxOS4yeiIvPjwvZz48L3N2Zz4=">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_az.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/AZ-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI2MDAiPg0KPHJlY3Qgd2lkdGg9IjEyMDAiIGhlaWdodD0iNjAwIiBmaWxsPSIjNTA5ZTJmIi8+DQo8cmVjdCB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI0MDAiIGZpbGw9IiNlZjMzNDAiLz4NCjxyZWN0IHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0iIzAwYjVlMiIvPg0KPGNpcmNsZSBjeD0iNTcwIiBjeT0iMzAwIiByPSI5MCIgZmlsbD0iI2ZmZiIvPg0KPGNpcmNsZSBjeD0iNTkwIiBjeT0iMzAwIiByPSI3NSIgZmlsbD0iI2VmMzM0MCIvPg0KPHBhdGggZD0iTTY3MCAyNTBsOS41NjcgMjYuOTAzIDI1Ljc4OC0xMi4yNTgtMTIuMjU4IDI1Ljc4OEw3MjAgMzAwbC0yNi45MDMgOS41NjcgMTIuMjU4IDI1Ljc4OC0yNS43ODgtMTIuMjU4TDY3MCAzNTBsLTkuNTY3LTI2LjkwMy0yNS43ODggMTIuMjU4IDEyLjI1OC0yNS43ODhMNjIwIDMwMGwyNi45MDMtOS41NjctMTIuMjU4LTI1Ljc4OCAyNS43ODggMTIuMjU4eiIgZmlsbD0iI2ZmZiIvPg0KPC9zdmc+">
|
||||
</a>
|
||||
<br>
|
||||
<a href="https://pkg.go.dev/github.com/gofiber/fiber/v3#pkg-overview">
|
||||
<img src="https://img.shields.io/badge/%F0%9F%93%9A%20godoc-pkg-00ACD7.svg?color=00ACD7&style=flat-square">
|
||||
@ -114,7 +122,7 @@ func main() {
|
||||
|
||||
## ⚙️ 설치
|
||||
|
||||
Go가 설치되어 있는 것을 확인해 주세요 ([download](https://go.dev/dl/)). 버전 1.16 또는 그 이상이어야 합니다.
|
||||
Go가 설치되어 있는 것을 확인해 주세요 ([download](https://go.dev/dl/)). 버전 1.17 또는 그 이상이어야 합니다.
|
||||
|
||||
폴더를 생성하여 당신의 프로젝트를 초기화하고, 폴더 안에서 `go mod init github.com/your/repo` ([learn more](https://go.dev/blog/using-go-modules)) 를 실행하세요. 그리고 [`go get`](https://pkg.go.dev/cmd/go/#hdr-Add_dependencies_to_current_module_and_install_them) 명령어로 Fiber를 설치하세요:
|
||||
|
||||
@ -124,7 +132,7 @@ go get -u github.com/gofiber/fiber/v3
|
||||
|
||||
## 🎯 특징
|
||||
|
||||
- 견고한 [라우팅](https://docs.gofiber.io/routing)
|
||||
- 견고한 [라우팅](https://docs.gofiber.io/guide/routing)
|
||||
- [정적 파일](https://docs.gofiber.io/api/app#static) 제공
|
||||
- 뛰어난 [성능](https://docs.gofiber.io/extra/benchmarks)
|
||||
- [적은 메모리](https://docs.gofiber.io/extra/benchmarks) 공간
|
||||
@ -147,7 +155,7 @@ Fiber는 인터넷에서 가장 인기있는 웹 프레임워크인 Express에
|
||||
우리는 **어떤한** 작업, **마감일정**, 개발자의 **기술**이던간에 **빠르고**, **유연하고**, **익숙한** Go 웹 프레임워크를 만들기 위해 사용자들의 [이슈들](https://github.com/gofiber/fiber/issues)을(그리고 모든 인터넷을 통해) **듣고 있습니다**! Express가 자바스크립트 세계에서 하는 것 처럼요.
|
||||
|
||||
## ⚠️ 한계점
|
||||
* Fiber는 unsafe 패키지를 사용하기 때문에 최신 Go버전과 호환되지 않을 수 있습니다.Fiber 2.40.0은 Go 버전 1.16에서 1.20로 테스트되고 있습니다.
|
||||
* Fiber는 unsafe 패키지를 사용하기 때문에 최신 Go버전과 호환되지 않을 수 있습니다.Fiber 2.40.0은 Go 버전 1.17에서 1.20로 테스트되고 있습니다.
|
||||
* Fiber는 net/http 인터페이스와 호환되지 않습니다.즉, gqlgen이나 go-swagger 등 net/http 생태계의 일부인 프로젝트를 사용할 수 없습니다.
|
||||
|
||||
## 👀 예제
|
||||
@ -440,7 +448,7 @@ func main() {
|
||||
|
||||
### JSON Response
|
||||
|
||||
📖 [JSON](https://docs.gofiber.io/ctx#json)
|
||||
📖 [JSON](https://docs.gofiber.io/api/ctx#json)
|
||||
|
||||
```go
|
||||
type User struct {
|
||||
@ -595,6 +603,11 @@ Fiber 프레임워크에 포함되는 미들웨어 목록입니다.
|
||||
| [session](https://github.com/gofiber/fiber/tree/master/middleware/session) | Session middleware. NOTE: This middleware uses our Storage package. |
|
||||
| [skip](https://github.com/gofiber/fiber/tree/master/middleware/skip) | Skip middleware that skips a wrapped handler is a predicate is true. |
|
||||
| [timeout](https://github.com/gofiber/fiber/tree/master/middleware/timeout) | Adds a max time for a request and forwards to ErrorHandler if it is exceeded. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth middleware provides a key based authentication. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Redirect middleware |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware rewrites the URL path based on provided rules. It can be helpful for backward compatibility or just creating cleaner and more descriptive links. |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converter for net/http handlers to/from Fiber request handlers, special thanks to @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Helps secure your apps by setting various HTTP headers. |
|
||||
|
||||
## 🧬 External Middleware
|
||||
|
||||
@ -602,12 +615,7 @@ Fiber 프레임워크에 포함되는 미들웨어 목록입니다.
|
||||
|
||||
| Middleware | Description |
|
||||
| :------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converter for net/http handlers to/from Fiber request handlers, special thanks to @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Helps secure your apps by setting various HTTP headers. |
|
||||
| [jwt](https://github.com/gofiber/jwt) | JWT returns a JSON Web Token \(JWT\) auth middleware. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth middleware provides a key based authentication. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Redirect middleware |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware rewrites the URL path based on provided rules. It can be helpful for backward compatibility or just creating cleaner and more descriptive links. |
|
||||
| [storage](https://github.com/gofiber/storage) | Premade storage drivers that implement the Storage interface, designed to be used with various Fiber middlewares. |
|
||||
| [template](https://github.com/gofiber/template) | This package contains 8 template engines that can be used with Fiber `v1.10.x` Go version 1.13 or higher is required. |
|
||||
| [websocket](https://github.com/gofiber/websocket) | Based on Fasthttp WebSocket for Fiber with Locals support! |
|
||||
@ -669,7 +677,6 @@ Copyright (c) 2019-present [Fenny](https://github.com/fenny) and [Contributors](
|
||||
- [runewidth](https://github.com/mattn/go-runewidth/blob/master/LICENSE)
|
||||
- [fasthttp](https://github.com/valyala/fasthttp/blob/master/LICENSE)
|
||||
- [bytebufferpool](https://github.com/valyala/bytebufferpool/blob/master/LICENSE)
|
||||
- [dictpool](https://github.com/savsgio/dictpool/blob/master/LICENSE)
|
||||
- [fwd](https://github.com/philhofer/fwd/blob/master/LICENSE.md)
|
||||
- [go-ole](https://github.com/go-ole/go-ole/blob/master/LICENSE)
|
||||
- [gopsutil](https://github.com/shirou/gopsutil/blob/master/LICENSE)
|
||||
|
33
.github/README_nl.md
vendored
33
.github/README_nl.md
vendored
@ -1,6 +1,11 @@
|
||||
<p align="center">
|
||||
<a href="https://gofiber.io">
|
||||
<img alt="Fiber" height="125" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
|
||||
<picture>
|
||||
<source height="125" media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo-dark.svg">
|
||||
<img height="125" alt="Fiber" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
</picture>
|
||||
|
||||
</a>
|
||||
<br>
|
||||
<!-- base64 flags are available at https://www.phoca.cz/cssflags/ -->
|
||||
@ -58,6 +63,9 @@
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_uk.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/UK-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDU1LjIgMzguNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTUuMiAzOC40IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwhW0NEQVRBWwoJLnN0MHtmaWxsOiNGRkQ1MDA7fQoJLnN0MXtmaWxsOiMwMDVCQkI7fQpdXT48L3N0eWxlPjxnPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0zLjAzLDBoNDkuMTNjMS42NywwLDMuMDMsMS4zNiwzLjAzLDMuMDN2MzIuMzNjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3IFYzLjAzQzAsMS4zNiwxLjM3LDAsMy4wMywwTDMuMDMsMHoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMCwxOS4yaDU1LjJ2MTYuMTdjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3VjE5LjJMMCwxOS4yeiIvPjwvZz48L3N2Zz4=">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_az.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/AZ-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI2MDAiPg0KPHJlY3Qgd2lkdGg9IjEyMDAiIGhlaWdodD0iNjAwIiBmaWxsPSIjNTA5ZTJmIi8+DQo8cmVjdCB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI0MDAiIGZpbGw9IiNlZjMzNDAiLz4NCjxyZWN0IHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0iIzAwYjVlMiIvPg0KPGNpcmNsZSBjeD0iNTcwIiBjeT0iMzAwIiByPSI5MCIgZmlsbD0iI2ZmZiIvPg0KPGNpcmNsZSBjeD0iNTkwIiBjeT0iMzAwIiByPSI3NSIgZmlsbD0iI2VmMzM0MCIvPg0KPHBhdGggZD0iTTY3MCAyNTBsOS41NjcgMjYuOTAzIDI1Ljc4OC0xMi4yNTgtMTIuMjU4IDI1Ljc4OEw3MjAgMzAwbC0yNi45MDMgOS41NjcgMTIuMjU4IDI1Ljc4OC0yNS43ODgtMTIuMjU4TDY3MCAzNTBsLTkuNTY3LTI2LjkwMy0yNS43ODggMTIuMjU4IDEyLjI1OC0yNS43ODhMNjIwIDMwMGwyNi45MDMtOS41NjctMTIuMjU4LTI1Ljc4OCAyNS43ODggMTIuMjU4eiIgZmlsbD0iI2ZmZiIvPg0KPC9zdmc+">
|
||||
</a>
|
||||
<br>
|
||||
<a href="https://pkg.go.dev/github.com/gofiber/fiber/v3#pkg-overview">
|
||||
<img src="https://img.shields.io/badge/%F0%9F%93%9A%20godoc-pkg-00ACD7.svg?color=00ACD7&style=flat-square">
|
||||
@ -114,7 +122,7 @@ Deze tests zijn uitgevoerd door [TechEmpower](https://www.techempower.com/benchm
|
||||
|
||||
## ⚙️ Installatie
|
||||
|
||||
Make sure you have Go installed ([download](https://go.dev/dl/)). Version `1.16` or higher is required.
|
||||
Make sure you have Go installed ([download](https://go.dev/dl/)). Version `1.17` or higher is required.
|
||||
|
||||
Initialize your project by creating a folder and then running `go mod init github.com/your/repo` ([learn more](https://go.dev/blog/using-go-modules)) inside the folder. Then install Fiber with the [`go get`](https://pkg.go.dev/cmd/go/#hdr-Add_dependencies_to_current_module_and_install_them) command:
|
||||
|
||||
@ -124,17 +132,17 @@ go get -u github.com/gofiber/fiber/v3
|
||||
|
||||
## 🎯 Features
|
||||
|
||||
- Robuuste [routing](https://docs.gofiber.io/routing)
|
||||
- Robuuste [routing](https://docs.gofiber.io/guide/routing)
|
||||
- Serveer [statische bestanden](https://docs.gofiber.io/api/app#static)
|
||||
- Extreme [prestaties](https://docs.gofiber.io/extra/benchmarks)
|
||||
- [Weinig geheugenruimte](https://docs.gofiber.io/extra/benchmarks)
|
||||
- [API endpoints](https://docs.gofiber.io/api/ctx)
|
||||
- [Middleware](https://docs.gofiber.io/middleware) & [Next](https://docs.gofiber.io/api/ctx#next) ondersteuning
|
||||
- [Middleware](https://docs.gofiber.io/category/-middleware) & [Next](https://docs.gofiber.io/api/ctx#next) ondersteuning
|
||||
- [Snelle](https://dev.to/koddr/welcome-to-fiber-an-express-js-styled-fastest-web-framework-written-with-on-golang-497) server-side programmering
|
||||
- [Template engines](https://github.com/gofiber/template)
|
||||
- [WebSocket ondersteuning](https://github.com/gofiber/websocket)
|
||||
- [Server-Sent events](https://github.com/gofiber/recipes/tree/master/sse)
|
||||
- [Rate Limiter](https://docs.gofiber.io/middleware/limiter)
|
||||
- [Rate Limiter](https://docs.gofiber.io/category/-middleware/limiter)
|
||||
- Vertaald in [18 talen](https://docs.gofiber.io/)
|
||||
- En nog veel meer, [ontdek Fiber](https://docs.gofiber.io/)
|
||||
|
||||
@ -147,7 +155,7 @@ Fiber is **geïnspireerd** door Express, het populairste webframework op interne
|
||||
We **luisteren** naar onze gebruikers in [issues](https://github.com/gofiber/fiber/issues) (_en overal op het internet_) om een **snelle**, **flexibele** en **vriendelijk** Go web framework te maken voor **elke** taak, **deadline** en ontwikkelaar **vaardigheid**! Net zoals Express dat doet in de JavaScript-wereld.
|
||||
|
||||
## ⚠️ Limitations
|
||||
* Due to Fiber's usage of unsafe, the library may not always be compatible with the latest Go version. Fiber 2.40.0 has been tested with Go versions 1.16 to 1.20.
|
||||
* Due to Fiber's usage of unsafe, the library may not always be compatible with the latest Go version. Fiber 2.40.0 has been tested with Go versions 1.17 to 1.20.
|
||||
* Fiber is not compatible with net/http interfaces. This means you will not be able to use projects like gqlgen, go-swagger, or any others which are part of the net/http ecosystem.
|
||||
|
||||
## 👀 Voorbeelden
|
||||
@ -440,7 +448,7 @@ func main() {
|
||||
|
||||
### JSON Response
|
||||
|
||||
📖 [JSON](https://docs.gofiber.io/ctx#json)
|
||||
📖 [JSON](https://docs.gofiber.io/api/ctx#json)
|
||||
|
||||
```go
|
||||
type User struct {
|
||||
@ -595,6 +603,11 @@ Here is a list of middleware that are included within the Fiber framework.
|
||||
| [session](https://github.com/gofiber/fiber/tree/master/middleware/session) | Session middleware. NOTE: This middleware uses our Storage package. |
|
||||
| [skip](https://github.com/gofiber/fiber/tree/master/middleware/skip) | Skip middleware that skips a wrapped handler is a predicate is true. |
|
||||
| [timeout](https://github.com/gofiber/fiber/tree/master/middleware/timeout) | Adds a max time for a request and forwards to ErrorHandler if it is exceeded. |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converter for net/http handlers to/from Fiber request handlers, special thanks to @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Helps secure your apps by setting various HTTP headers. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth middleware provides a key based authentication. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Redirect middleware |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware rewrites the URL path based on provided rules. It can be helpful for backward compatibility or just creating cleaner and more descriptive links. |
|
||||
|
||||
## 🧬 External Middleware
|
||||
|
||||
@ -602,12 +615,7 @@ List of externally hosted middleware modules and maintained by the [Fiber team](
|
||||
|
||||
| Middleware | Description |
|
||||
| :------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converter for net/http handlers to/from Fiber request handlers, special thanks to @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Helps secure your apps by setting various HTTP headers. |
|
||||
| [jwt](https://github.com/gofiber/jwt) | JWT returns a JSON Web Token \(JWT\) auth middleware. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth middleware provides a key based authentication. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Redirect middleware |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware rewrites the URL path based on provided rules. It can be helpful for backward compatibility or just creating cleaner and more descriptive links. |
|
||||
| [storage](https://github.com/gofiber/storage) | Premade storage drivers that implement the Storage interface, designed to be used with various Fiber middlewares. |
|
||||
| [template](https://github.com/gofiber/template) | This package contains 8 template engines that can be used with Fiber `v1.10.x` Go version 1.13 or higher is required. |
|
||||
| [websocket](https://github.com/gofiber/websocket) | Based on Fasthttp WebSocket for Fiber with Locals support! |
|
||||
@ -669,7 +677,6 @@ Copyright (c) 2019-present [Fenny](https://github.com/fenny) and [Contributors](
|
||||
- [runewidth](https://github.com/mattn/go-runewidth/blob/master/LICENSE)
|
||||
- [fasthttp](https://github.com/valyala/fasthttp/blob/master/LICENSE)
|
||||
- [bytebufferpool](https://github.com/valyala/bytebufferpool/blob/master/LICENSE)
|
||||
- [dictpool](https://github.com/savsgio/dictpool/blob/master/LICENSE)
|
||||
- [fwd](https://github.com/philhofer/fwd/blob/master/LICENSE.md)
|
||||
- [go-ole](https://github.com/go-ole/go-ole/blob/master/LICENSE)
|
||||
- [gopsutil](https://github.com/shirou/gopsutil/blob/master/LICENSE)
|
||||
|
29
.github/README_pt.md
vendored
29
.github/README_pt.md
vendored
@ -1,6 +1,11 @@
|
||||
<p align="center">
|
||||
<a href="https://gofiber.io">
|
||||
<img alt="Fiber" height="125" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
|
||||
<picture>
|
||||
<source height="125" media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo-dark.svg">
|
||||
<img height="125" alt="Fiber" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
</picture>
|
||||
|
||||
</a>
|
||||
<br>
|
||||
<!-- base64 flags are available at https://www.phoca.cz/cssflags/ -->
|
||||
@ -58,6 +63,9 @@
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_uk.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/UK-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDU1LjIgMzguNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTUuMiAzOC40IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwhW0NEQVRBWwoJLnN0MHtmaWxsOiNGRkQ1MDA7fQoJLnN0MXtmaWxsOiMwMDVCQkI7fQpdXT48L3N0eWxlPjxnPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0zLjAzLDBoNDkuMTNjMS42NywwLDMuMDMsMS4zNiwzLjAzLDMuMDN2MzIuMzNjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3IFYzLjAzQzAsMS4zNiwxLjM3LDAsMy4wMywwTDMuMDMsMHoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMCwxOS4yaDU1LjJ2MTYuMTdjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3VjE5LjJMMCwxOS4yeiIvPjwvZz48L3N2Zz4=">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_az.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/AZ-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI2MDAiPg0KPHJlY3Qgd2lkdGg9IjEyMDAiIGhlaWdodD0iNjAwIiBmaWxsPSIjNTA5ZTJmIi8+DQo8cmVjdCB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI0MDAiIGZpbGw9IiNlZjMzNDAiLz4NCjxyZWN0IHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0iIzAwYjVlMiIvPg0KPGNpcmNsZSBjeD0iNTcwIiBjeT0iMzAwIiByPSI5MCIgZmlsbD0iI2ZmZiIvPg0KPGNpcmNsZSBjeD0iNTkwIiBjeT0iMzAwIiByPSI3NSIgZmlsbD0iI2VmMzM0MCIvPg0KPHBhdGggZD0iTTY3MCAyNTBsOS41NjcgMjYuOTAzIDI1Ljc4OC0xMi4yNTgtMTIuMjU4IDI1Ljc4OEw3MjAgMzAwbC0yNi45MDMgOS41NjcgMTIuMjU4IDI1Ljc4OC0yNS43ODgtMTIuMjU4TDY3MCAzNTBsLTkuNTY3LTI2LjkwMy0yNS43ODggMTIuMjU4IDEyLjI1OC0yNS43ODhMNjIwIDMwMGwyNi45MDMtOS41NjctMTIuMjU4LTI1Ljc4OCAyNS43ODggMTIuMjU4eiIgZmlsbD0iI2ZmZiIvPg0KPC9zdmc+">
|
||||
</a>
|
||||
<br>
|
||||
<a href="https://pkg.go.dev/github.com/gofiber/fiber/v3#pkg-overview">
|
||||
<img src="https://img.shields.io/badge/%F0%9F%93%9A%20godoc-pkg-00ACD7.svg?color=00ACD7&style=flat-square">
|
||||
@ -114,7 +122,7 @@ Esses testes são realizados pelo [TechEmpower](https://www.techempower.com/benc
|
||||
|
||||
## ⚙️ Instalação
|
||||
|
||||
Certifique-se de ter o Go instalado ([download](https://go.dev/dl/)). Versão `1.16` ou superior é obrigatória.
|
||||
Certifique-se de ter o Go instalado ([download](https://go.dev/dl/)). Versão `1.17` ou superior é obrigatória.
|
||||
|
||||
Inicie seu projeto criando um diretório e então execute `go mod init github.com/your/repo` ([saiba mais](https://go.dev/blog/using-go-modules)) dentro dele. Então, instale o Fiber com o comando [`go get`](https://pkg.go.dev/cmd/go/#hdr-Add_dependencies_to_current_module_and_install_them):
|
||||
|
||||
@ -124,7 +132,7 @@ go get -u github.com/gofiber/fiber/v3
|
||||
|
||||
## 🎯 Recursos
|
||||
|
||||
- [Roteamento](https://docs.gofiber.io/routing) robusto
|
||||
- [Roteamento](https://docs.gofiber.io/guide/routing) robusto
|
||||
- Servir [arquivos estáticos](https://docs.gofiber.io/api/app#static)
|
||||
- [Desempenho](https://docs.gofiber.io/extra/benchmarks) extremo
|
||||
- [Baixo consumo de memória](https://docs.gofiber.io/extra/benchmarks)
|
||||
@ -145,7 +153,7 @@ Os novos gophers que mudaram do [Node.js](https://nodejs.org/en/about/) para o [
|
||||
O Fiber é **inspirado** no Express, o framework web mais popular da Internet. Combinamos a **facilidade** do Express e com o **desempenho bruto** do Go. Se você já implementou um aplicativo web com Node.js ( _usando Express.js ou similar_ ), então muitos métodos e princípios parecerão **muito familiares** para você.
|
||||
|
||||
## ⚠️ Limitations
|
||||
* Due to Fiber's usage of unsafe, the library may not always be compatible with the latest Go version. Fiber 2.40.0 has been tested with Go versions 1.16 to 1.20.
|
||||
* Due to Fiber's usage of unsafe, the library may not always be compatible with the latest Go version. Fiber 2.40.0 has been tested with Go versions 1.17 to 1.20.
|
||||
* Fiber is not compatible with net/http interfaces. This means you will not be able to use projects like gqlgen, go-swagger, or any others which are part of the net/http ecosystem.
|
||||
|
||||
## 👀 Exemplos
|
||||
@ -434,7 +442,7 @@ func main() {
|
||||
|
||||
### Resposta JSON
|
||||
|
||||
📖 [JSON](https://docs.gofiber.io/ctx#json)
|
||||
📖 [JSON](https://docs.gofiber.io/api/ctx#json)
|
||||
|
||||
```go
|
||||
type User struct {
|
||||
@ -589,6 +597,11 @@ Here is a list of middleware that are included within the Fiber framework.
|
||||
| [session](https://github.com/gofiber/fiber/tree/master/middleware/session) | Session middleware. NOTE: This middleware uses our Storage package. |
|
||||
| [skip](https://github.com/gofiber/fiber/tree/master/middleware/skip) | Skip middleware that skips a wrapped handler is a predicate is true. |
|
||||
| [timeout](https://github.com/gofiber/fiber/tree/master/middleware/timeout) | Adds a max time for a request and forwards to ErrorHandler if it is exceeded. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth middleware provides a key based authentication. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Redirect middleware |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware rewrites the URL path based on provided rules. It can be helpful for backward compatibility or just creating cleaner and more descriptive links. |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converter for net/http handlers to/from Fiber request handlers, special thanks to @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Helps secure your apps by setting various HTTP headers. |
|
||||
|
||||
## 🧬 External Middleware
|
||||
|
||||
@ -596,12 +609,7 @@ List of externally hosted middleware modules and maintained by the [Fiber team](
|
||||
|
||||
| Middleware | Description |
|
||||
| :------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converter for net/http handlers to/from Fiber request handlers, special thanks to @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Helps secure your apps by setting various HTTP headers. |
|
||||
| [jwt](https://github.com/gofiber/jwt) | JWT returns a JSON Web Token \(JWT\) auth middleware. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth middleware provides a key based authentication. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Redirect middleware |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware rewrites the URL path based on provided rules. It can be helpful for backward compatibility or just creating cleaner and more descriptive links. |
|
||||
| [storage](https://github.com/gofiber/storage) | Premade storage drivers that implement the Storage interface, designed to be used with various Fiber middlewares. |
|
||||
| [template](https://github.com/gofiber/template) | This package contains 8 template engines that can be used with Fiber `v1.10.x` Go version 1.13 or higher is required. |
|
||||
| [websocket](https://github.com/gofiber/websocket) | Based on Fasthttp WebSocket for Fiber with Locals support! |
|
||||
@ -665,7 +673,6 @@ O logo oficial foi criado por [Vic Shóstak](https://github.com/koddr) e distrib
|
||||
- [runewidth](https://github.com/mattn/go-runewidth/blob/master/LICENSE)
|
||||
- [fasthttp](https://github.com/valyala/fasthttp/blob/master/LICENSE)
|
||||
- [bytebufferpool](https://github.com/valyala/bytebufferpool/blob/master/LICENSE)
|
||||
- [dictpool](https://github.com/savsgio/dictpool/blob/master/LICENSE)
|
||||
- [fwd](https://github.com/philhofer/fwd/blob/master/LICENSE.md)
|
||||
- [go-ole](https://github.com/go-ole/go-ole/blob/master/LICENSE)
|
||||
- [gopsutil](https://github.com/shirou/gopsutil/blob/master/LICENSE)
|
||||
|
43
.github/README_ru.md
vendored
43
.github/README_ru.md
vendored
@ -1,6 +1,11 @@
|
||||
<p align="center">
|
||||
<a href="https://gofiber.io">
|
||||
<img alt="Fiber" height="125" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
|
||||
<picture>
|
||||
<source height="125" media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo-dark.svg">
|
||||
<img height="125" alt="Fiber" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
</picture>
|
||||
|
||||
</a>
|
||||
<br>
|
||||
<!-- base64 flags are available at https://www.phoca.cz/cssflags/ -->
|
||||
@ -58,6 +63,9 @@
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_uk.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/UK-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDU1LjIgMzguNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTUuMiAzOC40IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwhW0NEQVRBWwoJLnN0MHtmaWxsOiNGRkQ1MDA7fQoJLnN0MXtmaWxsOiMwMDVCQkI7fQpdXT48L3N0eWxlPjxnPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0zLjAzLDBoNDkuMTNjMS42NywwLDMuMDMsMS4zNiwzLjAzLDMuMDN2MzIuMzNjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3IFYzLjAzQzAsMS4zNiwxLjM3LDAsMy4wMywwTDMuMDMsMHoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMCwxOS4yaDU1LjJ2MTYuMTdjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3VjE5LjJMMCwxOS4yeiIvPjwvZz48L3N2Zz4=">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_az.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/AZ-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI2MDAiPg0KPHJlY3Qgd2lkdGg9IjEyMDAiIGhlaWdodD0iNjAwIiBmaWxsPSIjNTA5ZTJmIi8+DQo8cmVjdCB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI0MDAiIGZpbGw9IiNlZjMzNDAiLz4NCjxyZWN0IHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0iIzAwYjVlMiIvPg0KPGNpcmNsZSBjeD0iNTcwIiBjeT0iMzAwIiByPSI5MCIgZmlsbD0iI2ZmZiIvPg0KPGNpcmNsZSBjeD0iNTkwIiBjeT0iMzAwIiByPSI3NSIgZmlsbD0iI2VmMzM0MCIvPg0KPHBhdGggZD0iTTY3MCAyNTBsOS41NjcgMjYuOTAzIDI1Ljc4OC0xMi4yNTgtMTIuMjU4IDI1Ljc4OEw3MjAgMzAwbC0yNi45MDMgOS41NjcgMTIuMjU4IDI1Ljc4OC0yNS43ODgtMTIuMjU4TDY3MCAzNTBsLTkuNTY3LTI2LjkwMy0yNS43ODggMTIuMjU4IDEyLjI1OC0yNS43ODhMNjIwIDMwMGwyNi45MDMtOS41NjctMTIuMjU4LTI1Ljc4OCAyNS43ODggMTIuMjU4eiIgZmlsbD0iI2ZmZiIvPg0KPC9zdmc+">
|
||||
</a>
|
||||
<br>
|
||||
<a href="https://pkg.go.dev/github.com/gofiber/fiber/v3#pkg-overview">
|
||||
<img src="https://img.shields.io/badge/%F0%9F%93%9A%20godoc-pkg-00ACD7.svg?color=00ACD7&style=flat-square">
|
||||
@ -114,7 +122,7 @@ func main() {
|
||||
|
||||
## ⚙️ Установка
|
||||
|
||||
Убедитесь, что Go установлен ([скачать](https://go.dev/dl/)). Требуется версия `1.16` или выше.
|
||||
Убедитесь, что Go установлен ([скачать](https://go.dev/dl/)). Требуется версия `1.17` или выше.
|
||||
|
||||
Инициализируйте проект, создав папку, а затем запустив `go mod init github.com/your/repo` ([подробнее](https://go.dev/blog/using-go-modules)) внутри этой папки. Далее, установите Fiber с помощью команды [`go get`](https://pkg.go.dev/cmd/go/#hdr-Add_dependencies_to_current_module_and_install_them):
|
||||
|
||||
@ -124,12 +132,12 @@ go get -u github.com/gofiber/fiber/v3
|
||||
|
||||
## 🎯 Особенности
|
||||
|
||||
- Надежная [маршрутизация](https://docs.gofiber.io/routing)
|
||||
- Надежная [маршрутизация](https://docs.gofiber.io/guide/routing)
|
||||
- Доступ к [статичным файлам](https://docs.gofiber.io/api/app#static)
|
||||
- Экстремальная [производительность](https://docs.gofiber.io/extra/benchmarks)
|
||||
- [Низкий объем потребления памяти](https://docs.gofiber.io/extra/benchmarks)
|
||||
- [Эндпоинты](https://docs.gofiber.io/context), как в [API](https://docs.gofiber.io/api/ctx) Express
|
||||
- [Middleware](https://docs.gofiber.io/middleware) и поддержка [Next](https://docs.gofiber.io/api/ctx#next)
|
||||
- [Middleware](https://docs.gofiber.io/category/-middleware) и поддержка [Next](https://docs.gofiber.io/api/ctx#next)
|
||||
- [Быстрое](https://dev.to/koddr/welcome-to-fiber-an-express-js-styled-fastest-web-framework-written-with-on-golang-497) программирование на стороне сервера
|
||||
- [Template engines](https://github.com/gofiber/template)
|
||||
- [Поддержка WebSocket](https://github.com/gofiber/websocket)
|
||||
@ -146,9 +154,9 @@ Fiber **вдохновлен** Express, самым популярным веб
|
||||
|
||||
Мы **прислушиваемся** к нашим пользователям в [issues](https://github.com/gofiber/fiber/issues), Discord [канале](https://gofiber.io/discord) _и в остальном Интернете_, чтобы создать **быстрый**, **гибкий** и **дружелюбный** веб фреймворк на Go для **любых** задач, **дедлайнов** и **уровней** разработчиков! Как это делает Express в мире JavaScript.
|
||||
|
||||
## ⚠️ Limitations
|
||||
* Due to Fiber's usage of unsafe, the library may not always be compatible with the latest Go version. Fiber 2.40.0 has been tested with Go versions 1.16 to 1.20.
|
||||
* Fiber is not compatible with net/http interfaces. This means you will not be able to use projects like gqlgen, go-swagger, or any others which are part of the net/http ecosystem.
|
||||
## ⚠️ Ограничения
|
||||
* Из-за того, что Fiber использует пакет unsafe, библиотека не всегда может быть совместима с последней версией Go. Fiber 2.40.0 был протестирован с версиями Go от 1.17 до 1.20.
|
||||
* Fiber не совместим с интерфейсами net/http. Это означает, что вы не сможете использовать такие проекты, как gqlgen, go-swagger или любые другие, которые являются частью экосистемы net/http.
|
||||
|
||||
## 👀 Примеры
|
||||
|
||||
@ -436,7 +444,7 @@ func main() {
|
||||
|
||||
### JSON Response
|
||||
|
||||
📖 [JSON](https://docs.gofiber.io/ctx#json)
|
||||
📖 [JSON](https://docs.gofiber.io/api/ctx#json)
|
||||
|
||||
```go
|
||||
type User struct {
|
||||
@ -596,6 +604,11 @@ func main() {
|
||||
| [session](https://github.com/gofiber/fiber/tree/master/middleware/session) | Session middleware. NOTE: This middleware uses our Storage package. |
|
||||
| [skip](https://github.com/gofiber/fiber/tree/master/middleware/skip) | Skip middleware that skips a wrapped handler is a predicate is true. |
|
||||
| [timeout](https://github.com/gofiber/fiber/tree/master/middleware/timeout) | Adds a max time for a request and forwards to ErrorHandler if it is exceeded. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth middleware provides a key based authentication. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Redirect middleware |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware rewrites the URL path based on provided rules. It can be helpful for backward compatibility or just creating cleaner and more descriptive links. |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converter for net/http handlers to/from Fiber request handlers, special thanks to @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Helps secure your apps by setting various HTTP headers. |
|
||||
|
||||
## 🧬 Внешние Middleware
|
||||
|
||||
@ -603,19 +616,14 @@ func main() {
|
||||
|
||||
| Middleware | Описание |
|
||||
| :------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converter for net/http handlers to/from Fiber request handlers, special thanks to @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Helps secure your apps by setting various HTTP headers. |
|
||||
| [jwt](https://github.com/gofiber/jwt) | JWT returns a JSON Web Token \(JWT\) auth middleware. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth middleware provides a key based authentication. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Redirect middleware |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware rewrites the URL path based on provided rules. It can be helpful for backward compatibility or just creating cleaner and more descriptive links. |
|
||||
| [storage](https://github.com/gofiber/storage) | Premade storage drivers that implement the Storage interface, designed to be used with various Fiber middlewares. |
|
||||
| [template](https://github.com/gofiber/template) | This package contains 8 template engines that can be used with Fiber `v1.10.x` Go version 1.13 or higher is required. |
|
||||
| [websocket](https://github.com/gofiber/websocket) | Based on Fasthttp WebSocket for Fiber with Locals support! |
|
||||
|
||||
## 🕶️ Awesome List
|
||||
## 🕶️ Полезный список
|
||||
|
||||
For more articles, middlewares, examples or tools check our [awesome list](https://github.com/gofiber/awesome-fiber).
|
||||
Дополнительные статьи, middleware, примеры или инструменты смотри в нашем [полезном списке](https://github.com/gofiber/awesome-fiber).
|
||||
|
||||
## 👍 Помощь проекту
|
||||
|
||||
@ -661,9 +669,9 @@ Fiber — это проект с открытым исходным кодом,
|
||||
|
||||
<img src="https://starchart.cc/gofiber/fiber.svg" alt="Stargazers over time" style="max-width: 100%">
|
||||
|
||||
## ⚠️ License
|
||||
## ⚠️ Лицензия
|
||||
|
||||
Copyright (c) 2019-present [Fenny](https://github.com/fenny) and [Contributors](https://github.com/gofiber/fiber/graphs/contributors). `Fiber` is free and open-source software licensed under the [MIT License](https://github.com/gofiber/fiber/blob/master/LICENSE). Official logo was created by [Vic Shóstak](https://github.com/koddr) and distributed under [Creative Commons](https://creativecommons.org/licenses/by-sa/4.0/) license (CC BY-SA 4.0 International).
|
||||
Copyright (c) 2019-настоящее время [Fenny](https://github.com/fenny) и [Контрибьютеры](https://github.com/gofiber/fiber/graphs/contributors). `Fiber` - это свободное программное обсепечение с открытым исходным кодом лицензированное под [MIT License](https://github.com/gofiber/fiber/blob/master/LICENSE). Официальный логотип создан [Vic Shóstak](https://github.com/koddr) и распространяется под [Creative Commons](https://creativecommons.org/licenses/by-sa/4.0/) лицензией (CC BY-SA 4.0 International).
|
||||
|
||||
**Third-party library licenses**
|
||||
|
||||
@ -672,7 +680,6 @@ Copyright (c) 2019-present [Fenny](https://github.com/fenny) and [Contributors](
|
||||
- [runewidth](https://github.com/mattn/go-runewidth/blob/master/LICENSE)
|
||||
- [fasthttp](https://github.com/valyala/fasthttp/blob/master/LICENSE)
|
||||
- [bytebufferpool](https://github.com/valyala/bytebufferpool/blob/master/LICENSE)
|
||||
- [dictpool](https://github.com/savsgio/dictpool/blob/master/LICENSE)
|
||||
- [fwd](https://github.com/philhofer/fwd/blob/master/LICENSE.md)
|
||||
- [go-ole](https://github.com/go-ole/go-ole/blob/master/LICENSE)
|
||||
- [gopsutil](https://github.com/shirou/gopsutil/blob/master/LICENSE)
|
||||
|
31
.github/README_sa.md
vendored
31
.github/README_sa.md
vendored
@ -1,6 +1,11 @@
|
||||
<p align="center">
|
||||
<a href="https://gofiber.io">
|
||||
<img alt="Fiber" height="125" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
|
||||
<picture>
|
||||
<source height="125" media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo-dark.svg">
|
||||
<img height="125" alt="Fiber" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
</picture>
|
||||
|
||||
</a>
|
||||
<br>
|
||||
<!-- base64 flags are available at https://www.phoca.cz/cssflags/ -->
|
||||
@ -58,6 +63,9 @@
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_uk.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/UK-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDU1LjIgMzguNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTUuMiAzOC40IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwhW0NEQVRBWwoJLnN0MHtmaWxsOiNGRkQ1MDA7fQoJLnN0MXtmaWxsOiMwMDVCQkI7fQpdXT48L3N0eWxlPjxnPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0zLjAzLDBoNDkuMTNjMS42NywwLDMuMDMsMS4zNiwzLjAzLDMuMDN2MzIuMzNjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3IFYzLjAzQzAsMS4zNiwxLjM3LDAsMy4wMywwTDMuMDMsMHoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMCwxOS4yaDU1LjJ2MTYuMTdjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3VjE5LjJMMCwxOS4yeiIvPjwvZz48L3N2Zz4=">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_az.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/AZ-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI2MDAiPg0KPHJlY3Qgd2lkdGg9IjEyMDAiIGhlaWdodD0iNjAwIiBmaWxsPSIjNTA5ZTJmIi8+DQo8cmVjdCB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI0MDAiIGZpbGw9IiNlZjMzNDAiLz4NCjxyZWN0IHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0iIzAwYjVlMiIvPg0KPGNpcmNsZSBjeD0iNTcwIiBjeT0iMzAwIiByPSI5MCIgZmlsbD0iI2ZmZiIvPg0KPGNpcmNsZSBjeD0iNTkwIiBjeT0iMzAwIiByPSI3NSIgZmlsbD0iI2VmMzM0MCIvPg0KPHBhdGggZD0iTTY3MCAyNTBsOS41NjcgMjYuOTAzIDI1Ljc4OC0xMi4yNTgtMTIuMjU4IDI1Ljc4OEw3MjAgMzAwbC0yNi45MDMgOS41NjcgMTIuMjU4IDI1Ljc4OC0yNS43ODgtMTIuMjU4TDY3MCAzNTBsLTkuNTY3LTI2LjkwMy0yNS43ODggMTIuMjU4IDEyLjI1OC0yNS43ODhMNjIwIDMwMGwyNi45MDMtOS41NjctMTIuMjU4LTI1Ljc4OCAyNS43ODggMTIuMjU4eiIgZmlsbD0iI2ZmZiIvPg0KPC9zdmc+">
|
||||
</a>
|
||||
<br>
|
||||
<a href="https://pkg.go.dev/github.com/gofiber/fiber/v3#pkg-overview">
|
||||
<img src="https://img.shields.io/badge/%F0%9F%93%9A%20godoc-pkg-00ACD7.svg?color=00ACD7&style=flat-square">
|
||||
@ -120,7 +128,7 @@ func main() {
|
||||
|
||||
## ⚙️ تثبيت
|
||||
|
||||
تأكد من تثبيت Go ([تحميل](https://go.dev/dl/)). الإصدار `1.16` أو أعلى مطلوب.
|
||||
تأكد من تثبيت Go ([تحميل](https://go.dev/dl/)). الإصدار `1.17` أو أعلى مطلوب.
|
||||
|
||||
ابدأ مشروعك بإنشاء مجلد ثم تشغيله `go mod init github.com/your/repo` ([أعرف أكثر](https://go.dev/blog/using-go-modules))
|
||||
داخل المجلد. ثم قم بتثبيت Fiber باستخدام ملف [`go get`](https://pkg.go.dev/cmd/go/#hdr-Add_dependencies_to_current_module_and_install_them) أمر:
|
||||
@ -137,12 +145,12 @@ go get -u github.com/gofiber/fiber/v3
|
||||
|
||||
## 🎯 الميزات
|
||||
|
||||
- قوي [routing](https://docs.gofiber.io/routing)
|
||||
- قوي [routing](https://docs.gofiber.io/guide/routing)
|
||||
- يقدم خدمة [static files](https://docs.gofiber.io/api/app#static)
|
||||
- أقصى [أداء](https://docs.gofiber.io/extra/benchmarks)
|
||||
- [ذاكرة منخفضة](https://docs.gofiber.io/extra/benchmarks)
|
||||
- [API endpoints](https://docs.gofiber.io/api/ctx)
|
||||
- [Middleware](https://docs.gofiber.io/middleware) & [Next](https://docs.gofiber.io/api/ctx#next) مدعوم
|
||||
- [Middleware](https://docs.gofiber.io/category/-middleware) & [Next](https://docs.gofiber.io/api/ctx#next) مدعوم
|
||||
- [سريع](https://dev.to/koddr/welcome-to-fiber-an-express-js-styled-fastest-web-framework-written-with-on-golang-497) server-side programming
|
||||
- [Template engines](https://github.com/gofiber/template)
|
||||
- [WebSocket دعم](https://github.com/gofiber/websocket)
|
||||
@ -161,7 +169,7 @@ Fiber هو **مستوحى** من Express, إطار الويب الأكثر شع
|
||||
** و تطوير **مهارات**! فقط مثل Express تفعل لـ JavaScript عالم.
|
||||
|
||||
## ⚠️ Limitations
|
||||
* Due to Fiber's usage of unsafe, the library may not always be compatible with the latest Go version. Fiber 2.40.0 has been tested with Go versions 1.16 to 1.20.
|
||||
* Due to Fiber's usage of unsafe, the library may not always be compatible with the latest Go version. Fiber 2.40.0 has been tested with Go versions 1.17 to 1.20.
|
||||
* Fiber is not compatible with net/http interfaces. This means you will not be able to use projects like gqlgen, go-swagger, or any others which are part of the net/http ecosystem.
|
||||
|
||||
## 👀 أمثلة
|
||||
@ -490,7 +498,7 @@ func main() {
|
||||
|
||||
### JSON Response
|
||||
|
||||
📖 [JSON](https://docs.gofiber.io/ctx#json)
|
||||
📖 [JSON](https://docs.gofiber.io/api/ctx#json)
|
||||
|
||||
<div dir="ltr" >
|
||||
|
||||
@ -660,6 +668,11 @@ Here is a list of middleware that are included within the Fiber framework.
|
||||
| [session](https://github.com/gofiber/fiber/tree/master/middleware/session) | Session middleware. NOTE: This middleware uses our Storage package. |
|
||||
| [skip](https://github.com/gofiber/fiber/tree/master/middleware/skip) | Skip middleware that skips a wrapped handler is a predicate is true. |
|
||||
| [timeout](https://github.com/gofiber/fiber/tree/master/middleware/timeout) | Adds a max time for a request and forwards to ErrorHandler if it is exceeded. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth middleware provides a key based authentication. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Redirect middleware |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware rewrites the URL path based on provided rules. It can be helpful for backward compatibility or just creating cleaner and more descriptive links. |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converter for net/http handlers to/from Fiber request handlers, special thanks to @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Helps secure your apps by setting various HTTP headers. |
|
||||
|
||||
## 🧬 External Middleware
|
||||
|
||||
@ -667,12 +680,7 @@ List of externally hosted middleware modules and maintained by the [Fiber team](
|
||||
|
||||
| Middleware | Description |
|
||||
| :------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Converter for net/http handlers to/from Fiber request handlers, special thanks to @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Helps secure your apps by setting various HTTP headers. |
|
||||
| [jwt](https://github.com/gofiber/jwt) | JWT returns a JSON Web Token \(JWT\) auth middleware. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth middleware provides a key based authentication. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Redirect middleware |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware rewrites the URL path based on provided rules. It can be helpful for backward compatibility or just creating cleaner and more descriptive links. |
|
||||
| [storage](https://github.com/gofiber/storage) | Premade storage drivers that implement the Storage interface, designed to be used with various Fiber middlewares. |
|
||||
| [template](https://github.com/gofiber/template) | This package contains 8 template engines that can be used with Fiber `v1.10.x` Go version 1.13 or higher is required. |
|
||||
| [websocket](https://github.com/gofiber/websocket) | Based on Fasthttp WebSocket for Fiber with Locals support! |
|
||||
@ -734,7 +742,6 @@ Copyright (c) 2019-present [Fenny](https://github.com/fenny) and [Contributors](
|
||||
- [runewidth](https://github.com/mattn/go-runewidth/blob/master/LICENSE)
|
||||
- [fasthttp](https://github.com/valyala/fasthttp/blob/master/LICENSE)
|
||||
- [bytebufferpool](https://github.com/valyala/bytebufferpool/blob/master/LICENSE)
|
||||
- [dictpool](https://github.com/savsgio/dictpool/blob/master/LICENSE)
|
||||
- [fwd](https://github.com/philhofer/fwd/blob/master/LICENSE.md)
|
||||
- [go-ole](https://github.com/go-ole/go-ole/blob/master/LICENSE)
|
||||
- [gopsutil](https://github.com/shirou/gopsutil/blob/master/LICENSE)
|
||||
|
31
.github/README_tr.md
vendored
31
.github/README_tr.md
vendored
@ -1,6 +1,11 @@
|
||||
<p align="center">
|
||||
<a href="https://gofiber.io">
|
||||
<img alt="Fiber" height="125" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
|
||||
<picture>
|
||||
<source height="125" media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo-dark.svg">
|
||||
<img height="125" alt="Fiber" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
</picture>
|
||||
|
||||
</a>
|
||||
<br>
|
||||
<!-- base64 flags are available at https://www.phoca.cz/cssflags/ -->
|
||||
@ -55,6 +60,9 @@
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_uk.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/UK-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDU1LjIgMzguNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTUuMiAzOC40IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwhW0NEQVRBWwoJLnN0MHtmaWxsOiNGRkQ1MDA7fQoJLnN0MXtmaWxsOiMwMDVCQkI7fQpdXT48L3N0eWxlPjxnPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0zLjAzLDBoNDkuMTNjMS42NywwLDMuMDMsMS4zNiwzLjAzLDMuMDN2MzIuMzNjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3IFYzLjAzQzAsMS4zNiwxLjM3LDAsMy4wMywwTDMuMDMsMHoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMCwxOS4yaDU1LjJ2MTYuMTdjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3VjE5LjJMMCwxOS4yeiIvPjwvZz48L3N2Zz4=">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_az.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/AZ-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI2MDAiPg0KPHJlY3Qgd2lkdGg9IjEyMDAiIGhlaWdodD0iNjAwIiBmaWxsPSIjNTA5ZTJmIi8+DQo8cmVjdCB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI0MDAiIGZpbGw9IiNlZjMzNDAiLz4NCjxyZWN0IHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0iIzAwYjVlMiIvPg0KPGNpcmNsZSBjeD0iNTcwIiBjeT0iMzAwIiByPSI5MCIgZmlsbD0iI2ZmZiIvPg0KPGNpcmNsZSBjeD0iNTkwIiBjeT0iMzAwIiByPSI3NSIgZmlsbD0iI2VmMzM0MCIvPg0KPHBhdGggZD0iTTY3MCAyNTBsOS41NjcgMjYuOTAzIDI1Ljc4OC0xMi4yNTgtMTIuMjU4IDI1Ljc4OEw3MjAgMzAwbC0yNi45MDMgOS41NjcgMTIuMjU4IDI1Ljc4OC0yNS43ODgtMTIuMjU4TDY3MCAzNTBsLTkuNTY3LTI2LjkwMy0yNS43ODggMTIuMjU4IDEyLjI1OC0yNS43ODhMNjIwIDMwMGwyNi45MDMtOS41NjctMTIuMjU4LTI1Ljc4OCAyNS43ODggMTIuMjU4eiIgZmlsbD0iI2ZmZiIvPg0KPC9zdmc+">
|
||||
</a>
|
||||
<br>
|
||||
<a href="https://pkg.go.dev/github.com/gofiber/fiber/v3#pkg-overview">
|
||||
<img src="https://img.shields.io/badge/%F0%9F%93%9A%20godoc-pkg-00ACD7.svg?color=00ACD7&style=flat-square">
|
||||
@ -114,7 +122,7 @@ Bu testler [TechEmpower](https://www.techempower.com/benchmarks/#section=data-r1
|
||||
|
||||
## ⚙️ Kurulum
|
||||
|
||||
Go'nun `1.16` sürümü ([indir](https://go.dev/dl/)) veya daha yüksek bir sürüm gerekli.
|
||||
Go'nun `1.17` sürümü ([indir](https://go.dev/dl/)) veya daha yüksek bir sürüm gerekli.
|
||||
|
||||
Bir dizin oluşturup dizinin içinde `go mod init github.com/your/repo` komutunu yazarak projenizi geliştirmeye başlayın ([daha fazla öğren](https://go.dev/blog/using-go-modules)). Ardından Fiber'ı kurmak için [`go get`](https://pkg.go.dev/cmd/go/#hdr-Add_dependencies_to_current_module_and_install_them) komutunu çalıştırın:
|
||||
|
||||
@ -124,7 +132,7 @@ go get -u github.com/gofiber/fiber/v3
|
||||
|
||||
## 🎯 Özellikler
|
||||
|
||||
- Güçlü [routing](https://docs.gofiber.io/routing)
|
||||
- Güçlü [routing](https://docs.gofiber.io/guide/routing)
|
||||
- [Statik dosya](https://docs.gofiber.io/api/app#static) sunumu
|
||||
- Olağanüstü [performans](https://docs.gofiber.io/extra/benchmarks)
|
||||
- [Düşük bellek](https://docs.gofiber.io/extra/benchmarks) kullanımı
|
||||
@ -146,7 +154,7 @@ Fiber, internet üzerinde en popüler web framework'ü olan Express'ten **esinle
|
||||
|
||||
## ⚠️ Sınırlamalar
|
||||
|
||||
- Fiber unsafe kullanımı sebebiyle Go'nun son sürümüyle her zaman uyumlu olmayabilir. Fiber 2.40.0, Go 1.16 ile 1.20 sürümleriyle test edildi.
|
||||
- Fiber unsafe kullanımı sebebiyle Go'nun son sürümüyle her zaman uyumlu olmayabilir. Fiber 2.40.0, Go 1.17 ile 1.20 sürümleriyle test edildi.
|
||||
- Fiber net/http arabirimiyle uyumlu değildir. Yani gqlgen veya go-swagger gibi net/http ekosisteminin parçası olan projeleri kullanamazsınız.
|
||||
|
||||
## 👀 Örnekler
|
||||
@ -434,7 +442,7 @@ func main() {
|
||||
|
||||
### JSON Yanıtları
|
||||
|
||||
📖 [JSON](https://docs.gofiber.io/ctx#json)
|
||||
📖 [JSON](https://docs.gofiber.io/api/ctx#json)
|
||||
|
||||
```go
|
||||
type User struct {
|
||||
@ -589,6 +597,11 @@ Fiber'a dahil edilen middlewareların bir listesi aşağıda verilmiştir.
|
||||
| [session](https://github.com/gofiber/fiber/tree/master/middleware/session) | Session için middleware. NOTE: Bu middleware Fiber'in Storage yapısını kullanır. |
|
||||
| [skip](https://github.com/gofiber/fiber/tree/master/middleware/skip) | Skip middleware'ı verilen koşul `true` olduğunda handler'ı atlar ve işlemez. |
|
||||
| [timeout](https://github.com/gofiber/fiber/tree/master/middleware/timeout) | Bir request için maksimum süre ekler ve aşılırsa ErrorHandler'a iletir. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth middleware, key tabanlı bir authentication sağlar. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Yönlendirme middleware 'ı. |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware, sağlanan kurallara göre URL yolunu yeniden yazar. Geriye dönük uyumluluk için veya yalnızca daha temiz ve daha açıklayıcı bağlantılar oluşturmak için yardımcı olabilir. |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Fiber request handlerdan net/http handlerları için dönüştürücü, @arsmn'a özel teşekkürler! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Çeşitli HTTP headerları ayarlayarak uygulamalarınızın güvenliğini sağlamaya yardımcı olur. |
|
||||
|
||||
## 🧬 Harici Middlewarelar
|
||||
|
||||
@ -596,14 +609,9 @@ Harici olarak barındırılan middlewareların modüllerinin listesi. Bu middlew
|
||||
|
||||
| Middleware | Açıklama |
|
||||
| :------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Fiber request handlerdan net/http handlerları için dönüştürücü, @arsmn'a özel teşekkürler! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Çeşitli HTTP headerları ayarlayarak uygulamalarınızın güvenliğini sağlamaya yardımcı olur. |
|
||||
| [jwt](https://github.com/gofiber/jwt) | JWT, bir JSON Web Token \(JWT\) yetkilendirmesi döndüren middleware. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth middleware, key tabanlı bir authentication sağlar. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Yönlendirme middleware 'ı. |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite middleware, sağlanan kurallara göre URL yolunu yeniden yazar. Geriye dönük uyumluluk için veya yalnızca daha temiz ve daha açıklayıcı bağlantılar oluşturmak için yardımcı olabilir. |
|
||||
| [storage](https://github.com/gofiber/storage) | Fiber'in Storage yapısını destekleyen birçok storage driver'ı verir. Bu sayede depolama gerektiren Fiber middlewarelarında kolaylıkla kullanılabilir. |
|
||||
| [template](https://github.com/gofiber/template) | Bu paket, Fiber `v2.x.x`, Go sürüm 1.16 veya üzeri gerekli olduğunda kullanılabilecek 9 template motoru içerir. |
|
||||
| [template](https://github.com/gofiber/template) | Bu paket, Fiber `v2.x.x`, Go sürüm 1.17 veya üzeri gerekli olduğunda kullanılabilecek 9 template motoru içerir. |
|
||||
| [websocket](https://github.com/gofiber/websocket) | Yereller desteğiyle Fiber için Fasthttp WebSocket'a dayalıdır! |
|
||||
|
||||
## 🕶️ Awesome Listesi
|
||||
@ -662,7 +670,6 @@ Telif (c) 2019-günümüz [Fenny](https://github.com/fenny) ve [katkıda bulunan
|
||||
- [runewidth](https://github.com/mattn/go-runewidth/blob/master/LICENSE)
|
||||
- [fasthttp](https://github.com/valyala/fasthttp/blob/master/LICENSE)
|
||||
- [bytebufferpool](https://github.com/valyala/bytebufferpool/blob/master/LICENSE)
|
||||
- [dictpool](https://github.com/savsgio/dictpool/blob/master/LICENSE)
|
||||
- [fwd](https://github.com/philhofer/fwd/blob/master/LICENSE.md)
|
||||
- [go-ole](https://github.com/go-ole/go-ole/blob/master/LICENSE)
|
||||
- [gopsutil](https://github.com/shirou/gopsutil/blob/master/LICENSE)
|
||||
|
27
.github/README_uk.md
vendored
27
.github/README_uk.md
vendored
@ -1,6 +1,11 @@
|
||||
<p align="center">
|
||||
<a href="https://gofiber.io">
|
||||
<img alt="Fiber" height="125" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
|
||||
<picture>
|
||||
<source height="125" media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo-dark.svg">
|
||||
<img height="125" alt="Fiber" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
</picture>
|
||||
|
||||
</a>
|
||||
<br>
|
||||
<!-- base64 flags are available at https://www.phoca.cz/cssflags/ -->
|
||||
@ -61,6 +66,9 @@
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_uk.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/UK-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDU1LjIgMzguNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTUuMiAzOC40IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwhW0NEQVRBWwoJLnN0MHtmaWxsOiNGRkQ1MDA7fQoJLnN0MXtmaWxsOiMwMDVCQkI7fQpdXT48L3N0eWxlPjxnPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0zLjAzLDBoNDkuMTNjMS42NywwLDMuMDMsMS4zNiwzLjAzLDMuMDN2MzIuMzNjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3IFYzLjAzQzAsMS4zNiwxLjM3LDAsMy4wMywwTDMuMDMsMHoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMCwxOS4yaDU1LjJ2MTYuMTdjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3VjE5LjJMMCwxOS4yeiIvPjwvZz48L3N2Zz4=">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_az.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/AZ-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI2MDAiPg0KPHJlY3Qgd2lkdGg9IjEyMDAiIGhlaWdodD0iNjAwIiBmaWxsPSIjNTA5ZTJmIi8+DQo8cmVjdCB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI0MDAiIGZpbGw9IiNlZjMzNDAiLz4NCjxyZWN0IHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0iIzAwYjVlMiIvPg0KPGNpcmNsZSBjeD0iNTcwIiBjeT0iMzAwIiByPSI5MCIgZmlsbD0iI2ZmZiIvPg0KPGNpcmNsZSBjeD0iNTkwIiBjeT0iMzAwIiByPSI3NSIgZmlsbD0iI2VmMzM0MCIvPg0KPHBhdGggZD0iTTY3MCAyNTBsOS41NjcgMjYuOTAzIDI1Ljc4OC0xMi4yNTgtMTIuMjU4IDI1Ljc4OEw3MjAgMzAwbC0yNi45MDMgOS41NjcgMTIuMjU4IDI1Ljc4OC0yNS43ODgtMTIuMjU4TDY3MCAzNTBsLTkuNTY3LTI2LjkwMy0yNS43ODggMTIuMjU4IDEyLjI1OC0yNS43ODhMNjIwIDMwMGwyNi45MDMtOS41NjctMTIuMjU4LTI1Ljc4OCAyNS43ODggMTIuMjU4eiIgZmlsbD0iI2ZmZiIvPg0KPC9zdmc+">
|
||||
</a>
|
||||
<br>
|
||||
<a href="https://pkg.go.dev/github.com/gofiber/fiber/v2#pkg-overview">
|
||||
<img src="https://img.shields.io/badge/%F0%9F%93%9A%20godoc-pkg-00ACD7.svg?color=00ACD7&style=flat-square">
|
||||
@ -124,7 +132,7 @@ func main() {
|
||||
|
||||
## ⚙️ Встановлення
|
||||
|
||||
Переконайтеся, що Go встановлено ([завантажити](https://go.dev/dl/)). Потрібна версія `1.16` або вища.
|
||||
Переконайтеся, що Go встановлено ([завантажити](https://go.dev/dl/)). Потрібна версія `1.17` або вища.
|
||||
|
||||
Ініціалізуйте проект, створивши папку, а потім запустивши `go mod init github.com/your/repo`
|
||||
([детальніше](https://go.dev/blog/using-go-modules)) всередині цієї папки. Далі встановіть Fiber за допомогою
|
||||
@ -160,7 +168,7 @@ Fiber **натхненний** Express, найпопулярнішим веб-ф
|
||||
|
||||
## ⚠️ Обмеження
|
||||
|
||||
- Через те, що Fiber використовує unsafe, бібліотека не завжди може бути сумісною з останньою версією Go. Fiber 2.40.0 було протестовано з Go версій 1.16 до 1.20.
|
||||
- Через те, що Fiber використовує unsafe, бібліотека не завжди може бути сумісною з останньою версією Go. Fiber 2.40.0 було протестовано з Go версій 1.17 до 1.20.
|
||||
- Fiber не сумісний з інтерфейсами net/http. Це означає, що ви не зможете використовувати такі проекти, як gqlgen, go-swagger або будь-які інші, які є частиною екосистеми net/http.
|
||||
|
||||
## 👀 Приклади
|
||||
@ -586,7 +594,7 @@ func main() {
|
||||
app := fiber.New(fiber.Config{
|
||||
EnableTrustedProxyCheck: true,
|
||||
TrustedProxies: []string{"0.0.0.0", "1.1.1.1/30"}, // IP address or IP address range
|
||||
ProxyHeader: fiber.HeaderXForwardedFor},
|
||||
ProxyHeader: fiber.HeaderXForwardedFor,
|
||||
})
|
||||
|
||||
// ...
|
||||
@ -624,6 +632,11 @@ func main() {
|
||||
| [session](https://github.com/gofiber/fiber/tree/master/middleware/session) | Middleware для сеансів. ПРИМІТКА: Цей middleware використовує наш пакет зберігання. |
|
||||
| [skip](https://github.com/gofiber/fiber/tree/master/middleware/skip) | Middleware який пропускає упакований обробник, якщо предикат є істинним. |
|
||||
| [timeout](https://github.com/gofiber/fiber/tree/master/middleware/timeout) | Додає максимальний час для запиту та пересилає до ErrorHandler, якщо його перевищено. |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Middleware для автентифікації по ключам. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Middleware для перенаправлення. |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Middleware для перезапису URL-адреси на основі наданих правил. |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Конвентор для обробників net/http до/з обробників запитів Fiber, особлива подяка @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Допомагає захистити ваші програми, встановлюючи різні заголовки HTTP. |
|
||||
|
||||
## 🧬 Зовнішні Middleware
|
||||
|
||||
@ -631,12 +644,7 @@ func main() {
|
||||
|
||||
| Middleware | Опис |
|
||||
| :------------------------------------------------ | :-------------------------------------------------------------------------------------------------------------------- |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | Конвентор для обробників net/http до/з обробників запитів Fiber, особлива подяка @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | Допомагає захистити ваші програми, встановлюючи різні заголовки HTTP. |
|
||||
| [jwt](https://github.com/gofiber/jwt) | JWT повертає middleware автентифікації JSON Web Token \(JWT\). |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Middleware для автентифікації по ключам. |
|
||||
| [redirect](https://github.com/gofiber/redirect) | Middleware для перенаправлення. |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Middleware для перезапису URL-адреси на основі наданих правил. |
|
||||
| [storage](https://github.com/gofiber/storage) | Драйвер зберігання який може використовуватися в різних middleware. |
|
||||
| [template](https://github.com/gofiber/template) | Цей пакет містить 8 модулів шаблонів, які можна використовувати з Fiber `v1.10.x` Потрібно версія Go 1.13 або новішу. |
|
||||
| [websocket](https://github.com/gofiber/websocket) | На основі Fasthttp WebSocket для Fiber з підтримкою місцевих користувачів! |
|
||||
@ -698,7 +706,6 @@ Fiber – це проект із відкритим вихідним кодом,
|
||||
- [runewidth](https://github.com/mattn/go-runewidth/blob/master/LICENSE)
|
||||
- [fasthttp](https://github.com/valyala/fasthttp/blob/master/LICENSE)
|
||||
- [bytebufferpool](https://github.com/valyala/bytebufferpool/blob/master/LICENSE)
|
||||
- [dictpool](https://github.com/savsgio/dictpool/blob/master/LICENSE)
|
||||
- [fwd](https://github.com/philhofer/fwd/blob/master/LICENSE.md)
|
||||
- [go-ole](https://github.com/go-ole/go-ole/blob/master/LICENSE)
|
||||
- [gopsutil](https://github.com/shirou/gopsutil/blob/master/LICENSE)
|
||||
|
33
.github/README_zh-CN.md
vendored
33
.github/README_zh-CN.md
vendored
@ -1,6 +1,11 @@
|
||||
<p align="center">
|
||||
<a href="https://gofiber.io">
|
||||
<img alt="Fiber" height="125" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
|
||||
<picture>
|
||||
<source height="125" media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo-dark.svg">
|
||||
<img height="125" alt="Fiber" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
</picture>
|
||||
|
||||
</a>
|
||||
<br>
|
||||
<!-- base64 flags are available at https://www.phoca.cz/cssflags/ -->
|
||||
@ -58,6 +63,9 @@
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_uk.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/UK-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDU1LjIgMzguNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTUuMiAzOC40IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwhW0NEQVRBWwoJLnN0MHtmaWxsOiNGRkQ1MDA7fQoJLnN0MXtmaWxsOiMwMDVCQkI7fQpdXT48L3N0eWxlPjxnPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0zLjAzLDBoNDkuMTNjMS42NywwLDMuMDMsMS4zNiwzLjAzLDMuMDN2MzIuMzNjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3IFYzLjAzQzAsMS4zNiwxLjM3LDAsMy4wMywwTDMuMDMsMHoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMCwxOS4yaDU1LjJ2MTYuMTdjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3VjE5LjJMMCwxOS4yeiIvPjwvZz48L3N2Zz4=">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_az.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/AZ-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI2MDAiPg0KPHJlY3Qgd2lkdGg9IjEyMDAiIGhlaWdodD0iNjAwIiBmaWxsPSIjNTA5ZTJmIi8+DQo8cmVjdCB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI0MDAiIGZpbGw9IiNlZjMzNDAiLz4NCjxyZWN0IHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0iIzAwYjVlMiIvPg0KPGNpcmNsZSBjeD0iNTcwIiBjeT0iMzAwIiByPSI5MCIgZmlsbD0iI2ZmZiIvPg0KPGNpcmNsZSBjeD0iNTkwIiBjeT0iMzAwIiByPSI3NSIgZmlsbD0iI2VmMzM0MCIvPg0KPHBhdGggZD0iTTY3MCAyNTBsOS41NjcgMjYuOTAzIDI1Ljc4OC0xMi4yNTgtMTIuMjU4IDI1Ljc4OEw3MjAgMzAwbC0yNi45MDMgOS41NjcgMTIuMjU4IDI1Ljc4OC0yNS43ODgtMTIuMjU4TDY3MCAzNTBsLTkuNTY3LTI2LjkwMy0yNS43ODggMTIuMjU4IDEyLjI1OC0yNS43ODhMNjIwIDMwMGwyNi45MDMtOS41NjctMTIuMjU4LTI1Ljc4OCAyNS43ODggMTIuMjU4eiIgZmlsbD0iI2ZmZiIvPg0KPC9zdmc+">
|
||||
</a>
|
||||
<br>
|
||||
<a href="https://pkg.go.dev/github.com/gofiber/fiber/v3#pkg-overview">
|
||||
<img src="https://img.shields.io/badge/%F0%9F%93%9A%20godoc-pkg-00ACD7.svg?color=00ACD7&style=flat-square">
|
||||
@ -116,7 +124,7 @@ func main() {
|
||||
|
||||
## ⚙️ 安装
|
||||
|
||||
确保已安装 `1.16` 或更高版本的 Go ([下载](https://go.dev/dl/))。
|
||||
确保已安装 `1.17` 或更高版本的 Go ([下载](https://go.dev/dl/))。
|
||||
|
||||
通过创建文件夹并在文件夹内运行 `go mod init github.com/your/repo` ([了解更多](https://go.dev/blog/using-go-modules)) 来初始化项目,然后使用 [`go get`](https://pkg.go.dev/cmd/go/#hdr-Add_dependencies_to_current_module_and_install_them) 命令安装 Fiber:
|
||||
|
||||
@ -126,12 +134,12 @@ go get -u github.com/gofiber/fiber/v3
|
||||
|
||||
## 🎯 特点
|
||||
|
||||
- 强大的[路由](https://docs.gofiber.io/routing)
|
||||
- 强大的[路由](https://docs.gofiber.io/guide/routing)
|
||||
- [静态文件](https://docs.gofiber.io/api/app#static)服务
|
||||
- 极致[性能](https://docs.gofiber.io/extra/benchmarks)
|
||||
- [低内存占用](https://docs.gofiber.io/extra/benchmarks)
|
||||
- [API 接口](https://docs.gofiber.io/api/ctx)
|
||||
- 支持[中间件](https://docs.gofiber.io/middleware)和 [Next](https://docs.gofiber.io/api/ctx#next)
|
||||
- 支持[中间件](https://docs.gofiber.io/category/-middleware)和 [Next](https://docs.gofiber.io/api/ctx#next)
|
||||
- [快速上手](https://dev.to/koddr/welcome-to-fiber-an-express-js-styled-fastest-web-framework-written-with-on-golang-497)
|
||||
- [模版引擎](https://github.com/gofiber/template)
|
||||
- [支持 WebSocket](https://github.com/gofiber/websocket)
|
||||
@ -152,7 +160,7 @@ go get -u github.com/gofiber/fiber/v3
|
||||
以及在互联网上的所有诉求,为了创建一个能让有着任何技术栈的开发者都能在 deadline 前完成任务的**迅速**,**灵活**以及**友好**的 `Go web` 框架,就像 `Express` 在 `JavaScript` 世界中一样。
|
||||
|
||||
## ⚠️ 限制
|
||||
* 由于 Fiber 使用了 unsafe 特性,导致其可能与最新的 Go 版本不兼容。Fiber 2.40.0 已经在 Go 1.16 到 1.20 上测试过。
|
||||
* 由于 Fiber 使用了 unsafe 特性,导致其可能与最新的 Go 版本不兼容。Fiber 2.40.0 已经在 Go 1.17 到 1.20 上测试过。
|
||||
* Fiber 与 net/http 接口不兼容。也就是说你无法直接使用例如 gqlen,go-swagger 或者任何其他属于 net/http 生态的项目。
|
||||
|
||||
## 👀 示例
|
||||
@ -252,7 +260,7 @@ func main() {
|
||||
|
||||
```
|
||||
|
||||
#### 📖 [**中间件**](https://docs.gofiber.io/middleware)和 [**Next**](https://docs.gofiber.io/api/ctx#next)
|
||||
#### 📖 [**中间件**](https://docs.gofiber.io/category/-middleware)和 [**Next**](https://docs.gofiber.io/api/ctx#next)
|
||||
|
||||
```go
|
||||
func main() {
|
||||
@ -442,7 +450,7 @@ func main() {
|
||||
|
||||
### JSON 响应
|
||||
|
||||
📖 [JSON](https://docs.gofiber.io/ctx#json)
|
||||
📖 [JSON](https://docs.gofiber.io/api/ctx#json)
|
||||
|
||||
```go
|
||||
type User struct {
|
||||
@ -597,6 +605,11 @@ func main() {
|
||||
| [session](https://github.com/gofiber/fiber/tree/master/middleware/session) | Session 中间件. 注意: 此中间件使用了我们的存储包. |
|
||||
| [skip](https://github.com/gofiber/fiber/tree/master/middleware/skip) | Skip 中间件会在判断条为 true 时忽略此次请求 |
|
||||
| [timeout](https://github.com/gofiber/fiber/tree/master/middleware/timeout) | 添加请求的最大时间,如果超时则发送给ErrorHandler 进行处理. |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | net/http 处理程序与 Fiber 请求处理程序之间的转换器,特别感谢 @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | 通过设置各种 HTTP 头帮助保护您的应用程序 |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth 中间件提供基于密钥的身份验证 |
|
||||
| [redirect](https://github.com/gofiber/redirect) | 用于重定向请求的中间件 |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite 中间件根据提供的规则重写URL路径。它有助于向后兼容或者创建更清晰、更具描述性的链接 |
|
||||
|
||||
## 🧬 外部中间件
|
||||
|
||||
@ -604,12 +617,7 @@ func main() {
|
||||
|
||||
| 中间件 | 描述 |
|
||||
|:--------------------------------------------------|:-------------------------------------------------------------------------------------------|
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | net/http 处理程序与 Fiber 请求处理程序之间的转换器,特别感谢 @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | 通过设置各种 HTTP 头帮助保护您的应用程序 |
|
||||
| [jwt](https://github.com/gofiber/jwt) | JWT 返回一个 JSON Web Token\(JWT\) 身份验证中间件 |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth 中间件提供基于密钥的身份验证 |
|
||||
| [redirect](https://github.com/gofiber/redirect) | 用于重定向请求的中间件 |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | Rewrite 中间件根据提供的规则重写URL路径。它有助于向后兼容或者创建更清晰、更具描述性的链接 |
|
||||
| [storage](https://github.com/gofiber/storage) | 包含实现 Storage 接口的数据库驱动,它的设计旨在配合 fiber 的其他中间件来进行使用 |
|
||||
| [template](https://github.com/gofiber/template) | 该中间件包含 8 个模板引擎,可与 Fiber `v1.10.x` Go 1.13或更高版本一起使用 |
|
||||
| [websocket](https://github.com/gofiber/websocket) | 基于 Fasthttp WebSocket for Fiber 实现,支持使用 [Locals](https://docs.gofiber.io/api/ctx#locals) ! |
|
||||
@ -672,7 +680,6 @@ Copyright (c) 2019-present [Fenny](https://github.com/fenny) and [Contributors](
|
||||
- [runewidth](https://github.com/mattn/go-runewidth/blob/master/LICENSE)
|
||||
- [fasthttp](https://github.com/valyala/fasthttp/blob/master/LICENSE)
|
||||
- [bytebufferpool](https://github.com/valyala/bytebufferpool/blob/master/LICENSE)
|
||||
- [dictpool](https://github.com/savsgio/dictpool/blob/master/LICENSE)
|
||||
- [fwd](https://github.com/philhofer/fwd/blob/master/LICENSE.md)
|
||||
- [go-ole](https://github.com/go-ole/go-ole/blob/master/LICENSE)
|
||||
- [gopsutil](https://github.com/shirou/gopsutil/blob/master/LICENSE)
|
||||
|
40
.github/README_zh-TW.md
vendored
40
.github/README_zh-TW.md
vendored
@ -1,6 +1,11 @@
|
||||
<p align="center">
|
||||
<a href="https://gofiber.io">
|
||||
<img alt="Fiber" height="125" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
|
||||
<picture>
|
||||
<source height="125" media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo-dark.svg">
|
||||
<img height="125" alt="Fiber" src="https://raw.githubusercontent.com/gofiber/docs/master/static/img/logo.svg">
|
||||
</picture>
|
||||
|
||||
</a>
|
||||
<br>
|
||||
<!-- base64 flags are available at https://www.phoca.cz/cssflags/ -->
|
||||
@ -61,6 +66,9 @@
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_uk.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/UK-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDU1LjIgMzguNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTUuMiAzOC40IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwhW0NEQVRBWwoJLnN0MHtmaWxsOiNGRkQ1MDA7fQoJLnN0MXtmaWxsOiMwMDVCQkI7fQpdXT48L3N0eWxlPjxnPjxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0zLjAzLDBoNDkuMTNjMS42NywwLDMuMDMsMS4zNiwzLjAzLDMuMDN2MzIuMzNjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3IFYzLjAzQzAsMS4zNiwxLjM3LDAsMy4wMywwTDMuMDMsMHoiLz48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMCwxOS4yaDU1LjJ2MTYuMTdjMCwxLjY3LTEuMzcsMy4wMy0zLjAzLDMuMDNIMy4wM0MxLjM3LDM4LjQsMCwzNy4wNCwwLDM1LjM3VjE5LjJMMCwxOS4yeiIvPjwvZz48L3N2Zz4=">
|
||||
</a>
|
||||
<a href="https://github.com/gofiber/fiber/blob/master/.github/README_az.md">
|
||||
<img height="20px" src="https://img.shields.io/badge/AZ-flag.svg?color=555555&style=flat-square&logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI2MDAiPg0KPHJlY3Qgd2lkdGg9IjEyMDAiIGhlaWdodD0iNjAwIiBmaWxsPSIjNTA5ZTJmIi8+DQo8cmVjdCB3aWR0aD0iMTIwMCIgaGVpZ2h0PSI0MDAiIGZpbGw9IiNlZjMzNDAiLz4NCjxyZWN0IHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0iIzAwYjVlMiIvPg0KPGNpcmNsZSBjeD0iNTcwIiBjeT0iMzAwIiByPSI5MCIgZmlsbD0iI2ZmZiIvPg0KPGNpcmNsZSBjeD0iNTkwIiBjeT0iMzAwIiByPSI3NSIgZmlsbD0iI2VmMzM0MCIvPg0KPHBhdGggZD0iTTY3MCAyNTBsOS41NjcgMjYuOTAzIDI1Ljc4OC0xMi4yNTgtMTIuMjU4IDI1Ljc4OEw3MjAgMzAwbC0yNi45MDMgOS41NjcgMTIuMjU4IDI1Ljc4OC0yNS43ODgtMTIuMjU4TDY3MCAzNTBsLTkuNTY3LTI2LjkwMy0yNS43ODggMTIuMjU4IDEyLjI1OC0yNS43ODhMNjIwIDMwMGwyNi45MDMtOS41NjctMTIuMjU4LTI1Ljc4OCAyNS43ODggMTIuMjU4eiIgZmlsbD0iI2ZmZiIvPg0KPC9zdmc+">
|
||||
</a>
|
||||
<br>
|
||||
<a href="https://pkg.go.dev/github.com/gofiber/fiber/v3#pkg-overview">
|
||||
<img src="https://img.shields.io/badge/%F0%9F%93%9A%20godoc-pkg-00ACD7.svg?color=00ACD7&style=flat-square">
|
||||
@ -118,7 +126,7 @@ func main() {
|
||||
|
||||
## ⚙️ 安裝
|
||||
|
||||
先確定您已經安裝 `1.16` 或更新版本的 Go([點此下載](https://go.dev/dl/))。
|
||||
先確定您已經安裝 `1.17` 或更新版本的 Go([點此下載](https://go.dev/dl/))。
|
||||
|
||||
要初始化專案,首先建立檔案夾,然後在檔案夾中執行 `go mod init github.com/名稱/儲存庫`([深入了解](https://go.dev/blog/using-go-modules))。接著,使用 [`go get`](https://pkg.go.dev/cmd/go/#hdr-Add_dependencies_to_current_module_and_install_them) 命令安裝 Fiber:
|
||||
|
||||
@ -128,13 +136,20 @@ go get -u github.com/gofiber/fiber/v3
|
||||
|
||||
## 🎯 特色
|
||||
|
||||
- 強固的[路由系統](https://docs.gofiber.io/routing)
|
||||
- 強固的[路由系統](https://docs.gofiber.io/guide/routing)
|
||||
- 可以寄存[靜態檔案](https://docs.gofiber.io/api/app#static)
|
||||
- 疾速[效能](https://docs.gofiber.io/extra/benchmarks)
|
||||
- 相當低的[記憶體使用量](https://docs.gofiber.io/extra/benchmarks)
|
||||
- [API 端點](https://docs.gofiber.io/api/ctx)
|
||||
- 支援 [中介模組](https://docs.gofiber.io/middleware) 和 [接續函式 (Next)](https://docs.gofiber.io/api/ctx#next)
|
||||
- 支援 [中介模組](https://docs.gofiber.io/category/-middleware) 和 [接續函式 (Next)](https://docs.gofiber.io/api/ctx#next)
|
||||
- [迅速開發](https://dev.to/koddr/welcome-to-fiber-an-express-js-styled-fastest-web-framework-written-with-on-golang-497) 伺服器端服務
|
||||
- 強大的[路由](https://docs.gofiber.io/guide/routing)
|
||||
- [靜態檔案](https://docs.gofiber.io/api/app#static)服務
|
||||
- [超快速](https://docs.gofiber.io/extra/benchmarks)
|
||||
- [佔用很少記憶體](https://docs.gofiber.io/extra/benchmarks)
|
||||
- 支援 Express 的[API](https://docs.gofiber.io/api/ctx)
|
||||
- 支援中介器和[下一步](https://docs.gofiber.io/api/ctx#next)
|
||||
- [立即上手](https://dev.to/koddr/welcome-to-fiber-an-express-js-styled-fastest-web-framework-written-with-on-golang-497)
|
||||
- [樣板引擎](https://github.com/gofiber/template)
|
||||
- [支援 WebSocket](https://github.com/gofiber/websocket)
|
||||
- [Server-Sent Events](https://github.com/gofiber/recipes/tree/master/sse)
|
||||
@ -152,7 +167,7 @@ Fiber **啟發自** Express——網際網路上最知名的 Web 框架,我們
|
||||
|
||||
## ⚠️ 限制
|
||||
|
||||
- 由於 Fiber 有用到 Unsafe,本函式庫有時可能無法相容最新版的 Go 語言。Fiber 2.40.0 已在 Go 1.16 至 1.20 的版本測試過。
|
||||
- 由於 Fiber 有用到 Unsafe,本函式庫有時可能無法相容最新版的 Go 語言。Fiber 2.40.0 已在 Go 1.17 至 1.20 的版本測試過。
|
||||
- Fiber 不相容 net/http 的介面,意味著您無法使用像是 gqlgen、go-swagger 或其他任何屬於 net/http 生態系統的專案。
|
||||
|
||||
## 👀 範例
|
||||
@ -441,7 +456,7 @@ func main() {
|
||||
|
||||
### JSON 回應
|
||||
|
||||
📖 [JSON](https://docs.gofiber.io/ctx#json)
|
||||
📖 [JSON](https://docs.gofiber.io/api/ctx#json)
|
||||
|
||||
```go
|
||||
type User struct {
|
||||
@ -583,7 +598,7 @@ func main() {
|
||||
app := fiber.New(fiber.Config{
|
||||
EnableTrustedProxyCheck: true,
|
||||
TrustedProxies: []string{"0.0.0.0", "1.1.1.1/30"}, // IP 地址或 IP 地址區間
|
||||
ProxyHeader: fiber.HeaderXForwardedFor},
|
||||
ProxyHeader: fiber.HeaderXForwardedFor,
|
||||
})
|
||||
|
||||
// ...
|
||||
@ -621,6 +636,11 @@ func main() {
|
||||
| [session](https://github.com/gofiber/fiber/tree/master/middleware/session) | 連線階段中介模組。注意:這個中介模組有用到我們的 Storage 套件。 |
|
||||
| [skip](https://github.com/gofiber/fiber/tree/master/middleware/skip) | 略過中介模組,會在條件成立時略過封裝過的處理常式。 |
|
||||
| [timeout](https://github.com/gofiber/fiber/tree/master/middleware/timeout) | 為請求加上最長時限,並在逾時後轉送至錯誤處理常式 (ErrorHandler)。 |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth 中介模組提供以金鑰為基礎的認證模式。 |
|
||||
| [redirect](https://github.com/gofiber/redirect) | 用來重新導向的中介模組。 |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | 重寫 (Rewrite) 中介模組:根據提供規則重寫 URL 路徑,適合用來向後相容,或者是製作更乾淨且更好懂的連結。 |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | 將 net/http 處理常式轉換至 Fiber 處理常式,或者是反著做。特別感謝 @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | 透過設定多種 HTTP 標頭,協助保護您應用程式的安全。 |
|
||||
|
||||
## 🧬 外掛中介模組
|
||||
|
||||
@ -628,12 +648,7 @@ func main() {
|
||||
|
||||
| 中介模組 | 描述 |
|
||||
| :------------------------------------------------ | :----------------------------------------------------------------------------------------------------- |
|
||||
| [adaptor](https://github.com/gofiber/adaptor) | 將 net/http 處理常式轉換至 Fiber 處理常式,或者是反著做。特別感謝 @arsmn! |
|
||||
| [helmet](https://github.com/gofiber/helmet) | 透過設定多種 HTTP 標頭,協助保護您應用程式的安全。 |
|
||||
| [jwt](https://github.com/gofiber/jwt) | JWT 回傳 JSON Web Token \(JWT\) 認證中介模組。 |
|
||||
| [keyauth](https://github.com/gofiber/keyauth) | Key auth 中介模組提供以金鑰為基礎的認證模式。 |
|
||||
| [redirect](https://github.com/gofiber/redirect) | 用來重新導向的中介模組。 |
|
||||
| [rewrite](https://github.com/gofiber/rewrite) | 重寫 (Rewrite) 中介模組:根據提供規則重寫 URL 路徑,適合用來向後相容,或者是製作更乾淨且更好懂的連結。 |
|
||||
| [storage](https://github.com/gofiber/storage) | 已經做好,實作 Storage 介面的儲存區驅動模組,設計用來與各種 Fiber 中介模組搭配使用。 |
|
||||
| [template](https://github.com/gofiber/template) | 本套件包含 8 種樣板引擎,可以和 Fiber `v1.10.x` 一起使用。需要 Go 1.13 或更新版本。 |
|
||||
| [websocket](https://github.com/gofiber/websocket) | 適用於 Fiber,建基於 Fasthttp 的 WebSocket。支援本機空間 (Locals)! |
|
||||
@ -695,7 +710,6 @@ Fiber 是個仰賴捐款的開放原始碼專案——用來支付如域名、Gi
|
||||
- [runewidth](https://github.com/mattn/go-runewidth/blob/master/LICENSE)
|
||||
- [fasthttp](https://github.com/valyala/fasthttp/blob/master/LICENSE)
|
||||
- [bytebufferpool](https://github.com/valyala/bytebufferpool/blob/master/LICENSE)
|
||||
- [dictpool](https://github.com/savsgio/dictpool/blob/master/LICENSE)
|
||||
- [fwd](https://github.com/philhofer/fwd/blob/master/LICENSE.md)
|
||||
- [go-ole](https://github.com/go-ole/go-ole/blob/master/LICENSE)
|
||||
- [gopsutil](https://github.com/shirou/gopsutil/blob/master/LICENSE)
|
||||
|
2
.github/SECURITY.md
vendored
2
.github/SECURITY.md
vendored
@ -20,7 +20,7 @@ The table below shows the supported versions for Fiber which include security up
|
||||
|
||||
**DO NOT CREATE AN ISSUE** to report a security problem. Instead, please
|
||||
send us an e-mail at `team@gofiber.io` or join our discord server via
|
||||
[this invite link](https://discord.gg/bSnH7db) and send a private message
|
||||
[this invite link](https://gofiber.io/discord) and send a private message
|
||||
to Fenny or any of the maintainers.
|
||||
|
||||
<a name="contact"></a>
|
||||
|
20
.github/labeler.yml
vendored
Normal file
20
.github/labeler.yml
vendored
Normal file
@ -0,0 +1,20 @@
|
||||
version: v1
|
||||
labels:
|
||||
- label: '📒 Documentation'
|
||||
matcher:
|
||||
title: '\b(docs|doc:|\[doc\]|README|typos|comment|documentation)\b'
|
||||
- label: '☢️ Bug'
|
||||
matcher:
|
||||
title: '\b(fix|race|bug|missing|correct)\b'
|
||||
- label: '🧹 Updates'
|
||||
matcher:
|
||||
title: '\b(improve|update|refactor|deprecated|remove|unused|test)\b'
|
||||
- label: '🤖 Dependencies'
|
||||
matcher:
|
||||
title: '\b(bumb|bdependencies)\b'
|
||||
- label: '✏️ Feature'
|
||||
matcher:
|
||||
title: '\b(feature|feat|create|implement|add)\b'
|
||||
- label: '🤔 Question'
|
||||
matcher:
|
||||
title: '\b(question|how)\b'
|
2
.github/pull_request_template.md
vendored
2
.github/pull_request_template.md
vendored
@ -19,7 +19,7 @@ Please delete options that are not relevant.
|
||||
- [ ] For new functionalities I follow the inspiration of the express js framework and built them similar in usage
|
||||
- [ ] I have performed a self-review of my own code
|
||||
- [ ] I have commented my code, particularly in hard-to-understand areas
|
||||
- [ ] I have made corresponding changes to the documentation - https://github.com/gofiber/docs for https://docs.gofiber.io/
|
||||
- [ ] I have made corresponding changes to the documentation - /docs/ directory for https://docs.gofiber.io/
|
||||
- [ ] I have added tests that prove my fix is effective or that my feature works
|
||||
- [ ] New and existing unit tests pass locally with my changes
|
||||
- [ ] If new dependencies exist, I have checked that they are really necessary and agreed with the maintainers/community (we want to have as few dependencies as possible)
|
||||
|
55
.github/release-drafter.yml
vendored
55
.github/release-drafter.yml
vendored
@ -32,61 +32,6 @@ version-resolver:
|
||||
- '🤖 Dependencies'
|
||||
- '🧹 Updates'
|
||||
default: patch
|
||||
autolabeler:
|
||||
- label: '📒 Documentation'
|
||||
title:
|
||||
- '/docs/i'
|
||||
- '/doc:/i'
|
||||
- '/\[doc\]/i'
|
||||
- '/README/i'
|
||||
- '/typos/i'
|
||||
- '/comment/i'
|
||||
- '/📚/i'
|
||||
- '/📒/i'
|
||||
- '/📝/i'
|
||||
- '/documentation/i'
|
||||
- label: '☢️ Bug'
|
||||
title:
|
||||
- '/fix/i'
|
||||
- '/race/i'
|
||||
- '/bug/i'
|
||||
- '/missing/i'
|
||||
- '/correct/i'
|
||||
- '/🐛/i'
|
||||
- '/☢/i'
|
||||
- '/🩹/i'
|
||||
- '/🚨/i'
|
||||
- label: '🧹 Updates'
|
||||
title:
|
||||
- '/improve/i'
|
||||
- '/update/i'
|
||||
- '/refactor/i'
|
||||
- '/deprecated/i'
|
||||
- '/remove/i'
|
||||
- '/unused/i'
|
||||
- '/test/i'
|
||||
- '/⚡/i'
|
||||
- '/👷/i'
|
||||
- '/🚧/i'
|
||||
- '/♻️/i'
|
||||
- '/🎨/i'
|
||||
- '/🧪/i'
|
||||
- '/🧹/i'
|
||||
- label: '🤖 Dependencies'
|
||||
title:
|
||||
- '/bumb/i'
|
||||
- '/dependencies/i'
|
||||
- '/📦/i'
|
||||
- '/🤖/i'
|
||||
- label: '✏️ Feature'
|
||||
title:
|
||||
- '/feature/i'
|
||||
- '/create/i'
|
||||
- '/implement/i'
|
||||
- '/add/i'
|
||||
- '/🚀/i'
|
||||
- '/✨/i'
|
||||
- '/🔥/i'
|
||||
template: |
|
||||
$CHANGES
|
||||
|
||||
|
70
.github/scripts/sync_docs.sh
vendored
Executable file
70
.github/scripts/sync_docs.sh
vendored
Executable file
@ -0,0 +1,70 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Some env variables
|
||||
BRANCH="master"
|
||||
REPO_URL="github.com/gofiber/docs.git"
|
||||
AUTHOR_EMAIL="github-actions[bot]@users.noreply.github.com"
|
||||
AUTHOR_USERNAME="github-actions[bot]"
|
||||
VERSION_FILE="versions.json"
|
||||
REPO_DIR="core"
|
||||
COMMIT_URL="https://github.com/gofiber/fiber"
|
||||
DOCUSAURUS_COMMAND="npm run docusaurus -- docs:version"
|
||||
|
||||
# Set commit author
|
||||
git config --global user.email "${AUTHOR_EMAIL}"
|
||||
git config --global user.name "${AUTHOR_USERNAME}"
|
||||
|
||||
git clone https://${TOKEN}@${REPO_URL} fiber-docs
|
||||
|
||||
# Handle push event
|
||||
if [ "$EVENT" == "push" ]; then
|
||||
latest_commit=$(git rev-parse --short HEAD)
|
||||
log_output=$(git log --oneline ${BRANCH} HEAD~1..HEAD --name-status -- docs/)
|
||||
if [[ $log_output != "" ]]; then
|
||||
cp -a docs/* fiber-docs/docs/${REPO_DIR}
|
||||
fi
|
||||
|
||||
# Handle release event
|
||||
elif [ "$EVENT" == "release" ]; then
|
||||
major_version="${TAG_NAME%%.*}"
|
||||
|
||||
# Form new version name
|
||||
new_version="${major_version}.x"
|
||||
|
||||
cd fiber-docs/ || true
|
||||
npm ci
|
||||
|
||||
# Check if contrib_versions.json exists and modify it if required
|
||||
if [[ -f $VERSION_FILE ]]; then
|
||||
jq --arg new_version "$new_version" 'del(.[] | select(. == $new_version))' $VERSION_FILE >temp.json && mv temp.json $VERSION_FILE
|
||||
jq -S . ${VERSION_FILE} >temp.json && mv temp.json ${VERSION_FILE}
|
||||
fi
|
||||
|
||||
# Run docusaurus versioning command
|
||||
$DOCUSAURUS_COMMAND "${new_version}"
|
||||
fi
|
||||
|
||||
# Push changes
|
||||
cd fiber-docs/ || true
|
||||
git add .
|
||||
if [[ $EVENT == "push" ]]; then
|
||||
git commit -m "Add docs from ${COMMIT_URL}/commit/${latest_commit}"
|
||||
elif [[ $EVENT == "release" ]]; then
|
||||
git commit -m "Sync docs for release ${COMMIT_URL}/releases/tag/${TAG_NAME}"
|
||||
fi
|
||||
|
||||
MAX_RETRIES=5
|
||||
DELAY=5
|
||||
retry=0
|
||||
|
||||
while ((retry < MAX_RETRIES)); do
|
||||
git push https://${TOKEN}@${REPO_URL} && break
|
||||
retry=$((retry + 1))
|
||||
git pull --rebase
|
||||
sleep $DELAY
|
||||
done
|
||||
|
||||
if ((retry == MAX_RETRIES)); then
|
||||
echo "Failed to push after $MAX_RETRIES attempts. Exiting with 1."
|
||||
exit 1
|
||||
fi
|
21
.github/workflows/auto-labeler.yml
vendored
Normal file
21
.github/workflows/auto-labeler.yml
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
name: Auto labeler
|
||||
on:
|
||||
issues:
|
||||
types: [ opened, edited, milestoned ]
|
||||
pull_request_target:
|
||||
types: [ opened ]
|
||||
permissions:
|
||||
contents: read
|
||||
issues: write
|
||||
pull-requests: write
|
||||
statuses: write
|
||||
checks: write
|
||||
jobs:
|
||||
labeler:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check Labels
|
||||
id: labeler
|
||||
uses: fuxingloh/multi-labeler@v2
|
||||
with:
|
||||
github-token: ${{secrets.GITHUB_TOKEN}}
|
25
.github/workflows/benchmark.yml
vendored
25
.github/workflows/benchmark.yml
vendored
@ -1,11 +1,24 @@
|
||||
on: [push]
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- main
|
||||
paths:
|
||||
- '**'
|
||||
- '!docs/**'
|
||||
- '!**.md'
|
||||
pull_request:
|
||||
paths:
|
||||
- '**'
|
||||
- '!docs/**'
|
||||
- '!**.md'
|
||||
name: Benchmark
|
||||
jobs:
|
||||
Compare:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Install Go
|
||||
uses: actions/setup-go@v3
|
||||
uses: actions/setup-go@v4
|
||||
with:
|
||||
go-version: 1.20.x
|
||||
- name: Fetch Repository
|
||||
@ -19,13 +32,17 @@ jobs:
|
||||
# TODO: reactivate it later -> when v3 is the stable one
|
||||
key: ${{ runner.os }}-benchmark-v3
|
||||
- name: Save Benchmark Results
|
||||
uses: rhysd/github-action-benchmark@v1
|
||||
uses: benchmark-action/github-action-benchmark@v1.16.2
|
||||
with:
|
||||
tool: 'go'
|
||||
output-file-path: output.txt
|
||||
github-token: ${{ secrets.BENCHMARK_TOKEN }}
|
||||
benchmark-data-dir-path: 'benchmarks'
|
||||
fail-on-alert: true
|
||||
comment-on-alert: true
|
||||
comment-on-alert: ${{ github.event_name == 'push' || github.event_name == 'workflow_dispatch' }}
|
||||
# Enable Job Summary for PRs - deactivated because of issues
|
||||
#summary-always: ${{ github.event_name != 'push' && github.event_name != 'workflow_dispatch' }}
|
||||
# TODO: reactivate it later -> when v3 is the stable one
|
||||
#auto-push: ${{ github.event_name == 'push' || github.event_name == 'workflow_dispatch' }}
|
||||
auto-push: false
|
||||
save-data-file: ${{ github.event_name == 'push' || github.event_name == 'workflow_dispatch' }}
|
||||
|
15
.github/workflows/codeql-analysis.yml
vendored
15
.github/workflows/codeql-analysis.yml
vendored
@ -2,10 +2,19 @@ name: "CodeQL"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [v3-beta, ]
|
||||
branches:
|
||||
- master
|
||||
- main
|
||||
- v3-beta
|
||||
paths:
|
||||
- '**'
|
||||
- '!docs/**'
|
||||
- '!**.md'
|
||||
pull_request:
|
||||
# The branches below must be a subset of the branches above
|
||||
branches: [v3-beta]
|
||||
paths:
|
||||
- '**'
|
||||
- '!docs/**'
|
||||
- '!**.md'
|
||||
schedule:
|
||||
- cron: '0 3 * * 6'
|
||||
|
||||
|
6
.github/workflows/linter.yml
vendored
6
.github/workflows/linter.yml
vendored
@ -3,8 +3,6 @@
|
||||
name: golangci-lint
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- v*
|
||||
branches:
|
||||
#- master
|
||||
#- main
|
||||
@ -17,11 +15,11 @@ jobs:
|
||||
name: lint
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/setup-go@v3
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-go@v4
|
||||
with:
|
||||
# NOTE: Keep this in sync with the version from go.mod
|
||||
go-version: 1.20.x
|
||||
- uses: actions/checkout@v3
|
||||
- name: golangci-lint
|
||||
uses: golangci/golangci-lint-action@v3
|
||||
with:
|
||||
|
5
.github/workflows/release-drafter.yml
vendored
5
.github/workflows/release-drafter.yml
vendored
@ -5,10 +5,7 @@ on:
|
||||
# branches to consider in the event; optional, defaults to all
|
||||
branches:
|
||||
- master
|
||||
# pull_request event is required only for autolabeler
|
||||
pull_request:
|
||||
# Only following types are handled by the action, but one can default to all as well
|
||||
types: [opened, reopened, synchronize]
|
||||
- main
|
||||
|
||||
jobs:
|
||||
update_release_draft:
|
||||
|
35
.github/workflows/sync-docs.yml
vendored
Normal file
35
.github/workflows/sync-docs.yml
vendored
Normal file
@ -0,0 +1,35 @@
|
||||
name: 'Sync docs'
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- main
|
||||
paths:
|
||||
- 'docs/**'
|
||||
release:
|
||||
types: [ published ]
|
||||
|
||||
jobs:
|
||||
sync-docs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
fetch-depth: 2
|
||||
- name: Setup Node.js environment
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: '18'
|
||||
|
||||
- name: Install JQ
|
||||
run: sudo apt-get install jq
|
||||
|
||||
- name: Sync docs
|
||||
run: ./.github/scripts/sync_docs.sh
|
||||
env:
|
||||
EVENT: ${{ github.event_name }}
|
||||
TAG_NAME: ${{ github.ref_name }}
|
||||
TOKEN: ${{ secrets.DOC_SYNC_TOKEN }}
|
36
.github/workflows/test.yml
vendored
36
.github/workflows/test.yml
vendored
@ -1,8 +1,18 @@
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- main
|
||||
- v3-beta
|
||||
paths:
|
||||
- '**'
|
||||
- '!docs/**'
|
||||
- '!**.md'
|
||||
pull_request:
|
||||
paths:
|
||||
- '**'
|
||||
- '!docs/**'
|
||||
- '!**.md'
|
||||
name: Test
|
||||
jobs:
|
||||
Build:
|
||||
@ -12,31 +22,15 @@ jobs:
|
||||
platform: [ubuntu-latest, windows-latest, macos-latest]
|
||||
runs-on: ${{ matrix.platform }}
|
||||
steps:
|
||||
- name: Install Go
|
||||
uses: actions/setup-go@v3
|
||||
with:
|
||||
go-version: ${{ matrix.go-version }}
|
||||
- name: Setup Golang caches
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
# In order:
|
||||
# * Module download cache
|
||||
# * Build cache (Linux)
|
||||
# * Build cache (Mac)
|
||||
# * Build cache (Windows)
|
||||
path: |
|
||||
~/go/pkg/mod
|
||||
~/.cache/go-build
|
||||
~/Library/Caches/go-build
|
||||
~\AppData\Local\go-build
|
||||
key: ${{ runner.os }}-go-${{ matrix.go-version }}-${{ hashFiles('**/go.sum') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-go-${{ matrix.go-version }}-
|
||||
- name: Fetch Repository
|
||||
uses: actions/checkout@v3
|
||||
- name: Install Go
|
||||
uses: actions/setup-go@v4
|
||||
with:
|
||||
go-version: ${{ matrix.go-version }}
|
||||
- name: Run Test
|
||||
uses: nick-fields/retry@v2
|
||||
with:
|
||||
max_attempts: 3
|
||||
timeout_minutes: 15
|
||||
command: go test ./... -v -race
|
||||
command: go test ./... -v -race -count=1
|
||||
|
35
.github/workflows/vulncheck.yml
vendored
35
.github/workflows/vulncheck.yml
vendored
@ -1,26 +1,35 @@
|
||||
name: Run govulncheck
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- main
|
||||
paths:
|
||||
- '**'
|
||||
- '!docs/**'
|
||||
- '!**.md'
|
||||
pull_request:
|
||||
name: Vulnerability Check
|
||||
paths:
|
||||
- '**'
|
||||
- '!docs/**'
|
||||
- '!**.md'
|
||||
|
||||
jobs:
|
||||
Security:
|
||||
govulncheck-check:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
GO111MODULE: on
|
||||
steps:
|
||||
- name: Install Go
|
||||
uses: actions/setup-go@v3
|
||||
with:
|
||||
go-version: 1.20.x
|
||||
check-latest: true
|
||||
- name: Fetch Repository
|
||||
uses: actions/checkout@v3
|
||||
- name: Install Go
|
||||
uses: actions/setup-go@v4
|
||||
with:
|
||||
go-version: 'stable'
|
||||
check-latest: true
|
||||
cache: false
|
||||
- name: Install Govulncheck
|
||||
run: |
|
||||
export GO111MODULE=on
|
||||
export PATH=${PATH}:`go env GOPATH`/bin
|
||||
go install golang.org/x/vuln/cmd/govulncheck@latest
|
||||
run: go install golang.org/x/vuln/cmd/govulncheck@latest
|
||||
- name: Run Govulncheck
|
||||
run: "`go env GOPATH`/bin/govulncheck ./..."
|
||||
|
||||
run: govulncheck ./...
|
85
app.go
85
app.go
@ -14,7 +14,6 @@ import (
|
||||
"encoding/xml"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"net"
|
||||
"net/http"
|
||||
"net/http/httputil"
|
||||
@ -24,7 +23,9 @@ import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/gofiber/fiber/v2/log"
|
||||
"github.com/gofiber/utils/v2"
|
||||
|
||||
"github.com/valyala/fasthttp"
|
||||
)
|
||||
|
||||
@ -565,7 +566,7 @@ func (app *App) handleTrustedProxy(ipAddress string) {
|
||||
if strings.Contains(ipAddress, "/") {
|
||||
_, ipNet, err := net.ParseCIDR(ipAddress)
|
||||
if err != nil {
|
||||
log.Printf("[Warning] IP range %q could not be parsed: %v\n", ipAddress, err)
|
||||
log.Warnf("IP range %q could not be parsed: %v", ipAddress, err)
|
||||
} else {
|
||||
app.config.trustedProxyRanges = append(app.config.trustedProxyRanges, ipNet)
|
||||
}
|
||||
@ -597,18 +598,23 @@ func (app *App) SetTLSHandler(tlsHandler *TLSHandler) {
|
||||
// Name Assign name to specific route.
|
||||
func (app *App) Name(name string) Router {
|
||||
app.mutex.Lock()
|
||||
defer app.mutex.Unlock()
|
||||
|
||||
latestGroup := app.latestRoute.group
|
||||
if latestGroup != nil {
|
||||
app.latestRoute.Name = latestGroup.name + name
|
||||
} else {
|
||||
app.latestRoute.Name = name
|
||||
for _, routes := range app.stack {
|
||||
for _, route := range routes {
|
||||
if route.Path == app.latestRoute.path {
|
||||
route.Name = name
|
||||
|
||||
if route.group != nil {
|
||||
route.Name = route.group.name + route.Name
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if err := app.hooks.executeOnNameHooks(*app.latestRoute); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
app.mutex.Unlock()
|
||||
|
||||
return app
|
||||
}
|
||||
@ -757,12 +763,16 @@ func (app *App) Patch(path string, handler Handler, middleware ...Handler) Route
|
||||
|
||||
// Add allows you to specify multiple HTTP methods to register a route.
|
||||
func (app *App) Add(methods []string, path string, handler Handler, middleware ...Handler) Router {
|
||||
return app.register(methods, path, nil, handler, middleware...)
|
||||
app.register(methods, path, nil, handler, middleware...)
|
||||
|
||||
return app
|
||||
}
|
||||
|
||||
// Static will create a file server serving static files
|
||||
func (app *App) Static(prefix, root string, config ...Static) Router {
|
||||
return app.registerStatic(prefix, root, config...)
|
||||
app.registerStatic(prefix, root, config...)
|
||||
|
||||
return app
|
||||
}
|
||||
|
||||
// All will register the handler on all HTTP methods
|
||||
@ -841,7 +851,7 @@ func (app *App) HandlersCount() uint32 {
|
||||
//
|
||||
// Shutdown does not close keepalive connections so its recommended to set ReadTimeout to something else than 0.
|
||||
func (app *App) Shutdown() error {
|
||||
return app.shutdownWithContext(context.Background())
|
||||
return app.ShutdownWithContext(context.Background())
|
||||
}
|
||||
|
||||
// ShutdownWithTimeout gracefully shuts down the server without interrupting any active connections. However, if the timeout is exceeded,
|
||||
@ -854,11 +864,15 @@ func (app *App) Shutdown() error {
|
||||
func (app *App) ShutdownWithTimeout(timeout time.Duration) error {
|
||||
ctx, cancelFunc := context.WithTimeout(context.Background(), timeout)
|
||||
defer cancelFunc()
|
||||
return app.shutdownWithContext(ctx)
|
||||
return app.ShutdownWithContext(ctx)
|
||||
}
|
||||
|
||||
// shutdownWithContext shuts down the server including by force if the context's deadline is exceeded.
|
||||
func (app *App) shutdownWithContext(ctx context.Context) error {
|
||||
// ShutdownWithContext shuts down the server including by force if the context's deadline is exceeded.
|
||||
//
|
||||
// Make sure the program doesn't exit and waits instead for ShutdownWithTimeout to return.
|
||||
//
|
||||
// ShutdownWithContext does not close keepalive connections so its recommended to set ReadTimeout to something else than 0.
|
||||
func (app *App) ShutdownWithContext(ctx context.Context) error {
|
||||
if app.hooks != nil {
|
||||
// TODO: check should be defered?
|
||||
app.hooks.executeOnShutdownHooks()
|
||||
@ -884,11 +898,11 @@ func (app *App) Hooks() *Hooks {
|
||||
|
||||
// Test is used for internal debugging by passing a *http.Request.
|
||||
// Timeout is optional and defaults to 1s, -1 will disable it completely.
|
||||
func (app *App) Test(req *http.Request, timeout ...time.Duration) (*http.Response, error) {
|
||||
func (app *App) Test(req *http.Request, msTimeout ...int) (*http.Response, error) {
|
||||
// Set timeout
|
||||
to := 1 * time.Second
|
||||
if len(timeout) > 0 {
|
||||
to = timeout[0]
|
||||
timeout := 1000
|
||||
if len(msTimeout) > 0 {
|
||||
timeout = msTimeout[0]
|
||||
}
|
||||
|
||||
// Add Content-Length if not provided with body
|
||||
@ -927,12 +941,12 @@ func (app *App) Test(req *http.Request, timeout ...time.Duration) (*http.Respons
|
||||
}()
|
||||
|
||||
// Wait for callback
|
||||
if to >= 0 {
|
||||
if timeout >= 0 {
|
||||
// With timeout
|
||||
select {
|
||||
case err = <-channel:
|
||||
case <-time.After(to):
|
||||
return nil, fmt.Errorf("test: timeout error after %s", to)
|
||||
case <-time.After(time.Duration(timeout) * time.Millisecond):
|
||||
return nil, fmt.Errorf("test: timeout error %vms", timeout)
|
||||
}
|
||||
} else {
|
||||
// Without timeout
|
||||
@ -969,7 +983,7 @@ func (app *App) init() *App {
|
||||
// Only load templates if a view engine is specified
|
||||
if app.config.Views != nil {
|
||||
if err := app.config.Views.Load(); err != nil {
|
||||
log.Printf("[Warning]: failed to load views: %v\n", err)
|
||||
log.Warnf("failed to load views: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
@ -1049,13 +1063,18 @@ func (app *App) serverErrorHandler(fctx *fasthttp.RequestCtx, err error) {
|
||||
|
||||
defer app.ReleaseCtx(c)
|
||||
|
||||
var errNetOP *net.OpError
|
||||
var (
|
||||
errNetOP *net.OpError
|
||||
netErr net.Error
|
||||
)
|
||||
|
||||
switch {
|
||||
case errors.As(err, new(*fasthttp.ErrSmallBuffer)):
|
||||
err = ErrRequestHeaderFieldsTooLarge
|
||||
case errors.As(err, &errNetOP) && errNetOP.Timeout():
|
||||
err = ErrRequestTimeout
|
||||
case errors.As(err, &netErr):
|
||||
err = ErrBadGateway
|
||||
case errors.Is(err, fasthttp.ErrBodyTooLarge):
|
||||
err = ErrRequestEntityTooLarge
|
||||
case errors.Is(err, fasthttp.ErrGetOnly):
|
||||
@ -1067,7 +1086,7 @@ func (app *App) serverErrorHandler(fctx *fasthttp.RequestCtx, err error) {
|
||||
}
|
||||
|
||||
if catch := app.ErrorHandler(c, err); catch != nil {
|
||||
log.Printf("serverErrorHandler: failed to call ErrorHandler: %v\n", catch)
|
||||
log.Errorf("serverErrorHandler: failed to call ErrorHandler: %v", catch)
|
||||
_ = c.SendStatus(StatusInternalServerError) //nolint:errcheck // It is fine to ignore the error here
|
||||
return
|
||||
}
|
||||
@ -1075,22 +1094,20 @@ func (app *App) serverErrorHandler(fctx *fasthttp.RequestCtx, err error) {
|
||||
|
||||
// startupProcess Is the method which executes all the necessary processes just before the start of the server.
|
||||
func (app *App) startupProcess() *App {
|
||||
if err := app.hooks.executeOnListenHooks(); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
app.mutex.Lock()
|
||||
defer app.mutex.Unlock()
|
||||
|
||||
// add routes of sub-apps
|
||||
app.mountFields.subAppsRoutesAdded.Do(func() {
|
||||
app.appendSubAppLists(app.mountFields.appList)
|
||||
app.addSubAppsRoutes(app.mountFields.appList)
|
||||
app.generateAppListKeys()
|
||||
})
|
||||
app.mountStartupProcess()
|
||||
|
||||
// build route tree stack
|
||||
app.buildTree()
|
||||
|
||||
return app
|
||||
}
|
||||
|
||||
// Run onListen hooks. If they return an error, panic.
|
||||
func (app *App) runOnListenHooks(listenData ListenData) {
|
||||
if err := app.hooks.executeOnListenHooks(listenData); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
130
app_test.go
130
app_test.go
@ -23,6 +23,8 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/gofiber/utils/v2"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/valyala/fasthttp"
|
||||
"github.com/valyala/fasthttp/fasthttputil"
|
||||
@ -249,7 +251,7 @@ func Test_App_ErrorHandler_RouteStack(t *testing.T) {
|
||||
require.Equal(t, 500, resp.StatusCode, "Status code")
|
||||
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
require.Equal(t, nil, err)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, "1: USE error", string(body))
|
||||
}
|
||||
|
||||
@ -264,6 +266,20 @@ func Test_App_serverErrorHandler_Internal_Error(t *testing.T) {
|
||||
require.Equal(t, c.fasthttp.Response.StatusCode(), StatusBadRequest)
|
||||
}
|
||||
|
||||
func Test_App_serverErrorHandler_Network_Error(t *testing.T) {
|
||||
t.Parallel()
|
||||
app := New()
|
||||
c := app.NewCtx(&fasthttp.RequestCtx{}).(*DefaultCtx) //nolint:errcheck, forcetypeassert // not needed
|
||||
|
||||
app.serverErrorHandler(c.fasthttp, &net.DNSError{
|
||||
Err: "test error",
|
||||
Name: "test host",
|
||||
IsTimeout: false,
|
||||
})
|
||||
require.Equal(t, string(c.fasthttp.Response.Body()), utils.StatusMessage(StatusBadGateway))
|
||||
require.Equal(t, c.fasthttp.Response.StatusCode(), StatusBadGateway)
|
||||
}
|
||||
|
||||
func Test_App_Nested_Params(t *testing.T) {
|
||||
t.Parallel()
|
||||
app := New()
|
||||
@ -785,6 +801,53 @@ func Test_App_ShutdownWithTimeout(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func Test_App_ShutdownWithContext(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
app := New()
|
||||
app.Get("/", func(ctx Ctx) error {
|
||||
time.Sleep(5 * time.Second)
|
||||
return ctx.SendString("body")
|
||||
})
|
||||
|
||||
ln := fasthttputil.NewInmemoryListener()
|
||||
|
||||
go func() {
|
||||
require.Equal(t, nil, app.Listener(ln))
|
||||
}()
|
||||
|
||||
time.Sleep(1 * time.Second)
|
||||
|
||||
go func() {
|
||||
conn, err := ln.Dial()
|
||||
if err != nil {
|
||||
t.Errorf("unexepcted error: %v", err)
|
||||
}
|
||||
|
||||
if _, err = conn.Write([]byte("GET / HTTP/1.1\r\nHost: google.com\r\n\r\n")); err != nil {
|
||||
t.Errorf("unexpected error: %v", err)
|
||||
}
|
||||
}()
|
||||
|
||||
time.Sleep(1 * time.Second)
|
||||
|
||||
shutdownErr := make(chan error)
|
||||
go func() {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
|
||||
defer cancel()
|
||||
shutdownErr <- app.ShutdownWithContext(ctx)
|
||||
}()
|
||||
|
||||
select {
|
||||
case <-time.After(5 * time.Second):
|
||||
t.Fatal("idle connections not closed on shutdown")
|
||||
case err := <-shutdownErr:
|
||||
if err == nil || !errors.Is(err, context.DeadlineExceeded) {
|
||||
t.Fatalf("unexpected err %v. Expecting %v", err, context.DeadlineExceeded)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// go test -run Test_App_Static_Index_Default
|
||||
func Test_App_Static_Index_Default(t *testing.T) {
|
||||
app := New()
|
||||
@ -1322,7 +1385,7 @@ func Test_Test_Timeout(t *testing.T) {
|
||||
return nil
|
||||
})
|
||||
|
||||
_, err = app.Test(httptest.NewRequest(MethodGet, "/timeout", nil), 20*time.Millisecond)
|
||||
_, err = app.Test(httptest.NewRequest(MethodGet, "/timeout", nil), 20)
|
||||
require.True(t, err != nil, "app.Test(req)")
|
||||
}
|
||||
|
||||
@ -1534,13 +1597,13 @@ func Test_App_New_Test_Parallel(t *testing.T) {
|
||||
t.Parallel()
|
||||
app := New(Config{Immutable: true})
|
||||
_, err := app.Test(httptest.NewRequest(MethodGet, "/", nil))
|
||||
require.Equal(t, nil, err)
|
||||
require.NoError(t, err)
|
||||
})
|
||||
t.Run("Test_App_New_Test_Parallel_2", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
app := New(Config{Immutable: true})
|
||||
_, err := app.Test(httptest.NewRequest(MethodGet, "/", nil))
|
||||
require.Equal(t, nil, err)
|
||||
require.NoError(t, err)
|
||||
})
|
||||
}
|
||||
|
||||
@ -1698,3 +1761,62 @@ func TestApp_GetRoutes(t *testing.T) {
|
||||
require.Equal(t, name, route.Name)
|
||||
}
|
||||
}
|
||||
|
||||
func Test_Middleware_Route_Naming_With_Use(t *testing.T) {
|
||||
named := "named"
|
||||
app := New()
|
||||
|
||||
app.Get("/unnamed", func(c Ctx) error {
|
||||
return c.Next()
|
||||
})
|
||||
|
||||
app.Post("/named", func(c Ctx) error {
|
||||
return c.Next()
|
||||
}).Name(named)
|
||||
|
||||
app.Use(func(c Ctx) error {
|
||||
return c.Next()
|
||||
}) // no name - logging MW
|
||||
|
||||
app.Use(func(c Ctx) error {
|
||||
return c.Next()
|
||||
}).Name("corsMW")
|
||||
|
||||
app.Use(func(c Ctx) error {
|
||||
return c.Next()
|
||||
}).Name("compressMW")
|
||||
|
||||
app.Use(func(c Ctx) error {
|
||||
return c.Next()
|
||||
}) // no name - cache MW
|
||||
|
||||
grp := app.Group("/pages").Name("pages.")
|
||||
grp.Use(func(c Ctx) error {
|
||||
return c.Next()
|
||||
}).Name("csrfMW")
|
||||
|
||||
grp.Get("/home", func(c Ctx) error {
|
||||
return c.Next()
|
||||
}).Name("home")
|
||||
|
||||
grp.Get("/unnamed", func(c Ctx) error {
|
||||
return c.Next()
|
||||
})
|
||||
|
||||
for _, route := range app.GetRoutes() {
|
||||
switch route.Path {
|
||||
case "/":
|
||||
require.Equal(t, "compressMW", route.Name)
|
||||
case "/unnamed":
|
||||
require.Equal(t, "", route.Name)
|
||||
case "named":
|
||||
require.Equal(t, named, route.Name)
|
||||
case "/pages":
|
||||
require.Equal(t, "pages.csrfMW", route.Name)
|
||||
case "/pages/home":
|
||||
require.Equal(t, "pages.home", route.Name)
|
||||
case "/pages/unnamed":
|
||||
require.Equal(t, "", route.Name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1577,7 +1577,7 @@ func Test_Bind_StructValidator(t *testing.T) {
|
||||
|
||||
rq := new(simpleQuery)
|
||||
c.Request().URI().SetQueryString("name=efe")
|
||||
require.Equal(t, "you should have entered right name!", c.Bind().Query(rq).Error())
|
||||
require.Equal(t, "you should have entered right name", c.Bind().Query(rq).Error())
|
||||
|
||||
rq = new(simpleQuery)
|
||||
c.Request().URI().SetQueryString("name=john")
|
||||
|
36
client.go
36
client.go
@ -77,50 +77,50 @@ type Client struct {
|
||||
JSONDecoder utils.JSONUnmarshal
|
||||
}
|
||||
|
||||
// Get returns a agent with http method GET.
|
||||
// Get returns an agent with http method GET.
|
||||
func Get(url string) *Agent { return defaultClient.Get(url) }
|
||||
|
||||
// Get returns a agent with http method GET.
|
||||
// Get returns an agent with http method GET.
|
||||
func (c *Client) Get(url string) *Agent {
|
||||
return c.createAgent(MethodGet, url)
|
||||
}
|
||||
|
||||
// Head returns a agent with http method HEAD.
|
||||
// Head returns an agent with http method HEAD.
|
||||
func Head(url string) *Agent { return defaultClient.Head(url) }
|
||||
|
||||
// Head returns a agent with http method GET.
|
||||
// Head returns an agent with http method GET.
|
||||
func (c *Client) Head(url string) *Agent {
|
||||
return c.createAgent(MethodHead, url)
|
||||
}
|
||||
|
||||
// Post sends POST request to the given url.
|
||||
// Post sends POST request to the given URL.
|
||||
func Post(url string) *Agent { return defaultClient.Post(url) }
|
||||
|
||||
// Post sends POST request to the given url.
|
||||
// Post sends POST request to the given URL.
|
||||
func (c *Client) Post(url string) *Agent {
|
||||
return c.createAgent(MethodPost, url)
|
||||
}
|
||||
|
||||
// Put sends PUT request to the given url.
|
||||
// Put sends PUT request to the given URL.
|
||||
func Put(url string) *Agent { return defaultClient.Put(url) }
|
||||
|
||||
// Put sends PUT request to the given url.
|
||||
// Put sends PUT request to the given URL.
|
||||
func (c *Client) Put(url string) *Agent {
|
||||
return c.createAgent(MethodPut, url)
|
||||
}
|
||||
|
||||
// Patch sends PATCH request to the given url.
|
||||
// Patch sends PATCH request to the given URL.
|
||||
func Patch(url string) *Agent { return defaultClient.Patch(url) }
|
||||
|
||||
// Patch sends PATCH request to the given url.
|
||||
// Patch sends PATCH request to the given URL.
|
||||
func (c *Client) Patch(url string) *Agent {
|
||||
return c.createAgent(MethodPatch, url)
|
||||
}
|
||||
|
||||
// Delete sends DELETE request to the given url.
|
||||
// Delete sends DELETE request to the given URL.
|
||||
func Delete(url string) *Agent { return defaultClient.Delete(url) }
|
||||
|
||||
// Delete sends DELETE request to the given url.
|
||||
// Delete sends DELETE request to the given URL.
|
||||
func (c *Client) Delete(url string) *Agent {
|
||||
return c.createAgent(MethodDelete, url)
|
||||
}
|
||||
@ -379,7 +379,7 @@ func (a *Agent) ContentTypeBytes(contentType []byte) *Agent {
|
||||
|
||||
/************************** URI Setting **************************/
|
||||
|
||||
// Host sets host for the uri.
|
||||
// Host sets host for the URI.
|
||||
func (a *Agent) Host(host string) *Agent {
|
||||
a.req.URI().SetHost(host)
|
||||
|
||||
@ -800,7 +800,7 @@ func (a *Agent) String() (int, string, []error) {
|
||||
return code, utils.UnsafeString(body), errs
|
||||
}
|
||||
|
||||
// Struct returns the status code, bytes body and errors of url.
|
||||
// Struct returns the status code, bytes body and errors of URL.
|
||||
// And bytes body will be unmarshalled to given v.
|
||||
//
|
||||
// it's not safe to use Agent after calling [Agent.Struct]
|
||||
@ -888,7 +888,7 @@ func AcquireClient() *Client {
|
||||
|
||||
// ReleaseClient returns c acquired via AcquireClient to client pool.
|
||||
//
|
||||
// It is forbidden accessing req and/or its' members after returning
|
||||
// It is forbidden accessing req and/or it's members after returning
|
||||
// it to client pool.
|
||||
func ReleaseClient(c *Client) {
|
||||
c.UserAgent = ""
|
||||
@ -912,9 +912,9 @@ func AcquireAgent() *Agent {
|
||||
return a
|
||||
}
|
||||
|
||||
// ReleaseAgent returns a acquired via AcquireAgent to Agent pool.
|
||||
// ReleaseAgent returns an acquired via AcquireAgent to Agent pool.
|
||||
//
|
||||
// It is forbidden accessing req and/or its' members after returning
|
||||
// It is forbidden accessing req and/or it's members after returning
|
||||
// it to Agent pool.
|
||||
func ReleaseAgent(a *Agent) {
|
||||
a.reset()
|
||||
@ -941,7 +941,7 @@ func AcquireResponse() *Response {
|
||||
|
||||
// ReleaseResponse return resp acquired via AcquireResponse to response pool.
|
||||
//
|
||||
// It is forbidden accessing resp and/or its' members after returning
|
||||
// It is forbidden accessing resp and/or it's members after returning
|
||||
// it to response pool.
|
||||
// Copy from fasthttp
|
||||
func ReleaseResponse(resp *Response) {
|
||||
|
@ -647,6 +647,14 @@ func (*readErrorConn) RemoteAddr() net.Addr {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (*readErrorConn) SetReadDeadline(_ time.Time) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (*readErrorConn) SetWriteDeadline(_ time.Time) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func Test_Client_Agent_RetryIf(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
|
176
ctx.go
176
ctx.go
@ -103,73 +103,22 @@ type Views interface {
|
||||
|
||||
// Accepts checks if the specified extensions or content types are acceptable.
|
||||
func (c *DefaultCtx) Accepts(offers ...string) string {
|
||||
if len(offers) == 0 {
|
||||
return ""
|
||||
}
|
||||
header := c.Get(HeaderAccept)
|
||||
if header == "" {
|
||||
return offers[0]
|
||||
}
|
||||
|
||||
spec, commaPos := "", 0
|
||||
for len(header) > 0 && commaPos != -1 {
|
||||
commaPos = strings.IndexByte(header, ',')
|
||||
if commaPos != -1 {
|
||||
spec = strings.TrimLeft(header[:commaPos], " ")
|
||||
} else {
|
||||
spec = strings.TrimLeft(header, " ")
|
||||
}
|
||||
if factorSign := strings.IndexByte(spec, ';'); factorSign != -1 {
|
||||
spec = spec[:factorSign]
|
||||
}
|
||||
|
||||
var mimetype string
|
||||
for _, offer := range offers {
|
||||
if len(offer) == 0 {
|
||||
continue
|
||||
// Accept: */*
|
||||
} else if spec == "*/*" {
|
||||
return offer
|
||||
}
|
||||
|
||||
if strings.IndexByte(offer, '/') != -1 {
|
||||
mimetype = offer // MIME type
|
||||
} else {
|
||||
mimetype = utils.GetMIME(offer) // extension
|
||||
}
|
||||
|
||||
if spec == mimetype {
|
||||
// Accept: <MIME_type>/<MIME_subtype>
|
||||
return offer
|
||||
}
|
||||
|
||||
s := strings.IndexByte(mimetype, '/')
|
||||
// Accept: <MIME_type>/*
|
||||
if strings.HasPrefix(spec, mimetype[:s]) && (spec[s:] == "/*" || mimetype[s:] == "/*") {
|
||||
return offer
|
||||
}
|
||||
}
|
||||
if commaPos != -1 {
|
||||
header = header[commaPos+1:]
|
||||
}
|
||||
}
|
||||
|
||||
return ""
|
||||
return getOffer(c.Get(HeaderAccept), acceptsOfferType, offers...)
|
||||
}
|
||||
|
||||
// AcceptsCharsets checks if the specified charset is acceptable.
|
||||
func (c *DefaultCtx) AcceptsCharsets(offers ...string) string {
|
||||
return getOffer(c.Get(HeaderAcceptCharset), offers...)
|
||||
return getOffer(c.Get(HeaderAcceptCharset), acceptsOffer, offers...)
|
||||
}
|
||||
|
||||
// AcceptsEncodings checks if the specified encoding is acceptable.
|
||||
func (c *DefaultCtx) AcceptsEncodings(offers ...string) string {
|
||||
return getOffer(c.Get(HeaderAcceptEncoding), offers...)
|
||||
return getOffer(c.Get(HeaderAcceptEncoding), acceptsOffer, offers...)
|
||||
}
|
||||
|
||||
// AcceptsLanguages checks if the specified language is acceptable.
|
||||
func (c *DefaultCtx) AcceptsLanguages(offers ...string) string {
|
||||
return getOffer(c.Get(HeaderAcceptLanguage), offers...)
|
||||
return getOffer(c.Get(HeaderAcceptLanguage), acceptsOffer, offers...)
|
||||
}
|
||||
|
||||
// App returns the *App reference to the instance of the Fiber application
|
||||
@ -775,7 +724,7 @@ func (c *DefaultCtx) Next() error {
|
||||
// Increment handler index
|
||||
c.indexHandler++
|
||||
var err error
|
||||
// Did we executed all route handlers?
|
||||
// Did we execute all route handlers?
|
||||
if c.indexHandler < len(c.route.Handlers) {
|
||||
// Continue route stack
|
||||
err = c.route.Handlers[c.indexHandler](c)
|
||||
@ -920,6 +869,35 @@ func (c *DefaultCtx) Query(key string, defaultValue ...string) string {
|
||||
return defaultString(c.app.getString(c.fasthttp.QueryArgs().Peek(key)), defaultValue)
|
||||
}
|
||||
|
||||
// Queries returns a map of query parameters and their values.
|
||||
//
|
||||
// GET /?name=alex&wanna_cake=2&id=
|
||||
// Queries()["name"] == "alex"
|
||||
// Queries()["wanna_cake"] == "2"
|
||||
// Queries()["id"] == ""
|
||||
//
|
||||
// GET /?field1=value1&field1=value2&field2=value3
|
||||
// Queries()["field1"] == "value2"
|
||||
// Queries()["field2"] == "value3"
|
||||
//
|
||||
// GET /?list_a=1&list_a=2&list_a=3&list_b[]=1&list_b[]=2&list_b[]=3&list_c=1,2,3
|
||||
// Queries()["list_a"] == "3"
|
||||
// Queries()["list_b[]"] == "3"
|
||||
// Queries()["list_c"] == "1,2,3"
|
||||
//
|
||||
// GET /api/search?filters.author.name=John&filters.category.name=Technology&filters[customer][name]=Alice&filters[status]=pending
|
||||
// Queries()["filters.author.name"] == "John"
|
||||
// Queries()["filters.category.name"] == "Technology"
|
||||
// Queries()["filters[customer][name]"] == "Alice"
|
||||
// Queries()["filters[status]"] == "pending"
|
||||
func (c *DefaultCtx) Queries() map[string]string {
|
||||
m := make(map[string]string, c.Context().QueryArgs().Len())
|
||||
c.Context().QueryArgs().VisitAll(func(key, value []byte) {
|
||||
m[c.app.getString(key)] = c.app.getString(value)
|
||||
})
|
||||
return m
|
||||
}
|
||||
|
||||
// QueryInt returns integer value of key string parameter in the url.
|
||||
// Default to empty or invalid key is 0.
|
||||
//
|
||||
@ -941,6 +919,48 @@ func (c *DefaultCtx) QueryInt(key string, defaultValue ...int) int {
|
||||
return value
|
||||
}
|
||||
|
||||
// QueryBool returns bool value of key string parameter in the url.
|
||||
// Default to empty or invalid key is true.
|
||||
//
|
||||
// Get /?name=alex&want_pizza=false&id=
|
||||
// QueryBool("want_pizza") == false
|
||||
// QueryBool("want_pizza", true) == false
|
||||
// QueryBool("name") == false
|
||||
// QueryBool("name", true) == true
|
||||
// QueryBool("id") == false
|
||||
// QueryBool("id", true) == true
|
||||
func (c *DefaultCtx) QueryBool(key string, defaultValue ...bool) bool {
|
||||
value, err := strconv.ParseBool(c.app.getString(c.fasthttp.QueryArgs().Peek(key)))
|
||||
if err != nil {
|
||||
if len(defaultValue) > 0 {
|
||||
return defaultValue[0]
|
||||
}
|
||||
return false
|
||||
}
|
||||
return value
|
||||
}
|
||||
|
||||
// QueryFloat returns float64 value of key string parameter in the url.
|
||||
// Default to empty or invalid key is 0.
|
||||
//
|
||||
// GET /?name=alex&amount=32.23&id=
|
||||
// QueryFloat("amount") = 32.23
|
||||
// QueryFloat("amount", 3) = 32.23
|
||||
// QueryFloat("name", 1) = 1
|
||||
// QueryFloat("name") = 0
|
||||
// QueryFloat("id", 3) = 3
|
||||
func (c *DefaultCtx) QueryFloat(key string, defaultValue ...float64) float64 {
|
||||
// use strconv.ParseFloat to convert the param to a float or return zero and an error.
|
||||
value, err := strconv.ParseFloat(c.app.getString(c.fasthttp.QueryArgs().Peek(key)), 64)
|
||||
if err != nil {
|
||||
if len(defaultValue) > 0 {
|
||||
return defaultValue[0]
|
||||
}
|
||||
return 0
|
||||
}
|
||||
return value
|
||||
}
|
||||
|
||||
// Range returns a struct containing the type and a slice of ranges.
|
||||
func (c *DefaultCtx) Range(size int) (Range, error) {
|
||||
var rangeData Range
|
||||
@ -1009,7 +1029,6 @@ func (c *DefaultCtx) BindVars(vars Map) error {
|
||||
for k, v := range vars {
|
||||
c.viewBindMap.Store(k, v)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -1106,28 +1125,31 @@ func (c *DefaultCtx) Render(name string, bind Map, layouts ...string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *DefaultCtx) renderExtensions(bind Map) {
|
||||
// Bind view map
|
||||
c.viewBindMap.Range(func(key, value any) bool {
|
||||
keyS, ok := key.(string)
|
||||
if !ok {
|
||||
panic(fmt.Errorf("failed to type-assert to string"))
|
||||
}
|
||||
bind[keyS] = value
|
||||
|
||||
return true
|
||||
})
|
||||
|
||||
// Check if the PassLocalsToViews option is enabled (by default it is disabled)
|
||||
if c.app.config.PassLocalsToViews {
|
||||
// Loop through each local and set it in the map
|
||||
c.fasthttp.VisitUserValues(func(key []byte, val any) {
|
||||
// check if bindMap doesn't contain the key
|
||||
if _, ok := bind[utils.UnsafeString(key)]; !ok {
|
||||
// Set the key and value in the bindMap
|
||||
bind[utils.UnsafeString(key)] = val
|
||||
func (c *DefaultCtx) renderExtensions(bind interface{}) {
|
||||
if bindMap, ok := bind.(Map); ok {
|
||||
// Bind view map
|
||||
c.viewBindMap.Range(func(key, value interface{}) bool {
|
||||
keyValue, ok := key.(string)
|
||||
if !ok {
|
||||
return true
|
||||
}
|
||||
if _, ok := bindMap[keyValue]; !ok {
|
||||
bindMap[keyValue] = value
|
||||
}
|
||||
return true
|
||||
})
|
||||
|
||||
// Check if the PassLocalsToViews option is enabled (by default it is disabled)
|
||||
if c.app.config.PassLocalsToViews {
|
||||
// Loop through each local and set it in the map
|
||||
c.fasthttp.VisitUserValues(func(key []byte, val interface{}) {
|
||||
// check if bindMap doesn't contain the key
|
||||
if _, ok := bindMap[c.app.getString(key)]; !ok {
|
||||
// Set the key and value in the bindMap
|
||||
bindMap[c.app.getString(key)] = val
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
if len(c.app.mountFields.appListKeys) == 0 {
|
||||
|
@ -237,6 +237,29 @@ type Ctx interface {
|
||||
// QueryInt("id") == 0
|
||||
QueryInt(key string, defaultValue ...int) int
|
||||
|
||||
// QueryBool returns bool value of key string parameter in the url.
|
||||
// Default to empty or invalid key is true.
|
||||
//
|
||||
// Get /?name=alex&want_pizza=false&id=
|
||||
// QueryBool("want_pizza") == false
|
||||
// QueryBool("want_pizza", true) == false
|
||||
// QueryBool("name") == false
|
||||
// QueryBool("name", true) == true
|
||||
// QueryBool("id") == false
|
||||
// QueryBool("id", true) == true
|
||||
QueryBool(key string, defaultValue ...bool) bool
|
||||
|
||||
// QueryFloat returns float64 value of key string parameter in the url.
|
||||
// Default to empty or invalid key is 0.
|
||||
//
|
||||
// GET /?name=alex&amount=32.23&id=
|
||||
// QueryFloat("amount") = 32.23
|
||||
// QueryFloat("amount", 3) = 32.23
|
||||
// QueryFloat("name", 1) = 1
|
||||
// QueryFloat("name") = 0
|
||||
// QueryFloat("id", 3) = 3
|
||||
QueryFloat(key string, defaultValue ...float64) float64
|
||||
|
||||
// Range returns a struct containing the type and a slice of ranges.
|
||||
Range(size int) (rangeData Range, err error)
|
||||
|
||||
|
83
ctx_test.go
83
ctx_test.go
@ -43,6 +43,10 @@ func Test_Ctx_Accepts(t *testing.T) {
|
||||
require.Equal(t, "", c.Accepts())
|
||||
require.Equal(t, ".xml", c.Accepts(".xml"))
|
||||
require.Equal(t, "", c.Accepts(".john"))
|
||||
require.Equal(t, "application/xhtml+xml", c.Accepts("application/xml", "application/xml+rss", "application/yaml", "application/xhtml+xml"), "must use client-preferred mime type")
|
||||
|
||||
c.Request().Header.Set(HeaderAccept, "application/json, text/plain, */*;q=0")
|
||||
require.Equal(t, "", c.Accepts("html"), "must treat */*;q=0 as not acceptable")
|
||||
|
||||
c.Request().Header.Set(HeaderAccept, "text/*, application/json")
|
||||
require.Equal(t, "html", c.Accepts("html"))
|
||||
@ -62,16 +66,29 @@ func Test_Ctx_Accepts(t *testing.T) {
|
||||
// go test -v -run=^$ -bench=Benchmark_Ctx_Accepts -benchmem -count=4
|
||||
func Benchmark_Ctx_Accepts(b *testing.B) {
|
||||
app := New()
|
||||
c := app.NewCtx(&fasthttp.RequestCtx{}).(*DefaultCtx) //nolint:errcheck, forcetypeassert // not needed
|
||||
c := app.NewCtx(&fasthttp.RequestCtx{})
|
||||
|
||||
c.Request().Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9")
|
||||
var res string
|
||||
b.ReportAllocs()
|
||||
b.ResetTimer()
|
||||
for n := 0; n < b.N; n++ {
|
||||
res = c.Accepts(".xml")
|
||||
acceptHeader := "text/html,application/xhtml+xml,application/xml;q=0.9"
|
||||
c.Request().Header.Set("Accept", acceptHeader)
|
||||
acceptValues := [][]string{
|
||||
{".xml"},
|
||||
{"json", "xml"},
|
||||
{"application/json", "application/xml"},
|
||||
}
|
||||
expectedResults := []string{".xml", "xml", "application/xml"}
|
||||
|
||||
for i := 0; i < len(acceptValues); i++ {
|
||||
b.Run(fmt.Sprintf("run-%#v", acceptValues[i]), func(bb *testing.B) {
|
||||
var res string
|
||||
bb.ReportAllocs()
|
||||
bb.ResetTimer()
|
||||
|
||||
for n := 0; n < bb.N; n++ {
|
||||
res = c.Accepts(acceptValues[i]...)
|
||||
}
|
||||
require.Equal(bb, expectedResults[i], res)
|
||||
})
|
||||
}
|
||||
require.Equal(b, ".xml", res)
|
||||
}
|
||||
|
||||
type customCtx struct {
|
||||
@ -495,6 +512,14 @@ func Test_Ctx_Cookie(t *testing.T) {
|
||||
cookie.MaxAge = 10000
|
||||
c.Cookie(cookie)
|
||||
require.Equal(t, expect, string(c.Response().Header.Peek(HeaderSetCookie)))
|
||||
|
||||
expect = "username=john; path=/; secure; SameSite=None"
|
||||
// should remove expires and max-age headers when no expire and no MaxAge (default time)
|
||||
cookie.SessionOnly = false
|
||||
cookie.Expires = time.Time{}
|
||||
cookie.MaxAge = 0
|
||||
c.Cookie(cookie)
|
||||
require.Equal(t, expect, string(c.Response().Header.Peek(HeaderSetCookie)))
|
||||
}
|
||||
|
||||
// go test -v -run=^$ -bench=Benchmark_Ctx_Cookie -benchmem -count=4
|
||||
@ -1647,7 +1672,7 @@ func Test_Ctx_Params_Case_Sensitive(t *testing.T) {
|
||||
require.Equal(t, StatusOK, resp.StatusCode, "Status code")
|
||||
|
||||
resp, err = app.Test(httptest.NewRequest(MethodGet, "/test2/first/second", nil))
|
||||
require.Equal(t, nil, err)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, StatusOK, resp.StatusCode, "Status code")
|
||||
}
|
||||
|
||||
@ -1905,6 +1930,36 @@ func Test_Ctx_QueryInt(t *testing.T) {
|
||||
require.Equal(t, 2, c.QueryInt("id", 2))
|
||||
}
|
||||
|
||||
func Test_Ctx_QueryBool(t *testing.T) {
|
||||
t.Parallel()
|
||||
app := New()
|
||||
c := app.NewCtx(&fasthttp.RequestCtx{})
|
||||
|
||||
c.Request().URI().SetQueryString("name=alex&want_pizza=false&id=")
|
||||
|
||||
require.Equal(t, false, c.QueryBool("want_pizza"))
|
||||
require.Equal(t, false, c.QueryBool("want_pizza", true))
|
||||
require.Equal(t, false, c.QueryBool("name"))
|
||||
require.Equal(t, true, c.QueryBool("name", true))
|
||||
require.Equal(t, false, c.QueryBool("id"))
|
||||
require.Equal(t, true, c.QueryBool("id", true))
|
||||
}
|
||||
|
||||
func Test_Ctx_QueryFloat(t *testing.T) {
|
||||
t.Parallel()
|
||||
app := New()
|
||||
c := app.NewCtx(&fasthttp.RequestCtx{})
|
||||
|
||||
c.Request().URI().SetQueryString("name=alex&amount=32.23&id=")
|
||||
|
||||
require.Equal(t, 32.23, c.QueryFloat("amount"))
|
||||
require.Equal(t, 32.23, c.QueryFloat("amount", 3.123))
|
||||
require.Equal(t, 87.123, c.QueryFloat("name", 87.123))
|
||||
require.Equal(t, float64(0), c.QueryFloat("name"))
|
||||
require.Equal(t, 12.87, c.QueryFloat("id", 12.87))
|
||||
require.Equal(t, float64(0), c.QueryFloat("id"))
|
||||
}
|
||||
|
||||
// go test -run Test_Ctx_Range
|
||||
func Test_Ctx_Range(t *testing.T) {
|
||||
t.Parallel()
|
||||
@ -2610,7 +2665,7 @@ func Test_Ctx_RenderWithOverwrittenBind(t *testing.T) {
|
||||
_, _ = buf.WriteString("overwrite") //nolint:errcheck // This will never fail
|
||||
defer bytebufferpool.Put(buf)
|
||||
|
||||
require.Equal(t, "<h1>Hello, World!</h1>", string(c.Response().Body()))
|
||||
require.Equal(t, "<h1>Hello from Fiber!</h1>", string(c.Response().Body()))
|
||||
}
|
||||
|
||||
func Test_Ctx_RenderWithBindVarsLocals(t *testing.T) {
|
||||
@ -3474,16 +3529,16 @@ func TestCtx_ParamsInt(t *testing.T) {
|
||||
})
|
||||
|
||||
_, err := app.Test(httptest.NewRequest(MethodGet, "/test/1111", nil))
|
||||
require.Equal(t, nil, err)
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = app.Test(httptest.NewRequest(MethodGet, "/testnoint/xd", nil))
|
||||
require.Equal(t, nil, err)
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = app.Test(httptest.NewRequest(MethodGet, "/testignoredefault/2222", nil))
|
||||
require.Equal(t, nil, err)
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = app.Test(httptest.NewRequest(MethodGet, "/testdefault/xd", nil))
|
||||
require.Equal(t, nil, err)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
// go test -run Test_Ctx_GetRespHeader
|
||||
|
8
docs/api/_category_.json
Normal file
8
docs/api/_category_.json
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"label": "API",
|
||||
"position": 2,
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
"description": "API documentation for Fiber."
|
||||
}
|
||||
}
|
657
docs/api/app.md
Normal file
657
docs/api/app.md
Normal file
@ -0,0 +1,657 @@
|
||||
---
|
||||
id: app
|
||||
title: 🚀 App
|
||||
description: The app instance conventionally denotes the Fiber application.
|
||||
sidebar_position: 2
|
||||
---
|
||||
|
||||
import RoutingHandler from './../partials/routing/handler.md';
|
||||
|
||||
## Static
|
||||
|
||||
Use the **Static** method to serve static files such as **images**, **CSS,** and **JavaScript**.
|
||||
|
||||
:::info
|
||||
By default, **Static** will serve `index.html` files in response to a request on a directory.
|
||||
:::
|
||||
|
||||
```go title="Signature"
|
||||
func (app *App) Static(prefix, root string, config ...Static) Router
|
||||
```
|
||||
|
||||
Use the following code to serve files in a directory named `./public`
|
||||
|
||||
```go
|
||||
app.Static("/", "./public")
|
||||
|
||||
// => http://localhost:3000/hello.html
|
||||
// => http://localhost:3000/js/jquery.js
|
||||
// => http://localhost:3000/css/style.css
|
||||
```
|
||||
|
||||
```go title="Examples"
|
||||
// Serve files from multiple directories
|
||||
app.Static("/", "./public")
|
||||
|
||||
// Serve files from "./files" directory:
|
||||
app.Static("/", "./files")
|
||||
```
|
||||
|
||||
You can use any virtual path prefix \(_where the path does not actually exist in the file system_\) for files that are served by the **Static** method, specify a prefix path for the static directory, as shown below:
|
||||
|
||||
```go title="Examples"
|
||||
app.Static("/static", "./public")
|
||||
|
||||
// => http://localhost:3000/static/hello.html
|
||||
// => http://localhost:3000/static/js/jquery.js
|
||||
// => http://localhost:3000/static/css/style.css
|
||||
```
|
||||
|
||||
If you want to have a little bit more control regarding the settings for serving static files. You could use the `fiber.Static` struct to enable specific settings.
|
||||
|
||||
```go title="fiber.Static{}"
|
||||
// Static defines configuration options when defining static assets.
|
||||
type Static struct {
|
||||
// When set to true, the server tries minimizing CPU usage by caching compressed files.
|
||||
// This works differently than the github.com/gofiber/compression middleware.
|
||||
// Optional. Default value false
|
||||
Compress bool `json:"compress"`
|
||||
|
||||
// When set to true, enables byte range requests.
|
||||
// Optional. Default value false
|
||||
ByteRange bool `json:"byte_range"`
|
||||
|
||||
// When set to true, enables directory browsing.
|
||||
// Optional. Default value false.
|
||||
Browse bool `json:"browse"`
|
||||
|
||||
// When set to true, enables direct download.
|
||||
// Optional. Default value false.
|
||||
Download bool `json:"download"`
|
||||
|
||||
// The name of the index file for serving a directory.
|
||||
// Optional. Default value "index.html".
|
||||
Index string `json:"index"`
|
||||
|
||||
// Expiration duration for inactive file handlers.
|
||||
// Use a negative time.Duration to disable it.
|
||||
//
|
||||
// Optional. Default value 10 * time.Second.
|
||||
CacheDuration time.Duration `json:"cache_duration"`
|
||||
|
||||
// The value for the Cache-Control HTTP-header
|
||||
// that is set on the file response. MaxAge is defined in seconds.
|
||||
//
|
||||
// Optional. Default value 0.
|
||||
MaxAge int `json:"max_age"`
|
||||
|
||||
// ModifyResponse defines a function that allows you to alter the response.
|
||||
//
|
||||
// Optional. Default: nil
|
||||
ModifyResponse Handler
|
||||
|
||||
// Next defines a function to skip this middleware when returned true.
|
||||
//
|
||||
// Optional. Default: nil
|
||||
Next func(c *Ctx) bool
|
||||
}
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
// Custom config
|
||||
app.Static("/", "./public", fiber.Static{
|
||||
Compress: true,
|
||||
ByteRange: true,
|
||||
Browse: true,
|
||||
Index: "john.html",
|
||||
CacheDuration: 10 * time.Second,
|
||||
MaxAge: 3600,
|
||||
})
|
||||
```
|
||||
|
||||
## Route Handlers
|
||||
|
||||
<RoutingHandler />
|
||||
|
||||
## Mount
|
||||
|
||||
You can Mount Fiber instance by creating a `*Mount`
|
||||
|
||||
```go title="Signature"
|
||||
func (a *App) Mount(prefix string, app *App) Router
|
||||
```
|
||||
|
||||
```go title="Examples"
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
micro := fiber.New()
|
||||
app.Mount("/john", micro) // GET /john/doe -> 200 OK
|
||||
|
||||
micro.Get("/doe", func(c *fiber.Ctx) error {
|
||||
return c.SendStatus(fiber.StatusOK)
|
||||
})
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
```
|
||||
|
||||
## MountPath
|
||||
|
||||
The `MountPath` property contains one or more path patterns on which a sub-app was mounted.
|
||||
|
||||
```go title="Signature"
|
||||
func (app *App) MountPath() string
|
||||
```
|
||||
|
||||
```go title="Examples"
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
one := fiber.New()
|
||||
two := fiber.New()
|
||||
three := fiber.New()
|
||||
|
||||
two.Mount("/three", three)
|
||||
one.Mount("/two", two)
|
||||
app.Mount("/one", one)
|
||||
|
||||
one.MountPath() // "/one"
|
||||
two.MountPath() // "/one/two"
|
||||
three.MountPath() // "/one/two/three"
|
||||
app.MountPath() // ""
|
||||
}
|
||||
```
|
||||
|
||||
:::caution
|
||||
Mounting order is important for MountPath. If you want to get mount paths properly, you should start mounting from the deepest app.
|
||||
:::
|
||||
|
||||
## Group
|
||||
|
||||
You can group routes by creating a `*Group` struct.
|
||||
|
||||
```go title="Signature"
|
||||
func (app *App) Group(prefix string, handlers ...Handler) Router
|
||||
```
|
||||
|
||||
```go title="Examples"
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
api := app.Group("/api", handler) // /api
|
||||
|
||||
v1 := api.Group("/v1", handler) // /api/v1
|
||||
v1.Get("/list", handler) // /api/v1/list
|
||||
v1.Get("/user", handler) // /api/v1/user
|
||||
|
||||
v2 := api.Group("/v2", handler) // /api/v2
|
||||
v2.Get("/list", handler) // /api/v2/list
|
||||
v2.Get("/user", handler) // /api/v2/user
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
```
|
||||
|
||||
## Route
|
||||
|
||||
You can define routes with a common prefix inside the common function.
|
||||
|
||||
```go title="Signature"
|
||||
func (app *App) Route(prefix string, fn func(router Router), name ...string) Router
|
||||
```
|
||||
|
||||
```go title="Examples"
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
app.Route("/test", func(api fiber.Router) {
|
||||
api.Get("/foo", handler).Name("foo") // /test/foo (name: test.foo)
|
||||
api.Get("/bar", handler).Name("bar") // /test/bar (name: test.bar)
|
||||
}, "test.")
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
```
|
||||
|
||||
## Server
|
||||
|
||||
Server returns the underlying [fasthttp server](https://godoc.org/github.com/valyala/fasthttp#Server)
|
||||
|
||||
```go title="Signature"
|
||||
func (app *App) Server() *fasthttp.Server
|
||||
```
|
||||
|
||||
```go title="Examples"
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
app.Server().MaxConnsPerIP = 1
|
||||
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
## Server Shutdown
|
||||
|
||||
Shutdown gracefully shuts down the server without interrupting any active connections. Shutdown works by first closing all open listeners and then waits indefinitely for all connections to return to idle before shutting down.
|
||||
|
||||
ShutdownWithTimeout will forcefully close any active connections after the timeout expires.
|
||||
|
||||
ShutdownWithContext shuts down the server including by force if the context's deadline is exceeded.
|
||||
|
||||
```go
|
||||
func (app *App) Shutdown() error
|
||||
func (app *App) ShutdownWithTimeout(timeout time.Duration) error
|
||||
func (app *App) ShutdownWithContext(ctx context.Context) error
|
||||
```
|
||||
|
||||
## HandlersCount
|
||||
|
||||
This method returns the amount of registered handlers.
|
||||
|
||||
```go title="Signature"
|
||||
func (app *App) HandlersCount() uint32
|
||||
```
|
||||
|
||||
## Stack
|
||||
|
||||
This method returns the original router stack
|
||||
|
||||
```go title="Signature"
|
||||
func (app *App) Stack() [][]*Route
|
||||
```
|
||||
|
||||
```go title="Examples"
|
||||
var handler = func(c *fiber.Ctx) error { return nil }
|
||||
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
app.Get("/john/:age", handler)
|
||||
app.Post("/register", handler)
|
||||
|
||||
data, _ := json.MarshalIndent(app.Stack(), "", " ")
|
||||
fmt.Println(string(data))
|
||||
|
||||
app.Listen(":3000")
|
||||
}
|
||||
```
|
||||
|
||||
```javascript title="Result"
|
||||
[
|
||||
[
|
||||
{
|
||||
"method": "GET",
|
||||
"path": "/john/:age",
|
||||
"params": [
|
||||
"age"
|
||||
]
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
"method": "HEAD",
|
||||
"path": "/john/:age",
|
||||
"params": [
|
||||
"age"
|
||||
]
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
"method": "POST",
|
||||
"path": "/register",
|
||||
"params": null
|
||||
}
|
||||
]
|
||||
]
|
||||
```
|
||||
|
||||
## Name
|
||||
|
||||
This method assigns the name of latest created route.
|
||||
|
||||
```go title="Signature"
|
||||
func (app *App) Name(name string) Router
|
||||
```
|
||||
|
||||
```go title="Examples"
|
||||
var handler = func(c *fiber.Ctx) error { return nil }
|
||||
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
app.Get("/", handler)
|
||||
app.Name("index")
|
||||
|
||||
app.Get("/doe", handler).Name("home")
|
||||
|
||||
app.Trace("/tracer", handler).Name("tracert")
|
||||
|
||||
app.Delete("/delete", handler).Name("delete")
|
||||
|
||||
a := app.Group("/a")
|
||||
a.Name("fd.")
|
||||
|
||||
a.Get("/test", handler).Name("test")
|
||||
|
||||
data, _ := json.MarshalIndent(app.Stack(), "", " ")
|
||||
fmt.Print(string(data))
|
||||
|
||||
app.Listen(":3000")
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
```javascript title="Result"
|
||||
[
|
||||
[
|
||||
{
|
||||
"method": "GET",
|
||||
"name": "index",
|
||||
"path": "/",
|
||||
"params": null
|
||||
},
|
||||
{
|
||||
"method": "GET",
|
||||
"name": "home",
|
||||
"path": "/doe",
|
||||
"params": null
|
||||
},
|
||||
{
|
||||
"method": "GET",
|
||||
"name": "fd.test",
|
||||
"path": "/a/test",
|
||||
"params": null
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
"method": "HEAD",
|
||||
"name": "",
|
||||
"path": "/",
|
||||
"params": null
|
||||
},
|
||||
{
|
||||
"method": "HEAD",
|
||||
"name": "",
|
||||
"path": "/doe",
|
||||
"params": null
|
||||
},
|
||||
{
|
||||
"method": "HEAD",
|
||||
"name": "",
|
||||
"path": "/a/test",
|
||||
"params": null
|
||||
}
|
||||
],
|
||||
null,
|
||||
null,
|
||||
[
|
||||
{
|
||||
"method": "DELETE",
|
||||
"name": "delete",
|
||||
"path": "/delete",
|
||||
"params": null
|
||||
}
|
||||
],
|
||||
null,
|
||||
null,
|
||||
[
|
||||
{
|
||||
"method": "TRACE",
|
||||
"name": "tracert",
|
||||
"path": "/tracer",
|
||||
"params": null
|
||||
}
|
||||
],
|
||||
null
|
||||
]
|
||||
```
|
||||
|
||||
## GetRoute
|
||||
|
||||
This method gets the route by name.
|
||||
|
||||
```go title="Signature"
|
||||
func (app *App) GetRoute(name string) Route
|
||||
```
|
||||
|
||||
```go title="Examples"
|
||||
var handler = func(c *fiber.Ctx) error { return nil }
|
||||
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
app.Get("/", handler).Name("index")
|
||||
|
||||
data, _ := json.MarshalIndent(app.GetRoute("index"), "", " ")
|
||||
fmt.Print(string(data))
|
||||
|
||||
|
||||
app.Listen(":3000")
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
```javascript title="Result"
|
||||
{
|
||||
"method": "GET",
|
||||
"name": "index",
|
||||
"path": "/",
|
||||
"params": null
|
||||
}
|
||||
```
|
||||
|
||||
## GetRoutes
|
||||
|
||||
This method gets all routes.
|
||||
|
||||
```go title="Signature"
|
||||
func (app *App) GetRoutes(filterUseOption ...bool) []Route
|
||||
```
|
||||
|
||||
When filterUseOption equal to true, it will filter the routes registered by the middleware.
|
||||
```go title="Examples"
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
app.Post("/", func (c *fiber.Ctx) error {
|
||||
return c.SendString("Hello, World!")
|
||||
}).Name("index")
|
||||
data, _ := json.MarshalIndent(app.GetRoutes(true), "", " ")
|
||||
fmt.Print(string(data))
|
||||
}
|
||||
```
|
||||
|
||||
```javascript title="Result"
|
||||
[
|
||||
{
|
||||
"method": "POST",
|
||||
"name": "index",
|
||||
"path": "/",
|
||||
"params": null
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
## Config
|
||||
|
||||
Config returns the app config as value \( read-only \).
|
||||
|
||||
```go title="Signature"
|
||||
func (app *App) Config() Config
|
||||
```
|
||||
|
||||
## Handler
|
||||
|
||||
Handler returns the server handler that can be used to serve custom \*fasthttp.RequestCtx requests.
|
||||
|
||||
```go title="Signature"
|
||||
func (app *App) Handler() fasthttp.RequestHandler
|
||||
```
|
||||
|
||||
## Listen
|
||||
|
||||
Listen serves HTTP requests from the given address.
|
||||
|
||||
```go title="Signature"
|
||||
func (app *App) Listen(addr string) error
|
||||
```
|
||||
|
||||
```go title="Examples"
|
||||
// Listen on port :8080
|
||||
app.Listen(":8080")
|
||||
|
||||
// Custom host
|
||||
app.Listen("127.0.0.1:8080")
|
||||
```
|
||||
|
||||
## ListenTLS
|
||||
|
||||
ListenTLS serves HTTPs requests from the given address using certFile and keyFile paths to as TLS certificate and key file.
|
||||
|
||||
```go title="Signature"
|
||||
func (app *App) ListenTLS(addr, certFile, keyFile string) error
|
||||
```
|
||||
|
||||
```go title="Examples"
|
||||
app.ListenTLS(":443", "./cert.pem", "./cert.key");
|
||||
```
|
||||
|
||||
Using `ListenTLS` defaults to the following config \( use `Listener` to provide your own config \)
|
||||
|
||||
```go title="Default \*tls.Config"
|
||||
&tls.Config{
|
||||
MinVersion: tls.VersionTLS12,
|
||||
Certificates: []tls.Certificate{
|
||||
cert,
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
## ListenTLSWithCertificate
|
||||
|
||||
```go title="Signature"
|
||||
func (app *App) ListenTLS(addr string, cert tls.Certificate) error
|
||||
```
|
||||
|
||||
```go title="Examples"
|
||||
app.ListenTLSWithCertificate(":443", cert);
|
||||
```
|
||||
|
||||
Using `ListenTLSWithCertificate` defaults to the following config \( use `Listener` to provide your own config \)
|
||||
|
||||
```go title="Default \*tls.Config"
|
||||
&tls.Config{
|
||||
MinVersion: tls.VersionTLS12,
|
||||
Certificates: []tls.Certificate{
|
||||
cert,
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
## ListenMutualTLS
|
||||
|
||||
ListenMutualTLS serves HTTPs requests from the given address using certFile, keyFile and clientCertFile are the paths to TLS certificate and key file
|
||||
|
||||
```go title="Signature"
|
||||
func (app *App) ListenMutualTLS(addr, certFile, keyFile, clientCertFile string) error
|
||||
```
|
||||
|
||||
```go title="Examples"
|
||||
app.ListenMutualTLS(":443", "./cert.pem", "./cert.key", "./ca-chain-cert.pem");
|
||||
```
|
||||
|
||||
Using `ListenMutualTLS` defaults to the following config \( use `Listener` to provide your own config \)
|
||||
|
||||
```go title="Default \*tls.Config"
|
||||
&tls.Config{
|
||||
MinVersion: tls.VersionTLS12,
|
||||
ClientAuth: tls.RequireAndVerifyClientCert,
|
||||
ClientCAs: clientCertPool,
|
||||
Certificates: []tls.Certificate{
|
||||
cert,
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
## ListenMutualTLSWithCertificate
|
||||
|
||||
ListenMutualTLSWithCertificate serves HTTPs requests from the given address using certFile, keyFile and clientCertFile are the paths to TLS certificate and key file
|
||||
|
||||
```go title="Signature"
|
||||
func (app *App) ListenMutualTLSWithCertificate(addr string, cert tls.Certificate, clientCertPool *x509.CertPool) error
|
||||
```
|
||||
|
||||
```go title="Examples"
|
||||
app.ListenMutualTLSWithCertificate(":443", cert, clientCertPool);
|
||||
```
|
||||
|
||||
Using `ListenMutualTLSWithCertificate` defaults to the following config \( use `Listener` to provide your own config \)
|
||||
|
||||
```go title="Default \*tls.Config"
|
||||
&tls.Config{
|
||||
MinVersion: tls.VersionTLS12,
|
||||
ClientAuth: tls.RequireAndVerifyClientCert,
|
||||
ClientCAs: clientCertPool,
|
||||
Certificates: []tls.Certificate{
|
||||
cert,
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
## Listener
|
||||
|
||||
You can pass your own [`net.Listener`](https://pkg.go.dev/net/#Listener) using the `Listener` method. This method can be used to enable **TLS/HTTPS** with a custom tls.Config.
|
||||
|
||||
```go title="Signature"
|
||||
func (app *App) Listener(ln net.Listener) error
|
||||
```
|
||||
|
||||
```go title="Examples"
|
||||
ln, _ := net.Listen("tcp", ":3000")
|
||||
|
||||
cer, _:= tls.LoadX509KeyPair("server.crt", "server.key")
|
||||
|
||||
ln = tls.NewListener(ln, &tls.Config{Certificates: []tls.Certificate{cer}})
|
||||
|
||||
app.Listener(ln)
|
||||
```
|
||||
|
||||
## Test
|
||||
|
||||
Testing your application is done with the **Test** method. Use this method for creating `_test.go` files or when you need to debug your routing logic. The default timeout is `1s` if you want to disable a timeout altogether, pass `-1` as a second argument.
|
||||
|
||||
```go title="Signature"
|
||||
func (app *App) Test(req *http.Request, msTimeout ...int) (*http.Response, error)
|
||||
```
|
||||
|
||||
```go title="Examples"
|
||||
// Create route with GET method for test:
|
||||
app.Get("/", func(c *fiber.Ctx) error {
|
||||
fmt.Println(c.BaseURL()) // => http://google.com
|
||||
fmt.Println(c.Get("X-Custom-Header")) // => hi
|
||||
|
||||
return c.SendString("hello, World!")
|
||||
})
|
||||
|
||||
// http.Request
|
||||
req := httptest.NewRequest("GET", "http://google.com", nil)
|
||||
req.Header.Set("X-Custom-Header", "hi")
|
||||
|
||||
// http.Response
|
||||
resp, _ := app.Test(req)
|
||||
|
||||
// Do something with results:
|
||||
if resp.StatusCode == fiber.StatusOK {
|
||||
body, _ := ioutil.ReadAll(resp.Body)
|
||||
fmt.Println(string(body)) // => Hello, World!
|
||||
}
|
||||
```
|
||||
|
||||
## Hooks
|
||||
|
||||
Hooks is a method to return [hooks](../guide/hooks.md) property.
|
||||
|
||||
```go title="Signature"
|
||||
func (app *App) Hooks() *Hooks
|
||||
```
|
607
docs/api/client.md
Normal file
607
docs/api/client.md
Normal file
@ -0,0 +1,607 @@
|
||||
---
|
||||
id: client
|
||||
title: 🌎 Client
|
||||
description: The Client struct represents the Fiber HTTP Client.
|
||||
sidebar_position: 5
|
||||
---
|
||||
|
||||
## Start request
|
||||
|
||||
Start a http request with http method and url.
|
||||
|
||||
```go title="Signatures"
|
||||
// Client http methods
|
||||
func (c *Client) Get(url string) *Agent
|
||||
func (c *Client) Head(url string) *Agent
|
||||
func (c *Client) Post(url string) *Agent
|
||||
func (c *Client) Put(url string) *Agent
|
||||
func (c *Client) Patch(url string) *Agent
|
||||
func (c *Client) Delete(url string) *Agent
|
||||
```
|
||||
|
||||
Here we present a brief example demonstrating the simulation of a proxy using our `*fiber.Agent` methods.
|
||||
```go
|
||||
// Get something
|
||||
func getSomething(c *fiber.Ctx) (err error) {
|
||||
agent := fiber.Get("<URL>")
|
||||
statusCode, body, errs := agent.Bytes()
|
||||
if len(errs) > 0 {
|
||||
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
|
||||
"errs": errs,
|
||||
})
|
||||
}
|
||||
|
||||
var something fiber.Map
|
||||
err = json.Unmarshal(body, &something)
|
||||
if err != nil {
|
||||
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
|
||||
"err": err,
|
||||
})
|
||||
}
|
||||
|
||||
return c.Status(statusCode).JSON(something)
|
||||
}
|
||||
|
||||
// Post something
|
||||
func createSomething(c *fiber.Ctx) (err error) {
|
||||
agent := fiber.Post("<URL>")
|
||||
agent.Body(c.Body()) // set body received by request
|
||||
statusCode, body, errs := agent.Bytes()
|
||||
if len(errs) > 0 {
|
||||
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
|
||||
"errs": errs,
|
||||
})
|
||||
}
|
||||
|
||||
// pass status code and body received by the proxy
|
||||
return c.Status(statusCode).Send(body)
|
||||
}
|
||||
```
|
||||
Based on this short example, we can perceive that using the `*fiber.Client` is very straightforward and intuitive.
|
||||
|
||||
|
||||
## ✨ Agent
|
||||
`Agent` is built on top of FastHTTP's [`HostClient`](https://github.com/valyala/fasthttp/blob/master/client.go#L603) which has lots of convenient helper methods such as dedicated methods for request methods.
|
||||
|
||||
### Parse
|
||||
|
||||
Parse initializes a HostClient.
|
||||
|
||||
```go title="Parse"
|
||||
a := AcquireAgent()
|
||||
req := a.Request()
|
||||
req.Header.SetMethod(MethodGet)
|
||||
req.SetRequestURI("http://example.com")
|
||||
|
||||
if err := a.Parse(); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
code, body, errs := a.Bytes() // ...
|
||||
```
|
||||
|
||||
### Set
|
||||
|
||||
Set sets the given `key: value` header.
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) Set(k, v string) *Agent
|
||||
func (a *Agent) SetBytesK(k []byte, v string) *Agent
|
||||
func (a *Agent) SetBytesV(k string, v []byte) *Agent
|
||||
func (a *Agent) SetBytesKV(k []byte, v []byte) *Agent
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
agent.Set("k1", "v1").
|
||||
SetBytesK([]byte("k1"), "v1").
|
||||
SetBytesV("k1", []byte("v1")).
|
||||
SetBytesKV([]byte("k2"), []byte("v2"))
|
||||
// ...
|
||||
```
|
||||
|
||||
### Add
|
||||
|
||||
Add adds the given `key: value` header. Multiple headers with the same key may be added with this function.
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) Add(k, v string) *Agent
|
||||
func (a *Agent) AddBytesK(k []byte, v string) *Agent
|
||||
func (a *Agent) AddBytesV(k string, v []byte) *Agent
|
||||
func (a *Agent) AddBytesKV(k []byte, v []byte) *Agent
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
agent.Add("k1", "v1").
|
||||
AddBytesK([]byte("k1"), "v1").
|
||||
AddBytesV("k1", []byte("v1")).
|
||||
AddBytesKV([]byte("k2"), []byte("v2"))
|
||||
// Headers:
|
||||
// K1: v1
|
||||
// K1: v1
|
||||
// K1: v1
|
||||
// K2: v2
|
||||
```
|
||||
|
||||
### ConnectionClose
|
||||
|
||||
ConnectionClose adds the `Connection: close` header.
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) ConnectionClose() *Agent
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
agent.ConnectionClose()
|
||||
// ...
|
||||
```
|
||||
|
||||
### UserAgent
|
||||
|
||||
UserAgent sets `User-Agent` header value.
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) UserAgent(userAgent string) *Agent
|
||||
func (a *Agent) UserAgentBytes(userAgent []byte) *Agent
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
agent.UserAgent("fiber")
|
||||
// ...
|
||||
```
|
||||
|
||||
### Cookie
|
||||
|
||||
Cookie sets a cookie in `key: value` form. `Cookies` can be used to set multiple cookies.
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) Cookie(key, value string) *Agent
|
||||
func (a *Agent) CookieBytesK(key []byte, value string) *Agent
|
||||
func (a *Agent) CookieBytesKV(key, value []byte) *Agent
|
||||
func (a *Agent) Cookies(kv ...string) *Agent
|
||||
func (a *Agent) CookiesBytesKV(kv ...[]byte) *Agent
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
agent.Cookie("k", "v")
|
||||
agent.Cookies("k1", "v1", "k2", "v2")
|
||||
// ...
|
||||
```
|
||||
|
||||
### Referer
|
||||
|
||||
Referer sets the Referer header value.
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) Referer(referer string) *Agent
|
||||
func (a *Agent) RefererBytes(referer []byte) *Agent
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
agent.Referer("https://docs.gofiber.io")
|
||||
// ...
|
||||
```
|
||||
|
||||
### ContentType
|
||||
|
||||
ContentType sets Content-Type header value.
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) ContentType(contentType string) *Agent
|
||||
func (a *Agent) ContentTypeBytes(contentType []byte) *Agent
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
agent.ContentType("custom-type")
|
||||
// ...
|
||||
```
|
||||
|
||||
### Host
|
||||
|
||||
Host sets the Host header.
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) Host(host string) *Agent
|
||||
func (a *Agent) HostBytes(host []byte) *Agent
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
agent.Host("example.com")
|
||||
// ...
|
||||
```
|
||||
|
||||
### QueryString
|
||||
|
||||
QueryString sets the URI query string.
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) QueryString(queryString string) *Agent
|
||||
func (a *Agent) QueryStringBytes(queryString []byte) *Agent
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
agent.QueryString("foo=bar")
|
||||
// ...
|
||||
```
|
||||
|
||||
### BasicAuth
|
||||
|
||||
BasicAuth sets the URI username and password using HTTP Basic Auth.
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) BasicAuth(username, password string) *Agent
|
||||
func (a *Agent) BasicAuthBytes(username, password []byte) *Agent
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
agent.BasicAuth("foo", "bar")
|
||||
// ...
|
||||
```
|
||||
|
||||
### Body
|
||||
|
||||
There are several ways to set request body.
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) BodyString(bodyString string) *Agent
|
||||
func (a *Agent) Body(body []byte) *Agent
|
||||
|
||||
// BodyStream sets request body stream and, optionally body size.
|
||||
//
|
||||
// If bodySize is >= 0, then the bodyStream must provide exactly bodySize bytes
|
||||
// before returning io.EOF.
|
||||
//
|
||||
// If bodySize < 0, then bodyStream is read until io.EOF.
|
||||
//
|
||||
// bodyStream.Close() is called after finishing reading all body data
|
||||
// if it implements io.Closer.
|
||||
//
|
||||
// Note that GET and HEAD requests cannot have body.
|
||||
func (a *Agent) BodyStream(bodyStream io.Reader, bodySize int) *Agent
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
agent.BodyString("foo=bar")
|
||||
agent.Body([]byte("bar=baz"))
|
||||
agent.BodyStream(strings.NewReader("body=stream"), -1)
|
||||
// ...
|
||||
```
|
||||
|
||||
### JSON
|
||||
|
||||
JSON sends a JSON request by setting the Content-Type header to `application/json`.
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) JSON(v interface{}) *Agent
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
agent.JSON(fiber.Map{"success": true})
|
||||
// ...
|
||||
```
|
||||
|
||||
### XML
|
||||
|
||||
XML sends an XML request by setting the Content-Type header to `application/xml`.
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) XML(v interface{}) *Agent
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
agent.XML(fiber.Map{"success": true})
|
||||
// ...
|
||||
```
|
||||
|
||||
### Form
|
||||
|
||||
Form sends a form request by setting the Content-Type header to `application/x-www-form-urlencoded`.
|
||||
|
||||
```go title="Signature"
|
||||
// Form sends form request with body if args is non-nil.
|
||||
//
|
||||
// It is recommended obtaining args via AcquireArgs and release it
|
||||
// manually in performance-critical code.
|
||||
func (a *Agent) Form(args *Args) *Agent
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
args := AcquireArgs()
|
||||
args.Set("foo", "bar")
|
||||
|
||||
agent.Form(args)
|
||||
// ...
|
||||
ReleaseArgs(args)
|
||||
```
|
||||
|
||||
### MultipartForm
|
||||
|
||||
MultipartForm sends multipart form request by setting the Content-Type header to `multipart/form-data`. These requests can include key-value's and files.
|
||||
|
||||
```go title="Signature"
|
||||
// MultipartForm sends multipart form request with k-v and files.
|
||||
//
|
||||
// It is recommended to obtain args via AcquireArgs and release it
|
||||
// manually in performance-critical code.
|
||||
func (a *Agent) MultipartForm(args *Args) *Agent
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
args := AcquireArgs()
|
||||
args.Set("foo", "bar")
|
||||
|
||||
agent.MultipartForm(args)
|
||||
// ...
|
||||
ReleaseArgs(args)
|
||||
```
|
||||
|
||||
Fiber provides several methods for sending files. Note that they must be called before `MultipartForm`.
|
||||
|
||||
#### Boundary
|
||||
|
||||
Boundary sets boundary for multipart form request.
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) Boundary(boundary string) *Agent
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
agent.Boundary("myBoundary")
|
||||
.MultipartForm(nil)
|
||||
// ...
|
||||
```
|
||||
|
||||
#### SendFile\(s\)
|
||||
|
||||
SendFile read a file and appends it to a multipart form request. Sendfiles can be used to append multiple files.
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) SendFile(filename string, fieldname ...string) *Agent
|
||||
func (a *Agent) SendFiles(filenamesAndFieldnames ...string) *Agent
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
agent.SendFile("f", "field name")
|
||||
.SendFiles("f1", "field name1", "f2").
|
||||
.MultipartForm(nil)
|
||||
// ...
|
||||
```
|
||||
|
||||
#### FileData
|
||||
|
||||
FileData appends file data for multipart form request.
|
||||
|
||||
```go
|
||||
// FormFile represents multipart form file
|
||||
type FormFile struct {
|
||||
// Fieldname is form file's field name
|
||||
Fieldname string
|
||||
// Name is form file's name
|
||||
Name string
|
||||
// Content is form file's content
|
||||
Content []byte
|
||||
}
|
||||
```
|
||||
|
||||
```go title="Signature"
|
||||
// FileData appends files for multipart form request.
|
||||
//
|
||||
// It is recommended obtaining formFile via AcquireFormFile and release it
|
||||
// manually in performance-critical code.
|
||||
func (a *Agent) FileData(formFiles ...*FormFile) *Agent
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
ff1 := &FormFile{"filename1", "field name1", []byte("content")}
|
||||
ff2 := &FormFile{"filename2", "field name2", []byte("content")}
|
||||
agent.FileData(ff1, ff2).
|
||||
MultipartForm(nil)
|
||||
// ...
|
||||
```
|
||||
|
||||
### Debug
|
||||
|
||||
Debug mode enables logging request and response detail to `io.writer`\(default is `os.Stdout`\).
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) Debug(w ...io.Writer) *Agent
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
agent.Debug()
|
||||
// ...
|
||||
```
|
||||
|
||||
### Timeout
|
||||
|
||||
Timeout sets request timeout duration.
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) Timeout(timeout time.Duration) *Agent
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
agent.Timeout(time.Second)
|
||||
// ...
|
||||
```
|
||||
|
||||
### Reuse
|
||||
|
||||
Reuse enables the Agent instance to be used again after one request. If agent is reusable, then it should be released manually when it is no longer used.
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) Reuse() *Agent
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
agent.Reuse()
|
||||
// ...
|
||||
```
|
||||
|
||||
### InsecureSkipVerify
|
||||
|
||||
InsecureSkipVerify controls whether the Agent verifies the server certificate chain and host name.
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) InsecureSkipVerify() *Agent
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
agent.InsecureSkipVerify()
|
||||
// ...
|
||||
```
|
||||
|
||||
### TLSConfig
|
||||
|
||||
TLSConfig sets tls config.
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) TLSConfig(config *tls.Config) *Agent
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
// Create tls certificate
|
||||
cer, _ := tls.LoadX509KeyPair("pem", "key")
|
||||
|
||||
config := &tls.Config{
|
||||
Certificates: []tls.Certificate{cer},
|
||||
}
|
||||
|
||||
agent.TLSConfig(config)
|
||||
// ...
|
||||
```
|
||||
|
||||
### MaxRedirectsCount
|
||||
|
||||
MaxRedirectsCount sets max redirect count for GET and HEAD.
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) MaxRedirectsCount(count int) *Agent
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
agent.MaxRedirectsCount(7)
|
||||
// ...
|
||||
```
|
||||
|
||||
### JSONEncoder
|
||||
|
||||
JSONEncoder sets custom json encoder.
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) JSONEncoder(jsonEncoder utils.JSONMarshal) *Agent
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
agent.JSONEncoder(json.Marshal)
|
||||
// ...
|
||||
```
|
||||
|
||||
### JSONDecoder
|
||||
|
||||
JSONDecoder sets custom json decoder.
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) JSONDecoder(jsonDecoder utils.JSONUnmarshal) *Agent
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
agent.JSONDecoder(json.Unmarshal)
|
||||
// ...
|
||||
```
|
||||
|
||||
### Request
|
||||
|
||||
Request returns Agent request instance.
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) Request() *Request
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
req := agent.Request()
|
||||
// ...
|
||||
```
|
||||
|
||||
### SetResponse
|
||||
|
||||
SetResponse sets custom response for the Agent instance. It is recommended obtaining custom response via AcquireResponse and release it manually in performance-critical code.
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) SetResponse(customResp *Response) *Agent
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
resp := AcquireResponse()
|
||||
agent.SetResponse(resp)
|
||||
// ...
|
||||
ReleaseResponse(resp)
|
||||
```
|
||||
|
||||
### Dest
|
||||
|
||||
Dest sets custom dest. The contents of dest will be replaced by the response body, if the dest is too small a new slice will be allocated.
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) Dest(dest []byte) *Agent {
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
agent.Dest(nil)
|
||||
// ...
|
||||
```
|
||||
|
||||
### Bytes
|
||||
|
||||
Bytes returns the status code, bytes body and errors of url.
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) Bytes() (code int, body []byte, errs []error)
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
code, body, errs := agent.Bytes()
|
||||
// ...
|
||||
```
|
||||
|
||||
### String
|
||||
|
||||
String returns the status code, string body and errors of url.
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) String() (int, string, []error)
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
code, body, errs := agent.String()
|
||||
// ...
|
||||
```
|
||||
|
||||
### Struct
|
||||
|
||||
Struct returns the status code, bytes body and errors of url. And bytes body will be unmarshalled to given v.
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) Struct(v interface{}) (code int, body []byte, errs []error)
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
var d data
|
||||
code, body, errs := agent.Struct(&d)
|
||||
// ...
|
||||
```
|
||||
|
||||
### RetryIf
|
||||
|
||||
RetryIf controls whether a retry should be attempted after an error.
|
||||
By default, will use isIdempotent function from fasthttp
|
||||
|
||||
```go title="Signature"
|
||||
func (a *Agent) RetryIf(retryIf RetryIfFunc) *Agent
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
agent.Get("https://example.com").RetryIf(func (req *fiber.Request) bool {
|
||||
return req.URI() == "https://example.com"
|
||||
})
|
||||
// ...
|
||||
```
|
291
docs/api/constants.md
Normal file
291
docs/api/constants.md
Normal file
@ -0,0 +1,291 @@
|
||||
---
|
||||
id: constants
|
||||
title: 📋 Constants
|
||||
description: Some constants for Fiber.
|
||||
sidebar_position: 4
|
||||
---
|
||||
|
||||
HTTP methods were copied from net/http.
|
||||
|
||||
```go
|
||||
const (
|
||||
MethodGet = "GET" // RFC 7231, 4.3.1
|
||||
MethodHead = "HEAD" // RFC 7231, 4.3.2
|
||||
MethodPost = "POST" // RFC 7231, 4.3.3
|
||||
MethodPut = "PUT" // RFC 7231, 4.3.4
|
||||
MethodPatch = "PATCH" // RFC 5789
|
||||
MethodDelete = "DELETE" // RFC 7231, 4.3.5
|
||||
MethodConnect = "CONNECT" // RFC 7231, 4.3.6
|
||||
MethodOptions = "OPTIONS" // RFC 7231, 4.3.7
|
||||
MethodTrace = "TRACE" // RFC 7231, 4.3.8
|
||||
methodUse = "USE"
|
||||
)
|
||||
```
|
||||
|
||||
MIME types that are commonly used
|
||||
|
||||
```go
|
||||
const (
|
||||
MIMETextXML = "text/xml"
|
||||
MIMETextHTML = "text/html"
|
||||
MIMETextPlain = "text/plain"
|
||||
MIMEApplicationXML = "application/xml"
|
||||
MIMEApplicationJSON = "application/json"
|
||||
MIMEApplicationJavaScript = "application/javascript"
|
||||
MIMEApplicationForm = "application/x-www-form-urlencoded"
|
||||
MIMEOctetStream = "application/octet-stream"
|
||||
MIMEMultipartForm = "multipart/form-data"
|
||||
|
||||
MIMETextXMLCharsetUTF8 = "text/xml; charset=utf-8"
|
||||
MIMETextHTMLCharsetUTF8 = "text/html; charset=utf-8"
|
||||
MIMETextPlainCharsetUTF8 = "text/plain; charset=utf-8"
|
||||
MIMEApplicationXMLCharsetUTF8 = "application/xml; charset=utf-8"
|
||||
MIMEApplicationJSONCharsetUTF8 = "application/json; charset=utf-8"
|
||||
MIMEApplicationJavaScriptCharsetUTF8 = "application/javascript; charset=utf-8"
|
||||
)
|
||||
```
|
||||
|
||||
HTTP status codes were copied from net/http.
|
||||
|
||||
```go
|
||||
const (
|
||||
StatusContinue = 100 // RFC 7231, 6.2.1
|
||||
StatusSwitchingProtocols = 101 // RFC 7231, 6.2.2
|
||||
StatusProcessing = 102 // RFC 2518, 10.1
|
||||
StatusEarlyHints = 103 // RFC 8297
|
||||
StatusOK = 200 // RFC 7231, 6.3.1
|
||||
StatusCreated = 201 // RFC 7231, 6.3.2
|
||||
StatusAccepted = 202 // RFC 7231, 6.3.3
|
||||
StatusNonAuthoritativeInformation = 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
|
||||
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
|
||||
StatusMisdirectedRequest = 421 // RFC 7540, 9.1.2
|
||||
StatusUnprocessableEntity = 422 // RFC 4918, 11.2
|
||||
StatusLocked = 423 // RFC 4918, 11.3
|
||||
StatusFailedDependency = 424 // RFC 4918, 11.4
|
||||
StatusTooEarly = 425 // RFC 8470, 5.2.
|
||||
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
|
||||
)
|
||||
```
|
||||
|
||||
Errors
|
||||
|
||||
```go
|
||||
var (
|
||||
ErrBadRequest = NewError(StatusBadRequest) // RFC 7231, 6.5.1
|
||||
ErrUnauthorized = NewError(StatusUnauthorized) // RFC 7235, 3.1
|
||||
ErrPaymentRequired = NewError(StatusPaymentRequired) // RFC 7231, 6.5.2
|
||||
ErrForbidden = NewError(StatusForbidden) // RFC 7231, 6.5.3
|
||||
ErrNotFound = NewError(StatusNotFound) // RFC 7231, 6.5.4
|
||||
ErrMethodNotAllowed = NewError(StatusMethodNotAllowed) // RFC 7231, 6.5.5
|
||||
ErrNotAcceptable = NewError(StatusNotAcceptable) // RFC 7231, 6.5.6
|
||||
ErrProxyAuthRequired = NewError(StatusProxyAuthRequired) // RFC 7235, 3.2
|
||||
ErrRequestTimeout = NewError(StatusRequestTimeout) // RFC 7231, 6.5.7
|
||||
ErrConflict = NewError(StatusConflict) // RFC 7231, 6.5.8
|
||||
ErrGone = NewError(StatusGone) // RFC 7231, 6.5.9
|
||||
ErrLengthRequired = NewError(StatusLengthRequired) // RFC 7231, 6.5.10
|
||||
ErrPreconditionFailed = NewError(StatusPreconditionFailed) // RFC 7232, 4.2
|
||||
ErrRequestEntityTooLarge = NewError(StatusRequestEntityTooLarge) // RFC 7231, 6.5.11
|
||||
ErrRequestURITooLong = NewError(StatusRequestURITooLong) // RFC 7231, 6.5.12
|
||||
ErrUnsupportedMediaType = NewError(StatusUnsupportedMediaType) // RFC 7231, 6.5.13
|
||||
ErrRequestedRangeNotSatisfiable = NewError(StatusRequestedRangeNotSatisfiable) // RFC 7233, 4.4
|
||||
ErrExpectationFailed = NewError(StatusExpectationFailed) // RFC 7231, 6.5.14
|
||||
ErrTeapot = NewError(StatusTeapot) // RFC 7168, 2.3.3
|
||||
ErrMisdirectedRequest = NewError(StatusMisdirectedRequest) // RFC 7540, 9.1.2
|
||||
ErrUnprocessableEntity = NewError(StatusUnprocessableEntity) // RFC 4918, 11.2
|
||||
ErrLocked = NewError(StatusLocked) // RFC 4918, 11.3
|
||||
ErrFailedDependency = NewError(StatusFailedDependency) // RFC 4918, 11.4
|
||||
ErrTooEarly = NewError(StatusTooEarly) // RFC 8470, 5.2.
|
||||
ErrUpgradeRequired = NewError(StatusUpgradeRequired) // RFC 7231, 6.5.15
|
||||
ErrPreconditionRequired = NewError(StatusPreconditionRequired) // RFC 6585, 3
|
||||
ErrTooManyRequests = NewError(StatusTooManyRequests) // RFC 6585, 4
|
||||
ErrRequestHeaderFieldsTooLarge = NewError(StatusRequestHeaderFieldsTooLarge) // RFC 6585, 5
|
||||
ErrUnavailableForLegalReasons = NewError(StatusUnavailableForLegalReasons) // RFC 7725, 3
|
||||
ErrInternalServerError = NewError(StatusInternalServerError) // RFC 7231, 6.6.1
|
||||
ErrNotImplemented = NewError(StatusNotImplemented) // RFC 7231, 6.6.2
|
||||
ErrBadGateway = NewError(StatusBadGateway) // RFC 7231, 6.6.3
|
||||
ErrServiceUnavailable = NewError(StatusServiceUnavailable) // RFC 7231, 6.6.4
|
||||
ErrGatewayTimeout = NewError(StatusGatewayTimeout) // RFC 7231, 6.6.5
|
||||
ErrHTTPVersionNotSupported = NewError(StatusHTTPVersionNotSupported) // RFC 7231, 6.6.6
|
||||
ErrVariantAlsoNegotiates = NewError(StatusVariantAlsoNegotiates) // RFC 2295, 8.1
|
||||
ErrInsufficientStorage = NewError(StatusInsufficientStorage) // RFC 4918, 11.5
|
||||
ErrLoopDetected = NewError(StatusLoopDetected) // RFC 5842, 7.2
|
||||
ErrNotExtended = NewError(StatusNotExtended) // RFC 2774, 7
|
||||
ErrNetworkAuthenticationRequired = NewError(StatusNetworkAuthenticationRequired) // RFC 6585, 6
|
||||
)
|
||||
```
|
||||
|
||||
HTTP Headers were copied from net/http.
|
||||
|
||||
```go
|
||||
const (
|
||||
HeaderAuthorization = "Authorization"
|
||||
HeaderProxyAuthenticate = "Proxy-Authenticate"
|
||||
HeaderProxyAuthorization = "Proxy-Authorization"
|
||||
HeaderWWWAuthenticate = "WWW-Authenticate"
|
||||
HeaderAge = "Age"
|
||||
HeaderCacheControl = "Cache-Control"
|
||||
HeaderClearSiteData = "Clear-Site-Data"
|
||||
HeaderExpires = "Expires"
|
||||
HeaderPragma = "Pragma"
|
||||
HeaderWarning = "Warning"
|
||||
HeaderAcceptCH = "Accept-CH"
|
||||
HeaderAcceptCHLifetime = "Accept-CH-Lifetime"
|
||||
HeaderContentDPR = "Content-DPR"
|
||||
HeaderDPR = "DPR"
|
||||
HeaderEarlyData = "Early-Data"
|
||||
HeaderSaveData = "Save-Data"
|
||||
HeaderViewportWidth = "Viewport-Width"
|
||||
HeaderWidth = "Width"
|
||||
HeaderETag = "ETag"
|
||||
HeaderIfMatch = "If-Match"
|
||||
HeaderIfModifiedSince = "If-Modified-Since"
|
||||
HeaderIfNoneMatch = "If-None-Match"
|
||||
HeaderIfUnmodifiedSince = "If-Unmodified-Since"
|
||||
HeaderLastModified = "Last-Modified"
|
||||
HeaderVary = "Vary"
|
||||
HeaderConnection = "Connection"
|
||||
HeaderKeepAlive = "Keep-Alive"
|
||||
HeaderAccept = "Accept"
|
||||
HeaderAcceptCharset = "Accept-Charset"
|
||||
HeaderAcceptEncoding = "Accept-Encoding"
|
||||
HeaderAcceptLanguage = "Accept-Language"
|
||||
HeaderCookie = "Cookie"
|
||||
HeaderExpect = "Expect"
|
||||
HeaderMaxForwards = "Max-Forwards"
|
||||
HeaderSetCookie = "Set-Cookie"
|
||||
HeaderAccessControlAllowCredentials = "Access-Control-Allow-Credentials"
|
||||
HeaderAccessControlAllowHeaders = "Access-Control-Allow-Headers"
|
||||
HeaderAccessControlAllowMethods = "Access-Control-Allow-Methods"
|
||||
HeaderAccessControlAllowOrigin = "Access-Control-Allow-Origin"
|
||||
HeaderAccessControlExposeHeaders = "Access-Control-Expose-Headers"
|
||||
HeaderAccessControlMaxAge = "Access-Control-Max-Age"
|
||||
HeaderAccessControlRequestHeaders = "Access-Control-Request-Headers"
|
||||
HeaderAccessControlRequestMethod = "Access-Control-Request-Method"
|
||||
HeaderOrigin = "Origin"
|
||||
HeaderTimingAllowOrigin = "Timing-Allow-Origin"
|
||||
HeaderXPermittedCrossDomainPolicies = "X-Permitted-Cross-Domain-Policies"
|
||||
HeaderDNT = "DNT"
|
||||
HeaderTk = "Tk"
|
||||
HeaderContentDisposition = "Content-Disposition"
|
||||
HeaderContentEncoding = "Content-Encoding"
|
||||
HeaderContentLanguage = "Content-Language"
|
||||
HeaderContentLength = "Content-Length"
|
||||
HeaderContentLocation = "Content-Location"
|
||||
HeaderContentType = "Content-Type"
|
||||
HeaderForwarded = "Forwarded"
|
||||
HeaderVia = "Via"
|
||||
HeaderXForwardedFor = "X-Forwarded-For"
|
||||
HeaderXForwardedHost = "X-Forwarded-Host"
|
||||
HeaderXForwardedProto = "X-Forwarded-Proto"
|
||||
HeaderXForwardedProtocol = "X-Forwarded-Protocol"
|
||||
HeaderXForwardedSsl = "X-Forwarded-Ssl"
|
||||
HeaderXUrlScheme = "X-Url-Scheme"
|
||||
HeaderLocation = "Location"
|
||||
HeaderFrom = "From"
|
||||
HeaderHost = "Host"
|
||||
HeaderReferer = "Referer"
|
||||
HeaderReferrerPolicy = "Referrer-Policy"
|
||||
HeaderUserAgent = "User-Agent"
|
||||
HeaderAllow = "Allow"
|
||||
HeaderServer = "Server"
|
||||
HeaderAcceptRanges = "Accept-Ranges"
|
||||
HeaderContentRange = "Content-Range"
|
||||
HeaderIfRange = "If-Range"
|
||||
HeaderRange = "Range"
|
||||
HeaderContentSecurityPolicy = "Content-Security-Policy"
|
||||
HeaderContentSecurityPolicyReportOnly = "Content-Security-Policy-Report-Only"
|
||||
HeaderCrossOriginResourcePolicy = "Cross-Origin-Resource-Policy"
|
||||
HeaderExpectCT = "Expect-CT"
|
||||
HeaderFeaturePolicy = "Feature-Policy"
|
||||
HeaderPublicKeyPins = "Public-Key-Pins"
|
||||
HeaderPublicKeyPinsReportOnly = "Public-Key-Pins-Report-Only"
|
||||
HeaderStrictTransportSecurity = "Strict-Transport-Security"
|
||||
HeaderUpgradeInsecureRequests = "Upgrade-Insecure-Requests"
|
||||
HeaderXContentTypeOptions = "X-Content-Type-Options"
|
||||
HeaderXDownloadOptions = "X-Download-Options"
|
||||
HeaderXFrameOptions = "X-Frame-Options"
|
||||
HeaderXPoweredBy = "X-Powered-By"
|
||||
HeaderXXSSProtection = "X-XSS-Protection"
|
||||
HeaderLastEventID = "Last-Event-ID"
|
||||
HeaderNEL = "NEL"
|
||||
HeaderPingFrom = "Ping-From"
|
||||
HeaderPingTo = "Ping-To"
|
||||
HeaderReportTo = "Report-To"
|
||||
HeaderTE = "TE"
|
||||
HeaderTrailer = "Trailer"
|
||||
HeaderTransferEncoding = "Transfer-Encoding"
|
||||
HeaderSecWebSocketAccept = "Sec-WebSocket-Accept"
|
||||
HeaderSecWebSocketExtensions = "Sec-WebSocket-Extensions"
|
||||
HeaderSecWebSocketKey = "Sec-WebSocket-Key"
|
||||
HeaderSecWebSocketProtocol = "Sec-WebSocket-Protocol"
|
||||
HeaderSecWebSocketVersion = "Sec-WebSocket-Version"
|
||||
HeaderAcceptPatch = "Accept-Patch"
|
||||
HeaderAcceptPushPolicy = "Accept-Push-Policy"
|
||||
HeaderAcceptSignature = "Accept-Signature"
|
||||
HeaderAltSvc = "Alt-Svc"
|
||||
HeaderDate = "Date"
|
||||
HeaderIndex = "Index"
|
||||
HeaderLargeAllocation = "Large-Allocation"
|
||||
HeaderLink = "Link"
|
||||
HeaderPushPolicy = "Push-Policy"
|
||||
HeaderRetryAfter = "Retry-After"
|
||||
HeaderServerTiming = "Server-Timing"
|
||||
HeaderSignature = "Signature"
|
||||
HeaderSignedHeaders = "Signed-Headers"
|
||||
HeaderSourceMap = "SourceMap"
|
||||
HeaderUpgrade = "Upgrade"
|
||||
HeaderXDNSPrefetchControl = "X-DNS-Prefetch-Control"
|
||||
HeaderXPingback = "X-Pingback"
|
||||
HeaderXRequestID = "X-Request-ID"
|
||||
HeaderXRequestedWith = "X-Requested-With"
|
||||
HeaderXRobotsTag = "X-Robots-Tag"
|
||||
HeaderXUACompatible = "X-UA-Compatible"
|
||||
)
|
||||
```
|
2046
docs/api/ctx.md
Normal file
2046
docs/api/ctx.md
Normal file
File diff suppressed because it is too large
Load Diff
119
docs/api/fiber.md
Normal file
119
docs/api/fiber.md
Normal file
@ -0,0 +1,119 @@
|
||||
---
|
||||
id: fiber
|
||||
title: 📦 Fiber
|
||||
description: Fiber represents the fiber package where you start to create an instance.
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
## New
|
||||
|
||||
This method creates a new **App** named instance. You can pass optional [config ](#config)when creating a new instance.
|
||||
|
||||
```go title="Signature"
|
||||
func New(config ...Config) *App
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
// Default config
|
||||
app := fiber.New()
|
||||
|
||||
// ...
|
||||
```
|
||||
|
||||
## Config
|
||||
|
||||
You can pass an optional Config when creating a new Fiber instance.
|
||||
|
||||
```go title="Example"
|
||||
// Custom config
|
||||
app := fiber.New(fiber.Config{
|
||||
Prefork: true,
|
||||
CaseSensitive: true,
|
||||
StrictRouting: true,
|
||||
ServerHeader: "Fiber",
|
||||
AppName: "Test App v1.0.1",
|
||||
})
|
||||
|
||||
// ...
|
||||
```
|
||||
|
||||
**Config fields**
|
||||
|
||||
| Property | Type | Description | Default |
|
||||
| ---------------------------- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------- |
|
||||
| AppName | `string` | This allows to setup app name for the app | `""` |
|
||||
| BodyLimit | `int` | Sets the maximum allowed size for a request body, if the size exceeds the configured limit, it sends `413 - Request Entity Too Large` response. | `4 * 1024 * 1024` |
|
||||
| CaseSensitive | `bool` | When enabled, `/Foo` and `/foo` are different routes. When disabled, `/Foo`and `/foo` are treated the same. | `false` |
|
||||
| ColorScheme | [`Colors`](https://github.com/gofiber/fiber/blob/master/color.go) | You can define custom color scheme. They'll be used for startup message, route list and some middlewares. | [`DefaultColors`](https://github.com/gofiber/fiber/blob/master/color.go) |
|
||||
| CompressedFileSuffix | `string` | Adds a suffix to the original file name and tries saving the resulting compressed file under the new file name. | `".fiber.gz"` |
|
||||
| Concurrency | `int` | Maximum number of concurrent connections. | `256 * 1024` |
|
||||
| DisableDefaultContentType | `bool` | When set to true, causes the default Content-Type header to be excluded from the Response. | `false` |
|
||||
| DisableDefaultDate | `bool` | When set to true causes the default date header to be excluded from the response. | `false` |
|
||||
| DisableHeaderNormalizing | `bool` | By default all header names are normalized: conteNT-tYPE -> Content-Type | `false` |
|
||||
| DisableKeepalive | `bool` | Disable keep-alive connections, the server will close incoming connections after sending the first response to the client | `false` |
|
||||
| DisablePreParseMultipartForm | `bool` | Will not pre parse Multipart Form data if set to true. This option is useful for servers that desire to treat multipart form data as a binary blob, or choose when to parse the data. | `false` |
|
||||
| DisableStartupMessage | `bool` | When set to true, it will not print out debug information | `false` |
|
||||
| ETag | `bool` | Enable or disable ETag header generation, since both weak and strong etags are generated using the same hashing method \(CRC-32\). Weak ETags are the default when enabled. | `false` |
|
||||
| EnableIPValidation | `bool` | If set to true, `c.IP()` and `c.IPs()` will validate IP addresses before returning them. Also, `c.IP()` will return only the first valid IP rather than just the raw header value that may be a comma seperated string.<br /><br />**WARNING:** There is a small performance cost to doing this validation. Keep disabled if speed is your only concern and your application is behind a trusted proxy that already validates this header. | `false` |
|
||||
| EnablePrintRoutes | `bool` | EnablePrintRoutes enables print all routes with their method, path, name and handler.. | `false` |
|
||||
| EnableTrustedProxyCheck | `bool` | When set to true, fiber will check whether proxy is trusted, using TrustedProxies list. <br /><br />By default `c.Protocol()` will get value from X-Forwarded-Proto, X-Forwarded-Protocol, X-Forwarded-Ssl or X-Url-Scheme header, `c.IP()` will get value from `ProxyHeader` header, `c.Hostname()` will get value from X-Forwarded-Host header. <br /> If `EnableTrustedProxyCheck` is true, and `RemoteIP` is in the list of `TrustedProxies` `c.Protocol()`, `c.IP()`, and `c.Hostname()` will have the same behaviour when `EnableTrustedProxyCheck` disabled, if `RemoteIP` isn't in the list, `c.Protocol()` will return https in case when tls connection is handled by the app, or http otherwise, `c.IP()` will return RemoteIP() from fasthttp context, `c.Hostname()` will return `fasthttp.Request.URI().Host()` | `false` |
|
||||
| ErrorHandler | `ErrorHandler` | ErrorHandler is executed when an error is returned from fiber.Handler. Mounted fiber error handlers are retained by the top-level app and applied on prefix associated requests. | `DefaultErrorHandler` |
|
||||
| GETOnly | `bool` | Rejects all non-GET requests if set to true. This option is useful as anti-DoS protection for servers accepting only GET requests. The request size is limited by ReadBufferSize if GETOnly is set. | `false` |
|
||||
| IdleTimeout | `time.Duration` | The maximum amount of time to wait for the next request when keep-alive is enabled. If IdleTimeout is zero, the value of ReadTimeout is used. | `nil` |
|
||||
| Immutable | `bool` | When enabled, all values returned by context methods are immutable. By default, they are valid until you return from the handler; see issue [\#185](https://github.com/gofiber/fiber/issues/185). | `false` |
|
||||
| JSONDecoder | `utils.JSONUnmarshal` | Allowing for flexibility in using another json library for decoding. | `json.Unmarshal` |
|
||||
| JSONEncoder | `utils.JSONMarshal` | Allowing for flexibility in using another json library for encoding. | `json.Marshal` |
|
||||
| Network | `string` | Known networks are "tcp", "tcp4" (IPv4-only), "tcp6" (IPv6-only)<br /><br />**WARNING:** When prefork is set to true, only "tcp4" and "tcp6" can be chosen. | `NetworkTCP4` |
|
||||
| PassLocalsToViews | `bool` | PassLocalsToViews Enables passing of the locals set on a fiber.Ctx to the template engine. See our **Template Middleware** for supported engines. | `false` |
|
||||
| Prefork | `bool` | Enables use of the[`SO_REUSEPORT`](https://lwn.net/Articles/542629/)socket option. This will spawn multiple Go processes listening on the same port. learn more about [socket sharding](https://www.nginx.com/blog/socket-sharding-nginx-release-1-9-1/). **NOTE: if enabled, the application will need to be ran through a shell because prefork mode sets environment variables. If you're using Docker, make sure the app is ran with `CMD ./app` or `CMD ["sh", "-c", "/app"]`. For more info, see** [**this**](https://github.com/gofiber/fiber/issues/1021#issuecomment-730537971) **issue comment.** | `false` |
|
||||
| ProxyHeader | `string` | This will enable `c.IP()` to return the value of the given header key. By default `c.IP()`will return the Remote IP from the TCP connection, this property can be useful if you are behind a load balancer e.g. _X-Forwarded-\*_. | `""` |
|
||||
| ReadBufferSize | `int` | per-connection buffer size for requests' reading. This also limits the maximum header size. Increase this buffer if your clients send multi-KB RequestURIs and/or multi-KB headers \(for example, BIG cookies\). | `4096` |
|
||||
| ReadTimeout | `time.Duration` | The amount of time allowed to read the full request, including the body. The default timeout is unlimited. | `nil` |
|
||||
| RequestMethods | `[]string` | RequestMethods provides customizibility for HTTP methods. You can add/remove methods as you wish. | `DefaultMethods` |
|
||||
| ServerHeader | `string` | Enables the `Server` HTTP header with the given value. | `""` |
|
||||
| StreamRequestBody | `bool` | StreamRequestBody enables request body streaming, and calls the handler sooner when given body is larger then the current limit. | `false` |
|
||||
| StrictRouting | `bool` | When enabled, the router treats `/foo` and `/foo/` as different. Otherwise, the router treats `/foo` and `/foo/` as the same. | `false` |
|
||||
| TrustedProxies | `[]string` | Contains the list of trusted proxy IP's. Look at `EnableTrustedProxyCheck` doc. <br /> <br /> It can take IP or IP range addresses. If it gets IP range, it iterates all possible addresses. | `[]string*__*` |
|
||||
| UnescapePath | `bool` | Converts all encoded characters in the route back before setting the path for the context, so that the routing can also work with URL encoded special characters | `false` |
|
||||
| Views | `Views` | Views is the interface that wraps the Render function. See our **Template Middleware** for supported engines. | `nil` |
|
||||
| ViewsLayout | `string` | Views Layout is the global layout for all template render until override on Render function. See our **Template Middleware** for supported engines. | `""` |
|
||||
| WriteBufferSize | `int` | Per-connection buffer size for responses' writing. | `4096` |
|
||||
| WriteTimeout | `time.Duration` | The maximum duration before timing out writes of the response. The default timeout is unlimited. | `nil` |
|
||||
| XMLEncoder | `utils.XMLMarshal` | Allowing for flexibility in using another XML library for encoding. | `xml.Marshal` |
|
||||
|
||||
## NewError
|
||||
|
||||
NewError creates a new HTTPError instance with an optional message.
|
||||
|
||||
```go title="Signature"
|
||||
func NewError(code int, message ...string) *Error
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
app.Get("/", func(c *fiber.Ctx) error {
|
||||
return fiber.NewError(782, "Custom error message")
|
||||
})
|
||||
```
|
||||
|
||||
## IsChild
|
||||
|
||||
IsChild determines if the current process is a result of Prefork.
|
||||
|
||||
```go title="Signature"
|
||||
func IsChild() bool
|
||||
```
|
||||
|
||||
```go title="Example"
|
||||
// Prefork will spawn child processes
|
||||
app := fiber.New(fiber.Config{
|
||||
Prefork: true,
|
||||
})
|
||||
|
||||
if !fiber.IsChild() {
|
||||
fmt.Println("I'm the parent process")
|
||||
} else {
|
||||
fmt.Println("I'm a child process")
|
||||
}
|
||||
|
||||
// ...
|
||||
```
|
155
docs/api/log.md
Normal file
155
docs/api/log.md
Normal file
@ -0,0 +1,155 @@
|
||||
---
|
||||
id: log
|
||||
title: 📃 Log
|
||||
description: Fiber's built-in log package
|
||||
sidebar_position: 6
|
||||
---
|
||||
|
||||
We can use logs to observe program behavior, diagnose problems, or configure corresponding alarms.
|
||||
And defining a well structured log can improve search efficiency and facilitate handling of problems.
|
||||
|
||||
Fiber provides a default way to print logs in the standard output.
|
||||
It also provides several global functions, such as `log.Info`, `log.Errorf`, `log.Warnw`, etc.
|
||||
|
||||
## Log levels
|
||||
|
||||
```go
|
||||
const (
|
||||
LevelTrace Level = iota
|
||||
LevelDebug
|
||||
LevelInfo
|
||||
LevelWarn
|
||||
LevelError
|
||||
LevelFatal
|
||||
LevelPanic
|
||||
)
|
||||
```
|
||||
|
||||
## Custom log
|
||||
|
||||
Fiber provides the `AllLogger` interface for adapting the various log libraries.
|
||||
|
||||
```go
|
||||
type CommonLogger interface {
|
||||
Logger
|
||||
FormatLogger
|
||||
WithLogger
|
||||
}
|
||||
|
||||
type AllLogger interface {
|
||||
CommonLogger
|
||||
ControlLogger
|
||||
WithLogger
|
||||
}
|
||||
```
|
||||
|
||||
## Print log
|
||||
Note: The method of calling the Fatal level will interrupt the program running after printing the log, please use it with caution.
|
||||
Directly print logs of different levels, which will be entered into messageKey, the default is msg.
|
||||
|
||||
```go
|
||||
log.Info("Hello, World!")
|
||||
log.Debug("Are you OK?")
|
||||
log.Info("42 is the answer to life, the universe, and everything")
|
||||
log.Warn("We are under attack!")
|
||||
log.Error("Houston, we have a problem.")
|
||||
log.Fatal("So Long, and Thanks for All the Fislog.")
|
||||
log.Panic("The system is down.")
|
||||
```
|
||||
Format and print logs of different levels, all methods end with f
|
||||
|
||||
```go
|
||||
log.Debugf("Hello %s", "boy")
|
||||
log.Infof("%d is the answer to life, the universe, and everything", 233)
|
||||
log.Warnf("We are under attack %s!", "boss")
|
||||
log.Errorf("%s, we have a problem.", "Master Shifu")
|
||||
log.Fatalf("So Long, and Thanks for All the %s.", "banana")
|
||||
```
|
||||
|
||||
Print a message with the key and value, or `KEYVALS UNPAIRED` if the key and value are not a pair.
|
||||
|
||||
```go
|
||||
log.Debugw("", "Hello", "boy")
|
||||
log.Infow("", "number", 233)
|
||||
log.Warnw("", "job", "boss")
|
||||
log.Errorw("", "name", "Master Shifu")
|
||||
log.Fatalw("", "fruit", "banana")
|
||||
```
|
||||
|
||||
## Global log
|
||||
If you are in a project and just want to use a simple log function that can be printed at any time in the global, we provide a global log.
|
||||
|
||||
```go
|
||||
import "github.com/gofiber/fiber/v2/log"
|
||||
|
||||
log.Info("info")
|
||||
log.Warn("warn")
|
||||
```
|
||||
|
||||
The above is using the default `log.DefaultLogger` standard output.
|
||||
You can also find an already implemented adaptation under contrib, or use your own implemented Logger and use `log.SetLogger` to set the global log logger.
|
||||
|
||||
```go
|
||||
import (
|
||||
"log"
|
||||
fiberlog "github.com/gofiber/fiber/v2/log"
|
||||
)
|
||||
|
||||
var _ log.AllLogger = (*customLogger)(nil)
|
||||
|
||||
type customLogger struct {
|
||||
stdlog *log.Logger
|
||||
}
|
||||
|
||||
// ...
|
||||
// inject your custom logger
|
||||
fiberlog.SetLogger(customLogger)
|
||||
```
|
||||
|
||||
## Set Level
|
||||
`log.SetLevel` sets the level of logs below which logs will not be output.
|
||||
The default logger is LevelTrace.
|
||||
|
||||
Note that this method is not **concurrent-safe**.
|
||||
|
||||
```go
|
||||
import "github.com/gofiber/fiber/v2/log"
|
||||
|
||||
log.SetLevel(log.LevelInfo)
|
||||
```
|
||||
## Set output
|
||||
|
||||
`log.SetOutput` sets the output destination of the logger. The default logger types the log in the console.
|
||||
|
||||
```go
|
||||
var logger AllLogger = &defaultLogger{
|
||||
stdlog: log.New(os.Stderr, "", log.LstdFlags|log.Lshortfile|log.Lmicroseconds),
|
||||
depth: 4,
|
||||
}
|
||||
```
|
||||
|
||||
Set the output destination to the file.
|
||||
|
||||
```go
|
||||
// Output to ./test.log file
|
||||
f, err := os.OpenFile("test.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
log.SetOutput(f)
|
||||
```
|
||||
Set the output destination to the console and file.
|
||||
|
||||
```go
|
||||
// Output to ./test.log file
|
||||
file, _ := os.OpenFile("test.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
|
||||
iw := io.MultiWriter(os.Stdout, file)
|
||||
log.SetOutput(iw)
|
||||
```
|
||||
## Bind context
|
||||
Set the context, using the following method will return a `CommonLogger` instance bound to the specified context
|
||||
```go
|
||||
commonLogger := log.WithContext(ctx)
|
||||
commonLogger.Info("info")
|
||||
```
|
||||
|
9
docs/api/middleware/_category_.json
Normal file
9
docs/api/middleware/_category_.json
Normal file
@ -0,0 +1,9 @@
|
||||
{
|
||||
"label": "🧬 Middleware",
|
||||
"position": 7,
|
||||
"collapsed": true,
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
"description": "Middleware is a function chained in the HTTP request cycle with access to the Context which it uses to perform a specific action, for example, logging every request or enabling CORS."
|
||||
}
|
||||
}
|
169
docs/api/middleware/adaptor.md
Normal file
169
docs/api/middleware/adaptor.md
Normal file
@ -0,0 +1,169 @@
|
||||
---
|
||||
id: adaptor
|
||||
---
|
||||
|
||||
# Adaptor
|
||||
|
||||
Converter for net/http handlers to/from Fiber request handlers, special thanks to [@arsmn](https://github.com/arsmn)!
|
||||
|
||||
## Signatures
|
||||
| Name | Signature | Description
|
||||
| :--- | :--- | :---
|
||||
| HTTPHandler | `HTTPHandler(h http.Handler) fiber.Handler` | http.Handler -> fiber.Handler
|
||||
| HTTPHandlerFunc | `HTTPHandlerFunc(h http.HandlerFunc) fiber.Handler` | http.HandlerFunc -> fiber.Handler
|
||||
| HTTPMiddleware | `HTTPHandlerFunc(mw func(http.Handler) http.Handler) fiber.Handler` | func(http.Handler) http.Handler -> fiber.Handler
|
||||
| FiberHandler | `FiberHandler(h fiber.Handler) http.Handler` | fiber.Handler -> http.Handler
|
||||
| FiberHandlerFunc | `FiberHandlerFunc(h fiber.Handler) http.HandlerFunc` | fiber.Handler -> http.HandlerFunc
|
||||
| FiberApp | `FiberApp(app *fiber.App) http.HandlerFunc` | Fiber app -> http.HandlerFunc
|
||||
| ConvertRequest | `ConvertRequest(c *fiber.Ctx, forServer bool) (*http.Request, error)` | fiber.Ctx -> http.Request
|
||||
| CopyContextToFiberContext | `CopyContextToFiberContext(context interface{}, requestContext *fasthttp.RequestCtx)` | context.Context -> fasthttp.RequestCtx
|
||||
|
||||
## Examples
|
||||
|
||||
### net/http to Fiber
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/adaptor"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// New fiber app
|
||||
app := fiber.New()
|
||||
|
||||
// http.Handler -> fiber.Handler
|
||||
app.Get("/", adaptor.HTTPHandler(handler(greet)))
|
||||
|
||||
// http.HandlerFunc -> fiber.Handler
|
||||
app.Get("/func", adaptor.HTTPHandlerFunc(greet))
|
||||
|
||||
// Listen on port 3000
|
||||
app.Listen(":3000")
|
||||
}
|
||||
|
||||
func handler(f http.HandlerFunc) http.Handler {
|
||||
return http.HandlerFunc(f)
|
||||
}
|
||||
|
||||
func greet(w http.ResponseWriter, r *http.Request) {
|
||||
fmt.Fprint(w, "Hello World!")
|
||||
}
|
||||
```
|
||||
|
||||
### net/http middleware to Fiber
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"log"
|
||||
"net/http"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/adaptor"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// New fiber app
|
||||
app := fiber.New()
|
||||
|
||||
// http middleware -> fiber.Handler
|
||||
app.Use(adaptor.HTTPMiddleware(logMiddleware))
|
||||
|
||||
// Listen on port 3000
|
||||
app.Listen(":3000")
|
||||
}
|
||||
|
||||
func logMiddleware(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
log.Println("log middleware")
|
||||
next.ServeHTTP(w, r)
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
### Fiber Handler to net/http
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/adaptor"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// fiber.Handler -> http.Handler
|
||||
http.Handle("/", adaptor.FiberHandler(greet))
|
||||
|
||||
// fiber.Handler -> http.HandlerFunc
|
||||
http.HandleFunc("/func", adaptor.FiberHandlerFunc(greet))
|
||||
|
||||
// Listen on port 3000
|
||||
http.ListenAndServe(":3000", nil)
|
||||
}
|
||||
|
||||
func greet(c *fiber.Ctx) error {
|
||||
return c.SendString("Hello World!")
|
||||
}
|
||||
```
|
||||
|
||||
### Fiber App to net/http
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/adaptor"
|
||||
)
|
||||
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
app.Get("/greet", greet)
|
||||
|
||||
// Listen on port 3000
|
||||
http.ListenAndServe(":3000", adaptor.FiberApp(app))
|
||||
}
|
||||
|
||||
func greet(c *fiber.Ctx) error {
|
||||
return c.SendString("Hello World!")
|
||||
}
|
||||
```
|
||||
|
||||
### Fiber Context to (net/http).Request
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/adaptor"
|
||||
)
|
||||
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
app.Get("/greet", greetWithHTTPReq)
|
||||
|
||||
// Listen on port 3000
|
||||
http.ListenAndServe(":3000", adaptor.FiberApp(app))
|
||||
}
|
||||
|
||||
func greetWithHTTPReq(c *fiber.Ctx) error {
|
||||
httpReq, err := adaptor.ConvertRequest(c, false)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return c.SendString("Request URL: " + httpReq.URL.String())
|
||||
}
|
||||
```
|
85
docs/api/middleware/basicauth.md
Normal file
85
docs/api/middleware/basicauth.md
Normal file
@ -0,0 +1,85 @@
|
||||
---
|
||||
id: basicauth
|
||||
---
|
||||
|
||||
# BasicAuth
|
||||
|
||||
Basic Authentication middleware for [Fiber](https://github.com/gofiber/fiber) that provides an HTTP basic authentication. It calls the next handler for valid credentials and [401 Unauthorized](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401) or a custom response for missing or invalid credentials.
|
||||
|
||||
## Signatures
|
||||
|
||||
```go
|
||||
func New(config Config) fiber.Handler
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
Import the middleware package that is part of the Fiber web framework
|
||||
|
||||
```go
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/basicauth"
|
||||
)
|
||||
```
|
||||
|
||||
After you initiate your Fiber app, you can use the following possibilities:
|
||||
|
||||
```go
|
||||
// Provide a minimal config
|
||||
app.Use(basicauth.New(basicauth.Config{
|
||||
Users: map[string]string{
|
||||
"john": "doe",
|
||||
"admin": "123456",
|
||||
},
|
||||
}))
|
||||
|
||||
// Or extend your config for customization
|
||||
app.Use(basicauth.New(basicauth.Config{
|
||||
Users: map[string]string{
|
||||
"john": "doe",
|
||||
"admin": "123456",
|
||||
},
|
||||
Realm: "Forbidden",
|
||||
Authorizer: func(user, pass string) bool {
|
||||
if user == "john" && pass == "doe" {
|
||||
return true
|
||||
}
|
||||
if user == "admin" && pass == "123456" {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
},
|
||||
Unauthorized: func(c *fiber.Ctx) error {
|
||||
return c.SendFile("./unauthorized.html")
|
||||
},
|
||||
ContextUsername: "_user",
|
||||
ContextPassword: "_pass",
|
||||
}))
|
||||
```
|
||||
|
||||
## Config
|
||||
|
||||
| Property | Type | Description | Default |
|
||||
|:----------------|:----------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------|:----------------------|
|
||||
| Next | `func(*fiber.Ctx) bool` | Next defines a function to skip this middleware when returned true. | `nil` |
|
||||
| Users | `map[string]string` | Users defines the allowed credentials. | `map[string]string{}` |
|
||||
| Realm | `string` | Realm is a string to define the realm attribute of BasicAuth. The realm identifies the system to authenticate against and can be used by clients to save credentials. | `"Restricted"` |
|
||||
| Authorizer | `func(string, string) bool` | Authorizer defines a function to check the credentials. It will be called with a username and password and is expected to return true or false to indicate approval. | `nil` |
|
||||
| Unauthorized | `fiber.Handler` | Unauthorized defines the response body for unauthorized responses. | `nil` |
|
||||
| ContextUsername | `string` | ContextUsername is the key to store the username in Locals. | `"username"` |
|
||||
| ContextPassword | `string` | ContextPassword is the key to store the password in Locals. | `"password"` |
|
||||
|
||||
## Default Config
|
||||
|
||||
```go
|
||||
var ConfigDefault = Config{
|
||||
Next: nil,
|
||||
Users: map[string]string{},
|
||||
Realm: "Restricted",
|
||||
Authorizer: nil,
|
||||
Unauthorized: nil,
|
||||
ContextUsername: "username",
|
||||
ContextPassword: "password",
|
||||
}
|
||||
```
|
99
docs/api/middleware/cache.md
Normal file
99
docs/api/middleware/cache.md
Normal file
@ -0,0 +1,99 @@
|
||||
---
|
||||
id: cache
|
||||
---
|
||||
|
||||
# Cache
|
||||
|
||||
Cache middleware for [Fiber](https://github.com/gofiber/fiber) designed to intercept responses and cache them. This middleware will cache the `Body`, `Content-Type` and `StatusCode` using the `c.Path()` as unique identifier. Special thanks to [@codemicro](https://github.com/codemicro/fiber-cache) for creating this middleware for Fiber core!
|
||||
|
||||
Request Directives<br />
|
||||
`Cache-Control: no-cache` will return the up-to-date response but still caches it. You will always get a `miss` cache status.<br />
|
||||
`Cache-Control: no-store` will refrain from caching. You will always get the up-to-date response.
|
||||
|
||||
## Signatures
|
||||
|
||||
```go
|
||||
func New(config ...Config) fiber.Handler
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
Import the middleware package that is part of the Fiber web framework
|
||||
|
||||
```go
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/cache"
|
||||
)
|
||||
```
|
||||
|
||||
After you initiate your Fiber app, you can use the following possibilities:
|
||||
|
||||
```go
|
||||
// Initialize default config
|
||||
app.Use(cache.New())
|
||||
|
||||
// Or extend your config for customization
|
||||
app.Use(cache.New(cache.Config{
|
||||
Next: func(c *fiber.Ctx) bool {
|
||||
return c.Query("refresh") == "true"
|
||||
},
|
||||
Expiration: 30 * time.Minute,
|
||||
CacheControl: true,
|
||||
}))
|
||||
```
|
||||
|
||||
Or you can custom key and expire time like this:
|
||||
|
||||
```go
|
||||
app.Use(cache.New(cache.Config{
|
||||
ExpirationGenerator: func(c *fiber.Ctx, cfg *cache.Config) time.Duration {
|
||||
newCacheTime, _ := strconv.Atoi(c.GetRespHeader("Cache-Time", "600"))
|
||||
return time.Second * time.Duration(newCacheTime)
|
||||
},
|
||||
KeyGenerator: func(c *fiber.Ctx) string {
|
||||
return utils.CopyString(c.Path())
|
||||
},
|
||||
}))
|
||||
|
||||
app.Get("/", func(c *fiber.Ctx) error {
|
||||
c.Response().Header.Add("Cache-Time", "6000")
|
||||
return c.SendString("hi")
|
||||
})
|
||||
```
|
||||
|
||||
## Config
|
||||
|
||||
| Property | Type | Description | Default |
|
||||
|:---------------------|:------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------|:------------------------------------------------------------------|
|
||||
| Next | `func(*fiber.Ctx) bool` | Next defines a function to skip this middleware when returned true. | `nil` |
|
||||
| Expiration | `time.Duration` | Expiration is the time that a cached response will live. | `1 * time.Minute` |
|
||||
| CacheHeader | `string` | CacheHeader is the header on the response header that indicates the cache status, with the possible return values "hit," "miss," or "unreachable." | `X-Cache` |
|
||||
| CacheControl | `bool` | CacheControl enables client-side caching if set to true. | `false` |
|
||||
| KeyGenerator | `func(*fiber.Ctx) string` | Key allows you to generate custom keys. | `func(c *fiber.Ctx) string { return utils.CopyString(c.Path()) }` |
|
||||
| ExpirationGenerator | `func(*fiber.Ctx, *cache.Config) time.Duration` | ExpirationGenerator allows you to generate custom expiration keys based on the request. | `nil` |
|
||||
| Storage | `fiber.Storage` | Store is used to store the state of the middleware. | In-memory store |
|
||||
| Store (Deprecated) | `fiber.Storage` | Deprecated: Use Storage instead. | In-memory store |
|
||||
| Key (Deprecated) | `func(*fiber.Ctx) string` | Deprecated: Use KeyGenerator instead. | `nil` |
|
||||
| StoreResponseHeaders | `bool` | StoreResponseHeaders allows you to store additional headers generated by next middlewares & handler. | `false` |
|
||||
| MaxBytes | `uint` | MaxBytes is the maximum number of bytes of response bodies simultaneously stored in cache. | `0` (No limit) |
|
||||
| Methods | `[]string` | Methods specifies the HTTP methods to cache. | `[]string{fiber.MethodGet, fiber.MethodHead}` |
|
||||
|
||||
## Default Config
|
||||
|
||||
```go
|
||||
var ConfigDefault = Config{
|
||||
Next: nil,
|
||||
Expiration: 1 * time.Minute,
|
||||
CacheHeader: "X-Cache",
|
||||
CacheControl: false,
|
||||
KeyGenerator: func(c *fiber.Ctx) string {
|
||||
return utils.CopyString(c.Path())
|
||||
},
|
||||
ExpirationGenerator: nil,
|
||||
StoreResponseHeaders: false,
|
||||
Storage: nil,
|
||||
MaxBytes: 0,
|
||||
Methods: []string{fiber.MethodGet, fiber.MethodHead},
|
||||
}
|
||||
```
|
81
docs/api/middleware/compress.md
Normal file
81
docs/api/middleware/compress.md
Normal file
@ -0,0 +1,81 @@
|
||||
---
|
||||
id: compress
|
||||
---
|
||||
|
||||
# Compress
|
||||
|
||||
Compression middleware for [Fiber](https://github.com/gofiber/fiber) that will compress the response using `gzip`, `deflate` and `brotli` compression depending on the [Accept-Encoding](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding) header.
|
||||
|
||||
## Signatures
|
||||
|
||||
```go
|
||||
func New(config ...Config) fiber.Handler
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
Import the middleware package that is part of the Fiber web framework
|
||||
|
||||
```go
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/compress"
|
||||
)
|
||||
```
|
||||
|
||||
After you initiate your Fiber app, you can use the following possibilities:
|
||||
|
||||
```go
|
||||
// Initialize default config
|
||||
app.Use(compress.New())
|
||||
|
||||
// Or extend your config for customization
|
||||
app.Use(compress.New(compress.Config{
|
||||
Level: compress.LevelBestSpeed, // 1
|
||||
}))
|
||||
|
||||
// Skip middleware for specific routes
|
||||
app.Use(compress.New(compress.Config{
|
||||
Next: func(c *fiber.Ctx) bool {
|
||||
return c.Path() == "/dont_compress"
|
||||
},
|
||||
Level: compress.LevelBestSpeed, // 1
|
||||
}))
|
||||
```
|
||||
|
||||
## Config
|
||||
|
||||
### Config
|
||||
|
||||
| Property | Type | Description | Default |
|
||||
|:---------|:------------------------|:--------------------------------------------------------------------|:-------------------|
|
||||
| Next | `func(*fiber.Ctx) bool` | Next defines a function to skip this middleware when returned true. | `nil` |
|
||||
| Level | `Level` | Level determines the compression algorithm. | `LevelDefault (0)` |
|
||||
|
||||
Possible values for the "Level" field are:
|
||||
|
||||
- `LevelDisabled (-1)`: Compression is disabled.
|
||||
- `LevelDefault (0)`: Default compression level.
|
||||
- `LevelBestSpeed (1)`: Best compression speed.
|
||||
- `LevelBestCompression (2)`: Best compression.
|
||||
|
||||
## Default Config
|
||||
|
||||
```go
|
||||
var ConfigDefault = Config{
|
||||
Next: nil,
|
||||
Level: LevelDefault,
|
||||
}
|
||||
```
|
||||
|
||||
## Constants
|
||||
|
||||
```go
|
||||
// Compression levels
|
||||
const (
|
||||
LevelDisabled = -1
|
||||
LevelDefault = 0
|
||||
LevelBestSpeed = 1
|
||||
LevelBestCompression = 2
|
||||
)
|
||||
```
|
88
docs/api/middleware/cors.md
Normal file
88
docs/api/middleware/cors.md
Normal file
@ -0,0 +1,88 @@
|
||||
---
|
||||
id: cors
|
||||
---
|
||||
|
||||
# CORS
|
||||
|
||||
CORS middleware for [Fiber](https://github.com/gofiber/fiber) that can be used to enable [Cross-Origin Resource Sharing](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) with various options.
|
||||
|
||||
## Signatures
|
||||
|
||||
```go
|
||||
func New(config ...Config) fiber.Handler
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
Import the middleware package that is part of the Fiber web framework
|
||||
|
||||
```go
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/cors"
|
||||
)
|
||||
```
|
||||
|
||||
After you initiate your Fiber app, you can use the following possibilities:
|
||||
|
||||
```go
|
||||
// Initialize default config
|
||||
app.Use(cors.New())
|
||||
|
||||
// Or extend your config for customization
|
||||
app.Use(cors.New(cors.Config{
|
||||
AllowOrigins: "https://gofiber.io, https://gofiber.net",
|
||||
AllowHeaders: "Origin, Content-Type, Accept",
|
||||
}))
|
||||
```
|
||||
|
||||
Using the `AllowOriginsFunc` function. In this example any origin will be allowed via CORS.
|
||||
|
||||
For example, if a browser running on `http://localhost:3000` sends a request, this will be accepted and the `access-control-allow-origin` response header will be set to `http://localhost:3000`.
|
||||
|
||||
**Note: Using this feature is discouraged in production and it's best practice to explicitly set CORS origins via `AllowOrigins`.**
|
||||
|
||||
```go
|
||||
app.Use(cors.New())
|
||||
|
||||
app.Use(cors.New(cors.Config{
|
||||
AllowOriginsFunc: func(origin string) bool {
|
||||
return os.Getenv("ENVIRONMENT") == "development"
|
||||
},
|
||||
}))
|
||||
```
|
||||
|
||||
## Config
|
||||
|
||||
| Property | Type | Description | Default |
|
||||
|:-----------------|:---------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------------------------------|
|
||||
| Next | `func(*fiber.Ctx) bool` | Next defines a function to skip this middleware when returned true. | `nil` |
|
||||
| AllowOriginsFunc | `func(origin string) bool` | AllowOriginsFunc defines a function that will set the 'access-control-allow-origin' response header to the 'origin' request header when returned true. | `nil` |
|
||||
| AllowOrigins | `string` | AllowOrigin defines a list of origins that may access the resource. | `"*"` |
|
||||
| AllowMethods | `string` | AllowMethods defines a list methods allowed when accessing the resource. This is used in response to a preflight request. | `"GET,POST,HEAD,PUT,DELETE,PATCH"` |
|
||||
| AllowHeaders | `string` | AllowHeaders defines a list of request headers that can be used when making the actual request. This is in response to a preflight request. | `""` |
|
||||
| AllowCredentials | `bool` | AllowCredentials indicates whether or not the response to the request can be exposed when the credentials flag is true. | `false` |
|
||||
| ExposeHeaders | `string` | ExposeHeaders defines a whitelist headers that clients are allowed to access. | `""` |
|
||||
| MaxAge | `int` | MaxAge indicates how long (in seconds) the results of a preflight request can be cached. | `0` |
|
||||
|
||||
## Default Config
|
||||
|
||||
```go
|
||||
var ConfigDefault = Config{
|
||||
Next: nil,
|
||||
AllowOriginsFunc: nil,
|
||||
AllowOrigins: "*",
|
||||
AllowMethods: strings.Join([]string{
|
||||
fiber.MethodGet,
|
||||
fiber.MethodPost,
|
||||
fiber.MethodHead,
|
||||
fiber.MethodPut,
|
||||
fiber.MethodDelete,
|
||||
fiber.MethodPatch,
|
||||
}, ","),
|
||||
AllowHeaders: "",
|
||||
AllowCredentials: false,
|
||||
ExposeHeaders: "",
|
||||
MaxAge: 0,
|
||||
}
|
||||
```
|
111
docs/api/middleware/csrf.md
Normal file
111
docs/api/middleware/csrf.md
Normal file
@ -0,0 +1,111 @@
|
||||
---
|
||||
id: csrf
|
||||
---
|
||||
|
||||
# CSRF
|
||||
|
||||
CSRF middleware for [Fiber](https://github.com/gofiber/fiber) that provides [Cross-site request forgery](https://en.wikipedia.org/wiki/Cross-site_request_forgery) protection by passing a csrf token via cookies. This cookie value will be used to compare against the client csrf token on requests, other than those defined as "safe" by RFC7231 \(GET, HEAD, OPTIONS, or TRACE\). When the csrf token is invalid, this middleware will return the `fiber.ErrForbidden` error.
|
||||
|
||||
CSRF Tokens are generated on GET requests. You can retrieve the CSRF token with `c.Locals(contextKey)`, where `contextKey` is the string you set in the config (see Custom Config below).
|
||||
|
||||
When no `csrf_` cookie is set, or the token has expired, a new token will be generated and `csrf_` cookie set.
|
||||
|
||||
:::note
|
||||
This middleware uses our [Storage](https://github.com/gofiber/storage) package to support various databases through a single interface. The default configuration for this middleware saves data to memory, see the examples below for other databases.
|
||||
:::
|
||||
|
||||
## Signatures
|
||||
|
||||
```go
|
||||
func New(config ...Config) fiber.Handler
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
Import the middleware package that is part of the Fiber web framework
|
||||
|
||||
```go
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/csrf"
|
||||
)
|
||||
```
|
||||
|
||||
After you initiate your Fiber app, you can use the following possibilities:
|
||||
|
||||
```go
|
||||
// Initialize default config
|
||||
app.Use(csrf.New())
|
||||
|
||||
// Or extend your config for customization
|
||||
app.Use(csrf.New(csrf.Config{
|
||||
KeyLookup: "header:X-Csrf-Token",
|
||||
CookieName: "csrf_",
|
||||
CookieSameSite: "Lax",
|
||||
Expiration: 1 * time.Hour,
|
||||
KeyGenerator: utils.UUID,
|
||||
Extractor: func(c *fiber.Ctx) (string, error) { ... },
|
||||
}))
|
||||
```
|
||||
|
||||
:::note
|
||||
KeyLookup will be ignored if Extractor is explicitly set.
|
||||
:::
|
||||
|
||||
## Config
|
||||
|
||||
### Config
|
||||
|
||||
| Property | Type | Description | Default |
|
||||
|:------------------|:-----------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------------------------|
|
||||
| Next | `func(*fiber.Ctx) bool` | Next defines a function to skip this middleware when returned true. | `nil` |
|
||||
| KeyLookup | `string` | KeyLookup is a string in the form of "`<source>:<key>`" that is used to create an Extractor that extracts the token from the request. Possible values: "`header:<name>`", "`query:<name>`", "`param:<name>`", "`form:<name>`", "`cookie:<name>`". Ignored if an Extractor is explicitly set. | "header:X-CSRF-Token" |
|
||||
| CookieName | `string` | Name of the session cookie. This cookie will store the session key. | "csrf_" |
|
||||
| CookieDomain | `string` | Domain of the CSRF cookie. | "" |
|
||||
| CookiePath | `string` | Path of the CSRF cookie. | "" |
|
||||
| CookieSecure | `bool` | Indicates if the CSRF cookie is secure. | false |
|
||||
| CookieHTTPOnly | `bool` | Indicates if the CSRF cookie is HTTP-only. | false |
|
||||
| CookieSameSite | `string` | Value of SameSite cookie. | "Lax" |
|
||||
| CookieSessionOnly | `bool` | Decides whether the cookie should last for only the browser session. Ignores Expiration if set to true. | false |
|
||||
| Expiration | `time.Duration` | Expiration is the duration before the CSRF token will expire. | 1 * time.Hour |
|
||||
| Storage | `fiber.Storage` | Store is used to store the state of the middleware. | memory.New() |
|
||||
| ContextKey | `string` | Context key to store the generated CSRF token into the context. If left empty, the token will not be stored in the context. | "" |
|
||||
| KeyGenerator | `func() string` | KeyGenerator creates a new CSRF token. | utils.UUID |
|
||||
| CookieExpires | `time.Duration` (Deprecated) | Deprecated: Please use Expiration. | 0 |
|
||||
| Cookie | `*fiber.Cookie` (Deprecated) | Deprecated: Please use Cookie* related fields. | nil |
|
||||
| TokenLookup | `string` (Deprecated) | Deprecated: Please use KeyLookup. | "" |
|
||||
| ErrorHandler | `fiber.ErrorHandler` | ErrorHandler is executed when an error is returned from fiber.Handler. | DefaultErrorHandler |
|
||||
| Extractor | `func(*fiber.Ctx) (string, error)` | Extractor returns the CSRF token. If set, this will be used in place of an Extractor based on KeyLookup. | Extractor based on KeyLookup |
|
||||
|
||||
## Default Config
|
||||
|
||||
```go
|
||||
var ConfigDefault = Config{
|
||||
KeyLookup: "header:" + HeaderName,
|
||||
CookieName: "csrf_",
|
||||
CookieSameSite: "Lax",
|
||||
Expiration: 1 * time.Hour,
|
||||
KeyGenerator: utils.UUID,
|
||||
ErrorHandler: defaultErrorHandler,
|
||||
Extractor: CsrfFromHeader(HeaderName),
|
||||
}
|
||||
```
|
||||
|
||||
## Constants
|
||||
|
||||
```go
|
||||
const (
|
||||
HeaderName = "X-Csrf-Token"
|
||||
)
|
||||
```
|
||||
|
||||
### Custom Storage/Database
|
||||
|
||||
You can use any storage from our [storage](https://github.com/gofiber/storage/) package.
|
||||
|
||||
```go
|
||||
storage := sqlite3.New() // From github.com/gofiber/storage/sqlite3
|
||||
app.Use(csrf.New(csrf.Config{
|
||||
Storage: storage,
|
||||
}))
|
||||
```
|
@ -1,4 +1,8 @@
|
||||
# Early Data Middleware
|
||||
---
|
||||
id: earlydata
|
||||
---
|
||||
|
||||
# EarlyData
|
||||
|
||||
The Early Data middleware for [Fiber](https://github.com/gofiber/fiber) adds support for TLS 1.3's early data ("0-RTT") feature.
|
||||
Citing [RFC 8446](https://datatracker.ietf.org/doc/html/rfc8446#section-2-3), when a client and server share a PSK, TLS 1.3 allows clients to send data on the first flight ("early data") to speed up the request, effectively reducing the regular 1-RTT request to a 0-RTT request.
|
||||
@ -13,17 +17,6 @@ Also be aware that enabling support for early data in your reverse proxy (e.g. n
|
||||
By default, this middleware allows early data requests on safe HTTP request methods only and rejects the request otherwise, i.e. aborts the request before executing your handler. This behavior can be controlled by the `AllowEarlyData` config option.
|
||||
Safe HTTP methods — `GET`, `HEAD`, `OPTIONS` and `TRACE` — should not modify a state on the server.
|
||||
|
||||
## Table of Contents
|
||||
|
||||
- [Early Data Middleware](#early-data-middleware)
|
||||
- [Table of Contents](#table-of-contents)
|
||||
- [Signatures](#signatures)
|
||||
- [Examples](#examples)
|
||||
- [Default Config](#default-config)
|
||||
- [Custom Config](#custom-config)
|
||||
- [Config](#config)
|
||||
- [Default Config](#default-config-1)
|
||||
|
||||
## Signatures
|
||||
|
||||
```go
|
||||
@ -32,7 +25,7 @@ func New(config ...Config) fiber.Handler
|
||||
|
||||
## Examples
|
||||
|
||||
First import the middleware from Fiber,
|
||||
Import the middleware package that is part of the Fiber web framework
|
||||
|
||||
```go
|
||||
import (
|
||||
@ -41,25 +34,22 @@ import (
|
||||
)
|
||||
```
|
||||
|
||||
Then create a Fiber app with `app := fiber.New()`.
|
||||
|
||||
### Default Config
|
||||
After you initiate your Fiber app, you can use the following possibilities:
|
||||
|
||||
```go
|
||||
// Initialize default config
|
||||
app.Use(earlydata.New())
|
||||
```
|
||||
|
||||
### Custom Config
|
||||
|
||||
```go
|
||||
// Or extend your config for customization
|
||||
app.Use(earlydata.New(earlydata.Config{
|
||||
Error: fiber.ErrTooEarly,
|
||||
// ...
|
||||
}))
|
||||
```
|
||||
|
||||
### Config
|
||||
## Config
|
||||
|
||||
<<<<<<< HEAD:middleware/earlydata/README.md
|
||||
```go
|
||||
type Config struct {
|
||||
// Next defines a function to skip this middleware when returned true.
|
||||
@ -90,6 +80,21 @@ type Config struct {
|
||||
var ConfigDefault = Config{
|
||||
IsEarlyData: func(c fiber.Ctx) bool {
|
||||
return c.Get("Early-Data") == "1"
|
||||
=======
|
||||
| Property | Type | Description | Default |
|
||||
|:---------------|:------------------------|:-------------------------------------------------------------------------------------|:-------------------------------------------------------|
|
||||
| Next | `func(*fiber.Ctx) bool` | Next defines a function to skip this middleware when returned true. | `nil` |
|
||||
| IsEarlyData | `func(*fiber.Ctx) bool` | IsEarlyData returns whether the request is an early-data request. | Function checking if "Early-Data" header equals "1" |
|
||||
| AllowEarlyData | `func(*fiber.Ctx) bool` | AllowEarlyData returns whether the early-data request should be allowed or rejected. | Function rejecting on unsafe and allowing safe methods |
|
||||
| Error | `error` | Error is returned in case an early-data request is rejected. | `fiber.ErrTooEarly` |
|
||||
|
||||
## Default Config
|
||||
|
||||
```go
|
||||
var ConfigDefault = Config{
|
||||
IsEarlyData: func(c *fiber.Ctx) bool {
|
||||
return c.Get(DefaultHeaderName) == DefaultHeaderTrueValue
|
||||
>>>>>>> origin/master:docs/api/middleware/earlydata.md
|
||||
},
|
||||
|
||||
AllowEarlyData: func(c fiber.Ctx) bool {
|
||||
@ -99,3 +104,12 @@ var ConfigDefault = Config{
|
||||
Error: fiber.ErrTooEarly,
|
||||
}
|
||||
```
|
||||
|
||||
## Constants
|
||||
|
||||
```go
|
||||
const (
|
||||
DefaultHeaderName = "Early-Data"
|
||||
DefaultHeaderTrueValue = "1"
|
||||
)
|
||||
```
|
@ -1,14 +1,11 @@
|
||||
# Encrypt Cookie Middleware
|
||||
---
|
||||
id: encryptcookie
|
||||
---
|
||||
|
||||
# Encrypt Cookie
|
||||
|
||||
Encrypt middleware for [Fiber](https://github.com/gofiber/fiber) which encrypts cookie values. Note: this middleware does not encrypt cookie names.
|
||||
|
||||
## Table of Contents
|
||||
|
||||
* [Signatures](encryptcookie.md#signatures)
|
||||
* [Setup](encryptcookie.md#setup)
|
||||
* [Config](encryptcookie.md#config)
|
||||
* [Default Config](encryptcookie.md#default-config)
|
||||
|
||||
## Signatures
|
||||
|
||||
```go
|
||||
@ -33,7 +30,10 @@ import (
|
||||
After you initiate your Fiber app, you can use the following possibilities:
|
||||
|
||||
```go
|
||||
// Default middleware config
|
||||
// Provide a minimal config
|
||||
// `Key` must be a 32 character string. It's used to encrypt the values, so make sure it is random and keep it secret.
|
||||
// You can run `openssl rand -base64 32` or call `encryptcookie.GenerateKey()` to create a random key for you.
|
||||
// Make sure not to set `Key` to `encryptcookie.GenerateKey()` because that will create a new key every run.
|
||||
app.Use(encryptcookie.New(encryptcookie.Config{
|
||||
Key: "secret-thirty-2-character-string",
|
||||
}))
|
||||
@ -55,6 +55,7 @@ app.Post("/", func(c fiber.Ctx) error {
|
||||
|
||||
## Config
|
||||
|
||||
<<<<<<< HEAD:middleware/encryptcookie/README.md
|
||||
```go
|
||||
type Config struct {
|
||||
// Next defines a function to skip this middleware when returned true.
|
||||
@ -84,16 +85,26 @@ type Config struct {
|
||||
Decryptor func(encryptedString, key string) (string, error)
|
||||
}
|
||||
```
|
||||
=======
|
||||
| Property | Type | Description | Default |
|
||||
|:----------|:----------------------------------------------------|:----------------------------------------------------------------------------------------------------|:-----------------------------|
|
||||
| Next | `func(*fiber.Ctx) bool` | Next defines a function to skip this middleware when returned true. | `nil` |
|
||||
| Except | `[]string` | Array of cookie keys that should not be encrypted. | `[]` |
|
||||
| Key | `string` | Base64 encoded unique key to encode & decode cookies. Required. Key length should be 32 characters. | (No default, required field) |
|
||||
| Encryptor | `func(decryptedString, key string) (string, error)` | Custom function to encrypt cookies. | `EncryptCookie` |
|
||||
| Decryptor | `func(encryptedString, key string) (string, error)` | Custom function to decrypt cookies. | `DecryptCookie` |
|
||||
>>>>>>> origin/master:docs/api/middleware/encryptcookie.md
|
||||
|
||||
## Default Config
|
||||
|
||||
```go
|
||||
// `Key` must be a 32 character string. It's used to encrpyt the values, so make sure it is random and keep it secret.
|
||||
// You can run `openssl rand -base64 32` or call `encryptcookie.GenerateKey()` to create a random key for you.
|
||||
// Make sure not to set `Key` to `encryptcookie.GenerateKey()` because that will create a new key every run.
|
||||
app.Use(encryptcookie.New(encryptcookie.Config{
|
||||
Key: "secret-thirty-2-character-string",
|
||||
}))
|
||||
var ConfigDefault = Config{
|
||||
Next: nil,
|
||||
Except: []string{"csrf_"},
|
||||
Key: "",
|
||||
Encryptor: EncryptCookie,
|
||||
Decryptor: DecryptCookie,
|
||||
}
|
||||
```
|
||||
|
||||
## Usage of CSRF and Encryptcookie Middlewares with Custom Cookie Names
|
||||
@ -104,7 +115,6 @@ app.Use(encryptcookie.New(encryptcookie.Config{
|
||||
Key: "secret-thirty-2-character-string",
|
||||
Except: []string{"csrf_1"}, // exclude CSRF cookie
|
||||
}))
|
||||
|
||||
app.Use(csrf.New(csrf.Config{
|
||||
KeyLookup: "form:test",
|
||||
CookieName: "csrf_1",
|
69
docs/api/middleware/envvar.md
Normal file
69
docs/api/middleware/envvar.md
Normal file
@ -0,0 +1,69 @@
|
||||
---
|
||||
id: envvar
|
||||
---
|
||||
|
||||
# EnvVar
|
||||
|
||||
EnvVar middleware for [Fiber](https://github.com/gofiber/fiber) that can be used to expose environment variables with various options.
|
||||
|
||||
## Signatures
|
||||
|
||||
```go
|
||||
func New(config ...Config) fiber.Handler
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
Import the middleware package that is part of the Fiber web framework
|
||||
|
||||
```go
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/envvar"
|
||||
)
|
||||
```
|
||||
|
||||
After you initiate your Fiber app, you can use the following possibilities:
|
||||
|
||||
```go
|
||||
// Initialize default config
|
||||
app.Use("/expose/envvars", envvar.New())
|
||||
|
||||
// Or extend your config for customization
|
||||
app.Use("/expose/envvars", envvar.New(
|
||||
envvar.Config{
|
||||
ExportVars: map[string]string{"testKey": "", "testDefaultKey": "testDefaultVal"},
|
||||
ExcludeVars: map[string]string{"excludeKey": ""},
|
||||
}),
|
||||
)
|
||||
```
|
||||
|
||||
:::note
|
||||
You will need to provide a path to use the envvar middleware.
|
||||
:::
|
||||
|
||||
## Response
|
||||
|
||||
Http response contract:
|
||||
```
|
||||
{
|
||||
"vars": {
|
||||
"someEnvVariable": "someValue",
|
||||
"anotherEnvVariable": "anotherValue",
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
## Config
|
||||
|
||||
| Property | Type | Description | Default |
|
||||
|:------------|:--------------------|:-----------------------------------------------------------------------------|:--------|
|
||||
| ExportVars | `map[string]string` | ExportVars specifies the environment variables that should be exported. | `nil` |
|
||||
| ExcludeVars | `map[string]string` | ExcludeVars specifies the environment variables that should not be exported. | `nil` |
|
||||
|
||||
## Default Config
|
||||
|
||||
```go
|
||||
Config{}
|
||||
```
|
62
docs/api/middleware/etag.md
Normal file
62
docs/api/middleware/etag.md
Normal file
@ -0,0 +1,62 @@
|
||||
---
|
||||
id: etag
|
||||
---
|
||||
|
||||
# ETag
|
||||
|
||||
ETag middleware for [Fiber](https://github.com/gofiber/fiber) that lets caches be more efficient and save bandwidth, as a web server does not need to resend a full response if the content has not changed.
|
||||
|
||||
## Signatures
|
||||
|
||||
```go
|
||||
func New(config ...Config) fiber.Handler
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
Import the middleware package that is part of the Fiber web framework
|
||||
|
||||
```go
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/etag"
|
||||
)
|
||||
```
|
||||
|
||||
After you initiate your Fiber app, you can use the following possibilities:
|
||||
|
||||
```go
|
||||
// Initialize default config
|
||||
app.Use(etag.New())
|
||||
|
||||
// Get / receives Etag: "13-1831710635" in response header
|
||||
app.Get("/", func(c *fiber.Ctx) error {
|
||||
return c.SendString("Hello, World!")
|
||||
})
|
||||
|
||||
// Or extend your config for customization
|
||||
app.Use(etag.New(etag.Config{
|
||||
Weak: true,
|
||||
}))
|
||||
|
||||
// Get / receives Etag: "W/"13-1831710635" in response header
|
||||
app.Get("/", func(c *fiber.Ctx) error {
|
||||
return c.SendString("Hello, World!")
|
||||
})
|
||||
```
|
||||
|
||||
## Config
|
||||
|
||||
| Property | Type | Description | Default |
|
||||
|:---------|:------------------------|:-------------------------------------------------------------------------------------------------------------------|:--------|
|
||||
| Weak | `bool` | Weak indicates that a weak validator is used. Weak etags are easy to generate but are less useful for comparisons. | `false` |
|
||||
| Next | `func(*fiber.Ctx) bool` | Next defines a function to skip this middleware when returned true. | `nil` |
|
||||
|
||||
## Default Config
|
||||
|
||||
```go
|
||||
var ConfigDefault = Config{
|
||||
Next: nil,
|
||||
Weak: false,
|
||||
}
|
||||
```
|
72
docs/api/middleware/expvar.md
Normal file
72
docs/api/middleware/expvar.md
Normal file
@ -0,0 +1,72 @@
|
||||
---
|
||||
id: expvar
|
||||
---
|
||||
|
||||
# ExpVar
|
||||
|
||||
Expvar middleware for [Fiber](https://github.com/gofiber/fiber) that serves via its HTTP server runtime exposed variants in the JSON format. The package is typically only imported for the side effect of registering its HTTP handlers. The handled path is `/debug/vars`.
|
||||
|
||||
## Signatures
|
||||
|
||||
```go
|
||||
func New() fiber.Handler
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
Import the middleware package that is part of the Fiber web framework
|
||||
|
||||
```go
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
expvarmw "github.com/gofiber/fiber/v2/middleware/expvar"
|
||||
)
|
||||
```
|
||||
|
||||
After you initiate your Fiber app, you can use the following possibilities:
|
||||
```go
|
||||
var count = expvar.NewInt("count")
|
||||
|
||||
app.Use(expvarmw.New())
|
||||
app.Get("/", func(c *fiber.Ctx) error {
|
||||
count.Add(1)
|
||||
|
||||
return c.SendString(fmt.Sprintf("hello expvar count %d", count.Value()))
|
||||
})
|
||||
```
|
||||
|
||||
Visit path `/debug/vars` to see all vars and use query `r=key` to filter exposed variables.
|
||||
|
||||
```bash
|
||||
curl 127.0.0.1:3000
|
||||
hello expvar count 1
|
||||
|
||||
curl 127.0.0.1:3000/debug/vars
|
||||
{
|
||||
"cmdline": ["xxx"],
|
||||
"count": 1,
|
||||
"expvarHandlerCalls": 33,
|
||||
"expvarRegexpErrors": 0,
|
||||
"memstats": {...}
|
||||
}
|
||||
|
||||
curl 127.0.0.1:3000/debug/vars?r=c
|
||||
{
|
||||
"cmdline": ["xxx"],
|
||||
"count": 1
|
||||
}
|
||||
```
|
||||
|
||||
## Config
|
||||
|
||||
| Property | Type | Description | Default |
|
||||
|:---------|:------------------------|:--------------------------------------------------------------------|:--------|
|
||||
| Next | `func(*fiber.Ctx) bool` | Next defines a function to skip this middleware when returned true. | `nil` |
|
||||
|
||||
## Default Config
|
||||
|
||||
```go
|
||||
var ConfigDefault = Config{
|
||||
Next: nil,
|
||||
}
|
||||
```
|
62
docs/api/middleware/favicon.md
Normal file
62
docs/api/middleware/favicon.md
Normal file
@ -0,0 +1,62 @@
|
||||
---
|
||||
id: favicon
|
||||
---
|
||||
|
||||
# Favicon
|
||||
|
||||
Favicon middleware for [Fiber](https://github.com/gofiber/fiber) that ignores favicon requests or caches a provided icon in memory to improve performance by skipping disk access. User agents request favicon.ico frequently and indiscriminately, so you may wish to exclude these requests from your logs by using this middleware before your logger middleware.
|
||||
|
||||
:::note
|
||||
This middleware is exclusively for serving the default, implicit favicon, which is GET /favicon.ico or [custom favicon URL](#config).
|
||||
:::
|
||||
|
||||
## Signatures
|
||||
|
||||
```go
|
||||
func New(config ...Config) fiber.Handler
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
Import the middleware package that is part of the Fiber web framework
|
||||
|
||||
```go
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/favicon"
|
||||
)
|
||||
```
|
||||
|
||||
After you initiate your Fiber app, you can use the following possibilities:
|
||||
|
||||
```go
|
||||
// Initialize default config
|
||||
app.Use(favicon.New())
|
||||
|
||||
// Or extend your config for customization
|
||||
app.Use(favicon.New(favicon.Config{
|
||||
File: "./favicon.ico",
|
||||
URL: "/favicon.ico",
|
||||
}))
|
||||
```
|
||||
|
||||
## Config
|
||||
|
||||
| Property | Type | Description | Default |
|
||||
|:-------------|:------------------------|:---------------------------------------------------------------------------------|:---------------------------|
|
||||
| Next | `func(*fiber.Ctx) bool` | Next defines a function to skip this middleware when returned true. | `nil` |
|
||||
| File | `string` | File holds the path to an actual favicon that will be cached. | "" |
|
||||
| URL | `string` | URL for favicon handler. | "/favicon.ico" |
|
||||
| FileSystem | `http.FileSystem` | FileSystem is an optional alternate filesystem to search for the favicon in. | `nil` |
|
||||
| CacheControl | `string` | CacheControl defines how the Cache-Control header in the response should be set. | "public, max-age=31536000" |
|
||||
|
||||
## Default Config
|
||||
|
||||
```go
|
||||
var ConfigDefault = Config{
|
||||
Next: nil,
|
||||
File: "",
|
||||
URL: fPath,
|
||||
CacheControl: "public, max-age=31536000",
|
||||
}
|
||||
```
|
255
docs/api/middleware/filesystem.md
Normal file
255
docs/api/middleware/filesystem.md
Normal file
@ -0,0 +1,255 @@
|
||||
---
|
||||
id: filesystem
|
||||
---
|
||||
|
||||
# FileSystem
|
||||
|
||||
Filesystem middleware for [Fiber](https://github.com/gofiber/fiber) that enables you to serve files from a directory.
|
||||
|
||||
:::caution
|
||||
**`:params` & `:optionals?` within the prefix path are not supported!**
|
||||
|
||||
**To handle paths with spaces (or other url encoded values) make sure to set `fiber.Config{ UnescapePath: true }`**
|
||||
:::
|
||||
|
||||
## Signatures
|
||||
|
||||
```go
|
||||
func New(config Config) fiber.Handler
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
Import the middleware package that is part of the Fiber web framework
|
||||
|
||||
```go
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/filesystem"
|
||||
)
|
||||
```
|
||||
|
||||
After you initiate your Fiber app, you can use the following possibilities:
|
||||
|
||||
```go
|
||||
// Provide a minimal config
|
||||
app.Use(filesystem.New(filesystem.Config{
|
||||
Root: http.Dir("./assets"),
|
||||
}))
|
||||
|
||||
// Or extend your config for customization
|
||||
app.Use(filesystem.New(filesystem.Config{
|
||||
Root: http.Dir("./assets"),
|
||||
Browse: true,
|
||||
Index: "index.html",
|
||||
NotFoundFile: "404.html",
|
||||
MaxAge: 3600,
|
||||
}))
|
||||
```
|
||||
|
||||
|
||||
> If your environment (Go 1.16+) supports it, we recommend using Go Embed instead of the other solutions listed as this one is native to Go and the easiest to use.
|
||||
|
||||
## embed
|
||||
|
||||
[Embed](https://golang.org/pkg/embed/) is the native method to embed files in a Golang excecutable. Introduced in Go 1.16.
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"embed"
|
||||
"io/fs"
|
||||
"log"
|
||||
"net/http"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/filesystem"
|
||||
)
|
||||
|
||||
// Embed a single file
|
||||
//go:embed index.html
|
||||
var f embed.FS
|
||||
|
||||
// Embed a directory
|
||||
//go:embed static/*
|
||||
var embedDirStatic embed.FS
|
||||
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
app.Use("/", filesystem.New(filesystem.Config{
|
||||
Root: http.FS(f),
|
||||
}))
|
||||
|
||||
// Access file "image.png" under `static/` directory via URL: `http://<server>/static/image.png`.
|
||||
// Without `PathPrefix`, you have to access it via URL:
|
||||
// `http://<server>/static/static/image.png`.
|
||||
app.Use("/static", filesystem.New(filesystem.Config{
|
||||
Root: http.FS(embedDirStatic),
|
||||
PathPrefix: "static",
|
||||
Browse: true,
|
||||
}))
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
```
|
||||
|
||||
## pkger
|
||||
|
||||
[https://github.com/markbates/pkger](https://github.com/markbates/pkger)
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/filesystem"
|
||||
|
||||
"github.com/markbates/pkger"
|
||||
)
|
||||
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
app.Use("/assets", filesystem.New(filesystem.Config{
|
||||
Root: pkger.Dir("/assets"),
|
||||
}))
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
```
|
||||
|
||||
## packr
|
||||
|
||||
[https://github.com/gobuffalo/packr](https://github.com/gobuffalo/packr)
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/filesystem"
|
||||
|
||||
"github.com/gobuffalo/packr/v2"
|
||||
)
|
||||
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
app.Use("/assets", filesystem.New(filesystem.Config{
|
||||
Root: packr.New("Assets Box", "/assets"),
|
||||
}))
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
```
|
||||
|
||||
## go.rice
|
||||
|
||||
[https://github.com/GeertJohan/go.rice](https://github.com/GeertJohan/go.rice)
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/filesystem"
|
||||
|
||||
"github.com/GeertJohan/go.rice"
|
||||
)
|
||||
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
app.Use("/assets", filesystem.New(filesystem.Config{
|
||||
Root: rice.MustFindBox("assets").HTTPBox(),
|
||||
}))
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
```
|
||||
|
||||
## fileb0x
|
||||
|
||||
[https://github.com/UnnoTed/fileb0x](https://github.com/UnnoTed/fileb0x)
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/filesystem"
|
||||
|
||||
"<Your go module>/myEmbeddedFiles"
|
||||
)
|
||||
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
app.Use("/assets", filesystem.New(filesystem.Config{
|
||||
Root: myEmbeddedFiles.HTTP,
|
||||
}))
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
```
|
||||
|
||||
## statik
|
||||
|
||||
[https://github.com/rakyll/statik](https://github.com/rakyll/statik)
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/filesystem"
|
||||
|
||||
// Use blank to invoke init function and register data to statik
|
||||
_ "<Your go module>/statik"
|
||||
"github.com/rakyll/statik/fs"
|
||||
)
|
||||
|
||||
func main() {
|
||||
statikFS, err := fs.New()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
app := fiber.New()
|
||||
|
||||
app.Use("/", filesystem.New(filesystem.Config{
|
||||
Root: statikFS,
|
||||
}))
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
```
|
||||
|
||||
## Config
|
||||
|
||||
| Property | Type | Description | Default |
|
||||
|:-------------------|:------------------------|:------------------------------------------------------------------------------------------------------------|:-------------|
|
||||
| Next | `func(*fiber.Ctx) bool` | Next defines a function to skip this middleware when returned true. | `nil` |
|
||||
| Root | `http.FileSystem` | Root is a FileSystem that provides access to a collection of files and directories. | `nil` |
|
||||
| PathPrefix | `string` | PathPrefix defines a prefix to be added to a filepath when reading a file from the FileSystem. | "" |
|
||||
| Browse | `bool` | Enable directory browsing. | `false` |
|
||||
| Index | `string` | Index file for serving a directory. | "index.html" |
|
||||
| MaxAge | `int` | The value for the Cache-Control HTTP-header that is set on the file response. MaxAge is defined in seconds. | 0 |
|
||||
| NotFoundFile | `string` | File to return if the path is not found. Useful for SPA's. | "" |
|
||||
| ContentTypeCharset | `string` | The value for the Content-Type HTTP-header that is set on the file response. | "" |
|
||||
|
||||
## Default Config
|
||||
|
||||
```go
|
||||
var ConfigDefault = Config{
|
||||
Next: nil,
|
||||
Root: nil,
|
||||
PathPrefix: "",
|
||||
Browse: false,
|
||||
Index: "/index.html",
|
||||
MaxAge: 0,
|
||||
ContentTypeCharset: "",
|
||||
}
|
||||
```
|
82
docs/api/middleware/helmet.md
Normal file
82
docs/api/middleware/helmet.md
Normal file
@ -0,0 +1,82 @@
|
||||
---
|
||||
id: helmet
|
||||
---
|
||||
|
||||
# Helmet
|
||||
|
||||
Helmet middleware helps secure your apps by setting various HTTP headers.
|
||||
|
||||
## Signatures
|
||||
|
||||
```go
|
||||
func New(config ...Config) fiber.Handler
|
||||
```
|
||||
|
||||
## Examples
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/helmet"
|
||||
)
|
||||
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
app.Use(helmet.New())
|
||||
|
||||
app.Get("/", func(c *fiber.Ctx) error {
|
||||
return c.SendString("Welcome!")
|
||||
})
|
||||
|
||||
app.Listen(":3000")
|
||||
}
|
||||
```
|
||||
|
||||
**Test:**
|
||||
|
||||
```curl
|
||||
curl -I http://localhost:3000
|
||||
```
|
||||
|
||||
## Config
|
||||
|
||||
| Property | Type | Description | Default |
|
||||
|:--------------------------|:------------------------|:--------------------------------------------|:-----------------|
|
||||
| Next | `func(*fiber.Ctx) bool` | Next defines a function to skip middleware. | `nil` |
|
||||
| XSSProtection | `string` | XSSProtection | "0" |
|
||||
| ContentTypeNosniff | `string` | ContentTypeNosniff | "nosniff" |
|
||||
| XFrameOptions | `string` | XFrameOptions | "SAMEORIGIN" |
|
||||
| HSTSMaxAge | `int` | HSTSMaxAge | 0 |
|
||||
| HSTSExcludeSubdomains | `bool` | HSTSExcludeSubdomains | false |
|
||||
| ContentSecurityPolicy | `string` | ContentSecurityPolicy | "" |
|
||||
| CSPReportOnly | `bool` | CSPReportOnly | false |
|
||||
| HSTSPreloadEnabled | `bool` | HSTSPreloadEnabled | false |
|
||||
| ReferrerPolicy | `string` | ReferrerPolicy | "ReferrerPolicy" |
|
||||
| PermissionPolicy | `string` | Permissions-Policy | "" |
|
||||
| CrossOriginEmbedderPolicy | `string` | Cross-Origin-Embedder-Policy | "require-corp" |
|
||||
| CrossOriginOpenerPolicy | `string` | Cross-Origin-Opener-Policy | "same-origin" |
|
||||
| CrossOriginResourcePolicy | `string` | Cross-Origin-Resource-Policy | "same-origin" |
|
||||
| OriginAgentCluster | `string` | Origin-Agent-Cluster | "?1" |
|
||||
| XDNSPrefetchControl | `string` | X-DNS-Prefetch-Control | "off" |
|
||||
| XDownloadOptions | `string` | X-Download-Options | "noopen" |
|
||||
| XPermittedCrossDomain | `string` | X-Permitted-Cross-Domain-Policies | "none" |
|
||||
|
||||
## Default Config
|
||||
|
||||
```go
|
||||
var ConfigDefault = Config{
|
||||
XSSProtection: "0",
|
||||
ContentTypeNosniff: "nosniff",
|
||||
XFrameOptions: "SAMEORIGIN",
|
||||
ReferrerPolicy: "no-referrer",
|
||||
CrossOriginEmbedderPolicy: "require-corp",
|
||||
CrossOriginOpenerPolicy: "same-origin",
|
||||
CrossOriginResourcePolicy: "same-origin",
|
||||
OriginAgentCluster: "?1",
|
||||
XDNSPrefetchControl: "off",
|
||||
XDownloadOptions: "noopen",
|
||||
XPermittedCrossDomain: "none",
|
||||
}
|
||||
```
|
83
docs/api/middleware/idempotency.md
Normal file
83
docs/api/middleware/idempotency.md
Normal file
@ -0,0 +1,83 @@
|
||||
---
|
||||
id: idempotency
|
||||
---
|
||||
|
||||
# Idempotency
|
||||
|
||||
Idempotency middleware for [Fiber](https://github.com/gofiber/fiber) allows for fault-tolerant APIs where duplicate requests — for example due to networking issues on the client-side — do not erroneously cause the same action performed multiple times on the server-side.
|
||||
|
||||
Refer to https://datatracker.ietf.org/doc/html/draft-ietf-httpapi-idempotency-key-header-02 for a better understanding.
|
||||
|
||||
## Signatures
|
||||
|
||||
```go
|
||||
func New(config ...Config) fiber.Handler
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
Import the middleware package that is part of the Fiber web framework
|
||||
|
||||
```go
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/idempotency"
|
||||
)
|
||||
```
|
||||
|
||||
After you initiate your Fiber app, you can use the following possibilities:
|
||||
|
||||
### Default Config
|
||||
|
||||
```go
|
||||
app.Use(idempotency.New())
|
||||
```
|
||||
|
||||
### Custom Config
|
||||
|
||||
```go
|
||||
app.Use(idempotency.New(idempotency.Config{
|
||||
Lifetime: 42 * time.Minute,
|
||||
// ...
|
||||
}))
|
||||
```
|
||||
|
||||
### Config
|
||||
|
||||
| Property | Type | Description | Default |
|
||||
|:--------------------|:------------------------|:-----------------------------------------------------------------------------------------|:-------------------------------|
|
||||
| Next | `func(*fiber.Ctx) bool` | Next defines a function to skip this middleware when returned true. | A function for safe methods |
|
||||
| Lifetime | `time.Duration` | Lifetime is the maximum lifetime of an idempotency key. | 30 * time.Minute |
|
||||
| KeyHeader | `string` | KeyHeader is the name of the header that contains the idempotency key. | "X-Idempotency-Key" |
|
||||
| KeyHeaderValidate | `func(string) error` | KeyHeaderValidate defines a function to validate the syntax of the idempotency header. | A function for UUID validation |
|
||||
| KeepResponseHeaders | `[]string` | KeepResponseHeaders is a list of headers that should be kept from the original response. | nil (keep all headers) |
|
||||
| Lock | `Locker` | Lock locks an idempotency key. | An in-memory locker |
|
||||
| Storage | `fiber.Storage` | Storage stores response data by idempotency key. | An in-memory storage |
|
||||
|
||||
## Default Config
|
||||
|
||||
```go
|
||||
var ConfigDefault = Config{
|
||||
Next: func(c *fiber.Ctx) bool {
|
||||
// Skip middleware if the request was done using a safe HTTP method
|
||||
return fiber.IsMethodSafe(c.Method())
|
||||
},
|
||||
|
||||
Lifetime: 30 * time.Minute,
|
||||
|
||||
KeyHeader: "X-Idempotency-Key",
|
||||
KeyHeaderValidate: func(k string) error {
|
||||
if l, wl := len(k), 36; l != wl { // UUID length is 36 chars
|
||||
return fmt.Errorf("%w: invalid length: %d != %d", ErrInvalidIdempotencyKey, l, wl)
|
||||
}
|
||||
|
||||
return nil
|
||||
},
|
||||
|
||||
KeepResponseHeaders: nil,
|
||||
|
||||
Lock: nil, // Set in configDefault so we don't allocate data here.
|
||||
|
||||
Storage: nil, // Set in configDefault so we don't allocate data here.
|
||||
}
|
||||
```
|
243
docs/api/middleware/keyauth.md
Normal file
243
docs/api/middleware/keyauth.md
Normal file
@ -0,0 +1,243 @@
|
||||
---
|
||||
id: keyauth
|
||||
---
|
||||
|
||||
# Keyauth
|
||||
|
||||
Key auth middleware provides a key based authentication.
|
||||
|
||||
## Signatures
|
||||
|
||||
```go
|
||||
func New(config ...Config) fiber.Handler
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"crypto/sha256"
|
||||
"crypto/subtle"
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/keyauth"
|
||||
)
|
||||
|
||||
var (
|
||||
apiKey = "correct horse battery staple"
|
||||
)
|
||||
|
||||
func validateAPIKey(c *fiber.Ctx, key string) (bool, error) {
|
||||
hashedAPIKey := sha256.Sum256([]byte(apiKey))
|
||||
hashedKey := sha256.Sum256([]byte(key))
|
||||
|
||||
if subtle.ConstantTimeCompare(hashedAPIKey[:], hashedKey[:]) == 1 {
|
||||
return true, nil
|
||||
}
|
||||
return false, keyauth.ErrMissingOrMalformedAPIKey
|
||||
}
|
||||
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
// note that the keyauth middleware needs to be defined before the routes are defined!
|
||||
app.Use(keyauth.New(keyauth.Config{
|
||||
KeyLookup: "cookie:access_token",
|
||||
Validator: validateAPIKey,
|
||||
}))
|
||||
|
||||
app.Get("/", func(c *fiber.Ctx) error {
|
||||
return c.SendString("Successfully authenticated!")
|
||||
})
|
||||
|
||||
app.Listen(":3000")
|
||||
}
|
||||
```
|
||||
|
||||
**Test:**
|
||||
|
||||
```bash
|
||||
# No api-key specified -> 400 missing
|
||||
curl http://localhost:3000
|
||||
#> missing or malformed API Key
|
||||
|
||||
curl --cookie "access_token=correct horse battery staple" http://localhost:3000
|
||||
#> Successfully authenticated!
|
||||
|
||||
curl --cookie "access_token=Clearly A Wrong Key" http://localhost:3000
|
||||
#> missing or malformed API Key
|
||||
```
|
||||
|
||||
For a more detailed example, see also the [`github.com/gofiber/recipes`](https://github.com/gofiber/recipes) repository and specifically the `fiber-envoy-extauthz` repository and the [`keyauth example`](https://github.com/gofiber/recipes/blob/master/fiber-envoy-extauthz/authz/main.go) code.
|
||||
|
||||
|
||||
### Authenticate only certain endpoints
|
||||
|
||||
If you want to authenticate only certain endpoints, you can use the `Config` of keyauth and apply a filter function (eg. `authFilter`) like so
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"crypto/sha256"
|
||||
"crypto/subtle"
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/keyauth"
|
||||
"regexp"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var (
|
||||
apiKey = "correct horse battery staple"
|
||||
protectedURLs = []*regexp.Regexp{
|
||||
regexp.MustCompile("^/authenticated$"),
|
||||
regexp.MustCompile("^/auth2$"),
|
||||
}
|
||||
)
|
||||
|
||||
func validateAPIKey(c *fiber.Ctx, key string) (bool, error) {
|
||||
hashedAPIKey := sha256.Sum256([]byte(apiKey))
|
||||
hashedKey := sha256.Sum256([]byte(key))
|
||||
|
||||
if subtle.ConstantTimeCompare(hashedAPIKey[:], hashedKey[:]) == 1 {
|
||||
return true, nil
|
||||
}
|
||||
return false, keyauth.ErrMissingOrMalformedAPIKey
|
||||
}
|
||||
|
||||
func authFilter(c *fiber.Ctx) bool {
|
||||
originalURL := strings.ToLower(c.OriginalURL())
|
||||
|
||||
for _, pattern := range protectedURLs {
|
||||
if pattern.MatchString(originalURL) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
app.Use(keyauth.New(keyauth.Config{
|
||||
Next: authFilter,
|
||||
KeyLookup: "cookie:access_token",
|
||||
Validator: validateAPIKey,
|
||||
}))
|
||||
|
||||
app.Get("/", func(c *fiber.Ctx) error {
|
||||
return c.SendString("Welcome")
|
||||
})
|
||||
app.Get("/authenticated", func(c *fiber.Ctx) error {
|
||||
return c.SendString("Successfully authenticated!")
|
||||
})
|
||||
app.Get("/auth2", func(c *fiber.Ctx) error {
|
||||
return c.SendString("Successfully authenticated 2!")
|
||||
})
|
||||
|
||||
app.Listen(":3000")
|
||||
}
|
||||
```
|
||||
|
||||
Which results in this
|
||||
|
||||
```bash
|
||||
# / does not need to be authenticated
|
||||
curl http://localhost:3000
|
||||
#> Welcome
|
||||
|
||||
# /authenticated needs to be authenticated
|
||||
curl --cookie "access_token=correct horse battery staple" http://localhost:3000/authenticated
|
||||
#> Successfully authenticated!
|
||||
|
||||
# /auth2 needs to be authenticated too
|
||||
curl --cookie "access_token=correct horse battery staple" http://localhost:3000/auth2
|
||||
#> Successfully authenticated 2!
|
||||
```
|
||||
|
||||
### Specifying middleware in the handler
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"crypto/sha256"
|
||||
"crypto/subtle"
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/keyauth"
|
||||
)
|
||||
|
||||
const (
|
||||
apiKey = "my-super-secret-key"
|
||||
)
|
||||
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
authMiddleware := keyauth.New(keyauth.Config{
|
||||
Validator: func(c *fiber.Ctx, key string) (bool, error) {
|
||||
hashedAPIKey := sha256.Sum256([]byte(apiKey))
|
||||
hashedKey := sha256.Sum256([]byte(key))
|
||||
|
||||
if subtle.ConstantTimeCompare(hashedAPIKey[:], hashedKey[:]) == 1 {
|
||||
return true, nil
|
||||
}
|
||||
return false, keyauth.ErrMissingOrMalformedAPIKey
|
||||
},
|
||||
})
|
||||
|
||||
app.Get("/", func(c *fiber.Ctx) error {
|
||||
return c.SendString("Welcome")
|
||||
})
|
||||
|
||||
app.Get("/allowed", authMiddleware, func(c *fiber.Ctx) error {
|
||||
return c.SendString("Successfully authenticated!")
|
||||
})
|
||||
|
||||
app.Listen(":3000")
|
||||
}
|
||||
```
|
||||
|
||||
Which results in this
|
||||
|
||||
```bash
|
||||
# / does not need to be authenticated
|
||||
curl http://localhost:3000
|
||||
#> Welcome
|
||||
|
||||
# /allowed needs to be authenticated too
|
||||
curl --header "Authorization: Bearer my-super-secret-key" http://localhost:3000/allowed
|
||||
#> Successfully authenticated!
|
||||
```
|
||||
|
||||
## Config
|
||||
|
||||
| Property | Type | Description | Default |
|
||||
|:---------------|:-----------------------------------------|:-----------------------------------------------------------------------------------------------------|:------------------------------|
|
||||
| Next | `func(*fiber.Ctx) bool` | Next defines a function to skip this middleware when returned true. | `nil` |
|
||||
| SuccessHandler | `fiber.Handler` | SuccessHandler defines a function which is executed for a valid key. | `nil` |
|
||||
| ErrorHandler | `fiber.ErrorHandler` | ErrorHandler defines a function which is executed for an invalid key. | `401 Invalid or expired key` |
|
||||
| KeyLookup | `string` | KeyLookup is a string in the form of "`<source>:<name>`" that is used to extract key from the request. | "header:Authorization" |
|
||||
| AuthScheme | `string` | AuthScheme to be used in the Authorization header. | "Bearer" |
|
||||
| Validator | `func(*fiber.Ctx, string) (bool, error)` | Validator is a function to validate the key. | A function for key validation |
|
||||
| ContextKey | `string` | Context key to store the bearer token from the token into context. | "token" |
|
||||
|
||||
## Default Config
|
||||
|
||||
```go
|
||||
var ConfigDefault = Config{
|
||||
SuccessHandler: func(c *fiber.Ctx) error {
|
||||
return c.Next()
|
||||
},
|
||||
ErrorHandler: func(c *fiber.Ctx, err error) error {
|
||||
if err == ErrMissingOrMalformedAPIKey {
|
||||
return c.Status(fiber.StatusUnauthorized).SendString(err.Error())
|
||||
}
|
||||
return c.Status(fiber.StatusUnauthorized).SendString("Invalid or expired API Key")
|
||||
},
|
||||
KeyLookup: "header:" + fiber.HeaderAuthorization,
|
||||
AuthScheme: "Bearer",
|
||||
ContextKey: "token",
|
||||
}
|
||||
```
|
125
docs/api/middleware/limiter.md
Normal file
125
docs/api/middleware/limiter.md
Normal file
@ -0,0 +1,125 @@
|
||||
---
|
||||
id: limiter
|
||||
---
|
||||
|
||||
# Limiter
|
||||
|
||||
Limiter middleware for [Fiber](https://github.com/gofiber/fiber) that is used to limit repeat requests to public APIs and/or endpoints such as password reset. It is also useful for API clients, web crawling, or other tasks that need to be throttled.
|
||||
|
||||
:::note
|
||||
This middleware uses our [Storage](https://github.com/gofiber/storage) package to support various databases through a single interface. The default configuration for this middleware saves data to memory, see the examples below for other databases.
|
||||
:::
|
||||
|
||||
:::note
|
||||
This module does not share state with other processes/servers by default.
|
||||
:::
|
||||
|
||||
## Signatures
|
||||
|
||||
```go
|
||||
func New(config ...Config) fiber.Handler
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
Import the middleware package that is part of the Fiber web framework
|
||||
|
||||
```go
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/limiter"
|
||||
)
|
||||
```
|
||||
|
||||
After you initiate your Fiber app, you can use the following possibilities:
|
||||
|
||||
```go
|
||||
// Initialize default config
|
||||
app.Use(limiter.New())
|
||||
|
||||
// Or extend your config for customization
|
||||
app.Use(limiter.New(limiter.Config{
|
||||
Next: func(c *fiber.Ctx) bool {
|
||||
return c.IP() == "127.0.0.1"
|
||||
},
|
||||
Max: 20,
|
||||
Expiration: 30 * time.Second,
|
||||
KeyGenerator: func(c *fiber.Ctx) string {
|
||||
return c.Get("x-forwarded-for")
|
||||
},
|
||||
LimitReached: func(c *fiber.Ctx) error {
|
||||
return c.SendFile("./toofast.html")
|
||||
},
|
||||
Storage: myCustomStorage{},
|
||||
}))
|
||||
```
|
||||
|
||||
## Sliding window
|
||||
|
||||
Instead of using the standard fixed window algorithm, you can enable the [sliding window](https://en.wikipedia.org/wiki/Sliding_window_protocol) algorithm.
|
||||
|
||||
A example of such configuration is:
|
||||
|
||||
```go
|
||||
app.Use(limiter.New(limiter.Config{
|
||||
Max: 20,
|
||||
Expiration: 30 * time.Second,
|
||||
LimiterMiddleware: limiter.SlidingWindow{},
|
||||
}))
|
||||
```
|
||||
|
||||
This means that every window will take into account the previous window(if there was any). The given formula for the rate is:
|
||||
```
|
||||
weightOfPreviousWindpw = previous window's amount request * (whenNewWindow / Expiration)
|
||||
rate = weightOfPreviousWindpw + current window's amount request.
|
||||
```
|
||||
|
||||
## Config
|
||||
|
||||
| Property | Type | Description | Default |
|
||||
|:-----------------------|:--------------------------|:--------------------------------------------------------------------------------------------|:-----------------------------------------|
|
||||
| Next | `func(*fiber.Ctx) bool` | Next defines a function to skip this middleware when returned true. | `nil` |
|
||||
| Max | `int` | Max number of recent connections during `Expiration` seconds before sending a 429 response. | 5 |
|
||||
| KeyGenerator | `func(*fiber.Ctx) string` | KeyGenerator allows you to generate custom keys, by default c.IP() is used. | A function using c.IP() as the default |
|
||||
| Expiration | `time.Duration` | Expiration is the time on how long to keep records of requests in memory. | 1 * time.Minute |
|
||||
| LimitReached | `fiber.Handler` | LimitReached is called when a request hits the limit. | A function sending 429 response |
|
||||
| SkipFailedRequests | `bool` | When set to true, requests with StatusCode >= 400 won't be counted. | false |
|
||||
| SkipSuccessfulRequests | `bool` | When set to true, requests with StatusCode < 400 won't be counted. | false |
|
||||
| Storage | `fiber.Storage` | Store is used to store the state of the middleware. | An in-memory store for this process only |
|
||||
| LimiterMiddleware | `LimiterHandler` | LimiterMiddleware is the struct that implements a limiter middleware. | A new Fixed Window Rate Limiter |
|
||||
| Duration (Deprecated) | `time.Duration` | Deprecated: Use Expiration instead | - |
|
||||
| Store (Deprecated) | `fiber.Storage` | Deprecated: Use Storage instead | - |
|
||||
| Key (Deprecated) | `func(*fiber.Ctx) string` | Deprecated: Use KeyGenerator instead | - |
|
||||
|
||||
:::note
|
||||
A custom store can be used if it implements the `Storage` interface - more details and an example can be found in `store.go`.
|
||||
:::
|
||||
|
||||
## Default Config
|
||||
|
||||
```go
|
||||
var ConfigDefault = Config{
|
||||
Max: 5,
|
||||
Expiration: 1 * time.Minute,
|
||||
KeyGenerator: func(c *fiber.Ctx) string {
|
||||
return c.IP()
|
||||
},
|
||||
LimitReached: func(c *fiber.Ctx) error {
|
||||
return c.SendStatus(fiber.StatusTooManyRequests)
|
||||
},
|
||||
SkipFailedRequests: false,
|
||||
SkipSuccessfulRequests: false,
|
||||
LimiterMiddleware: FixedWindow{},
|
||||
}
|
||||
```
|
||||
|
||||
### Custom Storage/Database
|
||||
|
||||
You can use any storage from our [storage](https://github.com/gofiber/storage/) package.
|
||||
|
||||
```go
|
||||
storage := sqlite3.New() // From github.com/gofiber/storage/sqlite3
|
||||
app.Use(limiter.New(limiter.Config{
|
||||
Storage: storage,
|
||||
}))
|
||||
```
|
169
docs/api/middleware/logger.md
Normal file
169
docs/api/middleware/logger.md
Normal file
@ -0,0 +1,169 @@
|
||||
---
|
||||
id: logger
|
||||
---
|
||||
|
||||
# Logger
|
||||
|
||||
Logger middleware for [Fiber](https://github.com/gofiber/fiber) that logs HTTP request/response details.
|
||||
|
||||
## Signatures
|
||||
```go
|
||||
func New(config ...Config) fiber.Handler
|
||||
```
|
||||
## Examples
|
||||
|
||||
Import the middleware package that is part of the Fiber web framework
|
||||
|
||||
```go
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/logger"
|
||||
)
|
||||
```
|
||||
|
||||
:::tip
|
||||
The order of registration plays a role. Only all routes that are registered after this one will be logged.
|
||||
The middleware should therefore be one of the first to be registered.
|
||||
:::
|
||||
|
||||
After you initiate your Fiber app, you can use the following possibilities:
|
||||
|
||||
```go
|
||||
// Initialize default config
|
||||
app.Use(logger.New())
|
||||
|
||||
// Or extend your config for customization
|
||||
// Logging remote IP and Port
|
||||
app.Use(logger.New(logger.Config{
|
||||
Format: "[${ip}]:${port} ${status} - ${method} ${path}\n",
|
||||
}))
|
||||
|
||||
// Logging Request ID
|
||||
app.Use(requestid.New())
|
||||
app.Use(logger.New(logger.Config{
|
||||
// For more options, see the Config section
|
||||
Format: "${pid} ${locals:requestid} ${status} - ${method} ${path}\n",
|
||||
}))
|
||||
|
||||
// Changing TimeZone & TimeFormat
|
||||
app.Use(logger.New(logger.Config{
|
||||
Format: "${pid} ${status} - ${method} ${path}\n",
|
||||
TimeFormat: "02-Jan-2006",
|
||||
TimeZone: "America/New_York",
|
||||
}))
|
||||
|
||||
// Custom File Writer
|
||||
file, err := os.OpenFile("./123.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
|
||||
if err != nil {
|
||||
log.Fatalf("error opening file: %v", err)
|
||||
}
|
||||
defer file.Close()
|
||||
app.Use(logger.New(logger.Config{
|
||||
Output: file,
|
||||
}))
|
||||
|
||||
// Add Custom Tags
|
||||
app.Use(logger.New(logger.Config{
|
||||
CustomTags: map[string]logger.LogFunc{
|
||||
"custom_tag": func(output logger.Buffer, c *fiber.Ctx, data *logger.Data, extraParam string) (int, error) {
|
||||
return output.WriteString("it is a custom tag")
|
||||
},
|
||||
},
|
||||
}))
|
||||
|
||||
// Callback after log is written
|
||||
app.Use(logger.New(logger.Config{
|
||||
TimeFormat: time.RFC3339Nano,
|
||||
TimeZone: "Asia/Shanghai",
|
||||
Done: func(c *fiber.Ctx, logString []byte) {
|
||||
if c.Response().StatusCode() != fiber.StatusOK {
|
||||
reporter.SendToSlack(logString)
|
||||
}
|
||||
},
|
||||
}))
|
||||
|
||||
// Disable colors when outputting to default format
|
||||
app.Use(logger.New(logger.Config{
|
||||
DisableColors: true,
|
||||
}))
|
||||
```
|
||||
|
||||
## Config
|
||||
|
||||
### Config
|
||||
|
||||
| Property | Type | Description | Default |
|
||||
|:-----------------|:---------------------------|:---------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------|
|
||||
| Next | `func(*fiber.Ctx) bool` | Next defines a function to skip this middleware when returned true. | `nil` |
|
||||
| Done | `func(*fiber.Ctx, []byte)` | Done is a function that is called after the log string for a request is written to Output, and pass the log string as parameter. | `nil` |
|
||||
| CustomTags | `map[string]LogFunc` | tagFunctions defines the custom tag action. | `map[string]LogFunc` |
|
||||
| Format | `string` | Format defines the logging tags. | `[${time}] ${status} - ${latency} ${method} ${path}\n` |
|
||||
| TimeFormat | `string` | TimeFormat defines the time format for log timestamps. | `15:04:05` |
|
||||
| TimeZone | `string` | TimeZone can be specified, such as "UTC" and "America/New_York" and "Asia/Chongqing", etc | `"Local"` |
|
||||
| TimeInterval | `time.Duration` | TimeInterval is the delay before the timestamp is updated. | `500 * time.Millisecond` |
|
||||
| Output | `io.Writer` | Output is a writer where logs are written. | `os.Stdout` |
|
||||
| DisableColors | `bool` | DisableColors defines if the logs output should be colorized. | `false` |
|
||||
| enableColors | `bool` | Internal field for enabling colors in the log output. (This is not a user-configurable field) | - |
|
||||
| enableLatency | `bool` | Internal field for enabling latency measurement in logs. (This is not a user-configurable field) | - |
|
||||
| timeZoneLocation | `*time.Location` | Internal field for the time zone location. (This is not a user-configurable field) | - |
|
||||
|
||||
## Default Config
|
||||
```go
|
||||
var ConfigDefault = Config{
|
||||
Next: nil,
|
||||
Done: nil,
|
||||
Format: "[${time}] ${status} - ${latency} ${method} ${path}\n",
|
||||
TimeFormat: "15:04:05",
|
||||
TimeZone: "Local",
|
||||
TimeInterval: 500 * time.Millisecond,
|
||||
Output: os.Stdout,
|
||||
DisableColors: false,
|
||||
}
|
||||
```
|
||||
|
||||
## Constants
|
||||
```go
|
||||
// Logger variables
|
||||
const (
|
||||
TagPid = "pid"
|
||||
TagTime = "time"
|
||||
TagReferer = "referer"
|
||||
TagProtocol = "protocol"
|
||||
TagPort = "port"
|
||||
TagIP = "ip"
|
||||
TagIPs = "ips"
|
||||
TagHost = "host"
|
||||
TagMethod = "method"
|
||||
TagPath = "path"
|
||||
TagURL = "url"
|
||||
TagUA = "ua"
|
||||
TagLatency = "latency"
|
||||
TagStatus = "status" // response status
|
||||
TagResBody = "resBody" // response body
|
||||
TagReqHeaders = "reqHeaders"
|
||||
TagQueryStringParams = "queryParams" // request query parameters
|
||||
TagBody = "body" // request body
|
||||
TagBytesSent = "bytesSent"
|
||||
TagBytesReceived = "bytesReceived"
|
||||
TagRoute = "route"
|
||||
TagError = "error"
|
||||
// DEPRECATED: Use TagReqHeader instead
|
||||
TagHeader = "header:" // request header
|
||||
TagReqHeader = "reqHeader:" // request header
|
||||
TagRespHeader = "respHeader:" // response header
|
||||
TagQuery = "query:" // request query
|
||||
TagForm = "form:" // request form
|
||||
TagCookie = "cookie:" // request cookie
|
||||
TagLocals = "locals:"
|
||||
// colors
|
||||
TagBlack = "black"
|
||||
TagRed = "red"
|
||||
TagGreen = "green"
|
||||
TagYellow = "yellow"
|
||||
TagBlue = "blue"
|
||||
TagMagenta = "magenta"
|
||||
TagCyan = "cyan"
|
||||
TagWhite = "white"
|
||||
TagReset = "reset"
|
||||
)
|
||||
```
|
81
docs/api/middleware/monitor.md
Normal file
81
docs/api/middleware/monitor.md
Normal file
@ -0,0 +1,81 @@
|
||||
---
|
||||
id: monitor
|
||||
---
|
||||
|
||||
# Monitor
|
||||
|
||||
Monitor middleware for [Fiber](https://github.com/gofiber/fiber) that reports server metrics, inspired by [express-status-monitor](https://github.com/RafalWilinski/express-status-monitor)
|
||||
|
||||
:::caution
|
||||
|
||||
Monitor is still in beta, API might change in the future!
|
||||
|
||||
:::
|
||||
|
||||
![](https://i.imgur.com/nHAtBpJ.gif)
|
||||
|
||||
### Signatures
|
||||
```go
|
||||
func New() fiber.Handler
|
||||
```
|
||||
|
||||
### Examples
|
||||
Import the middleware package that is part of the Fiber web framework
|
||||
|
||||
```go
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/monitor"
|
||||
)
|
||||
```
|
||||
|
||||
After you initiate your Fiber app, you can use the following possibilities:
|
||||
```go
|
||||
// Initialize default config (Assign the middleware to /metrics)
|
||||
app.Get("/metrics", monitor.New())
|
||||
|
||||
// Or extend your config for customization
|
||||
// Assign the middleware to /metrics
|
||||
// and change the Title to `MyService Metrics Page`
|
||||
app.Get("/metrics", monitor.New(monitor.Config{Title: "MyService Metrics Page"}))
|
||||
```
|
||||
You can also access the API endpoint with
|
||||
`curl -X GET -H "Accept: application/json" http://localhost:3000/metrics` which returns:
|
||||
```json
|
||||
{"pid":{ "cpu":0.4568381746582226, "ram":20516864, "conns":3 },
|
||||
"os": { "cpu":8.759124087593099, "ram":3997155328, "conns":44,
|
||||
"total_ram":8245489664, "load_avg":0.51 }}
|
||||
```
|
||||
|
||||
## Config
|
||||
|
||||
| Property | Type | Description | Default |
|
||||
|:-----------|:------------------------|:--------------------------------------------------------------------|:----------------------------------------------------------------------------|
|
||||
| Title | `string` | Metrics page title | "Fiber Monitor" |
|
||||
| Refresh | `time.Duration` | Refresh period | 3 seconds |
|
||||
| APIOnly | `bool` | Whether the service should expose only the monitoring API | false |
|
||||
| Next | `func(*fiber.Ctx) bool` | Next defines a function to skip this middleware when returned true. | `nil` |
|
||||
| CustomHead | `string` | Custom HTML Code to Head Section(Before End) | empty |
|
||||
| FontURL | `string` | FontURL for specify font resource path or URL | "https://fonts.googleapis.com/css2?family=Roboto:wght@400;900&display=swap" |
|
||||
| ChartJsURL | `string` | ChartJsURL for specify ChartJS library path or URL | "https://cdn.jsdelivr.net/npm/chart.js@2.9/dist/Chart.bundle.min.js" |
|
||||
|
||||
## Default Config
|
||||
|
||||
```go
|
||||
var ConfigDefault = Config{
|
||||
Title: defaultTitle,
|
||||
Refresh: defaultRefresh,
|
||||
FontURL: defaultFontURL,
|
||||
ChartJsURL: defaultChartJSURL,
|
||||
CustomHead: defaultCustomHead,
|
||||
APIOnly: false,
|
||||
Next: nil,
|
||||
index: newIndex(viewBag{
|
||||
defaultTitle,
|
||||
defaultRefresh,
|
||||
defaultFontURL,
|
||||
defaultChartJSURL,
|
||||
defaultCustomHead,
|
||||
}),
|
||||
}
|
||||
```
|
53
docs/api/middleware/pprof.md
Normal file
53
docs/api/middleware/pprof.md
Normal file
@ -0,0 +1,53 @@
|
||||
---
|
||||
id: pprof
|
||||
---
|
||||
|
||||
# Pprof
|
||||
|
||||
Pprof middleware for [Fiber](https://github.com/gofiber/fiber) that serves via its HTTP server runtime profiling data in the format expected by the pprof visualization tool. The package is typically only imported for the side effect of registering its HTTP handlers. The handled paths all begin with /debug/pprof/.
|
||||
|
||||
## Signatures
|
||||
|
||||
```go
|
||||
func New() fiber.Handler
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
Import the middleware package that is part of the Fiber web framework
|
||||
|
||||
```go
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/pprof"
|
||||
)
|
||||
```
|
||||
|
||||
After you initiate your Fiber app, you can use the following possibilities:
|
||||
|
||||
```go
|
||||
// Initialize default config
|
||||
app.Use(pprof.New())
|
||||
|
||||
// Or extend your config for customization
|
||||
|
||||
// For example, in systems where you have multiple ingress endpoints, it is common to add a URL prefix, like so:
|
||||
app.Use(pprof.New(pprof.Config{Prefix: "/endpoint-prefix"}))
|
||||
|
||||
// This prefix will be added to the default path of "/debug/pprof/", for a resulting URL of: "/endpoint-prefix/debug/pprof/".
|
||||
```
|
||||
|
||||
## Config
|
||||
|
||||
| Property | Type | Description | Default |
|
||||
|:---------|:------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------|:--------|
|
||||
| Next | `func(*fiber.Ctx) bool` | Next defines a function to skip this middleware when returned true. | `nil` |
|
||||
| Prefix | `string` | Prefix defines a URL prefix added before "/debug/pprof". Note that it should start with (but not end with) a slash. Example: "/federated-fiber" | "" |
|
||||
|
||||
## Default Config
|
||||
|
||||
```go
|
||||
var ConfigDefault = Config{
|
||||
Next: nil,
|
||||
}
|
||||
```
|
165
docs/api/middleware/proxy.md
Normal file
165
docs/api/middleware/proxy.md
Normal file
@ -0,0 +1,165 @@
|
||||
---
|
||||
id: proxy
|
||||
---
|
||||
|
||||
# Proxy
|
||||
|
||||
Proxy middleware for [Fiber](https://github.com/gofiber/fiber) that allows you to proxy requests to multiple servers.
|
||||
|
||||
## Signatures
|
||||
|
||||
```go
|
||||
// Balancer create a load balancer among multiple upstrem servers.
|
||||
func Balancer(config Config) fiber.Handler
|
||||
// Forward performs the given http request and fills the given http response.
|
||||
func Forward(addr string, clients ...*fasthttp.Client) fiber.Handler
|
||||
// Do performs the given http request and fills the given http response.
|
||||
func Do(c *fiber.Ctx, addr string, clients ...*fasthttp.Client) error
|
||||
// DoRedirects performs the given http request and fills the given http response while following up to maxRedirectsCount redirects.
|
||||
func DoRedirects(c *fiber.Ctx, addr string, maxRedirectsCount int, clients ...*fasthttp.Client) error
|
||||
// DoDeadline performs the given request and waits for response until the given deadline.
|
||||
func DoDeadline(c *fiber.Ctx, addr string, deadline time.Time, clients ...*fasthttp.Client) error
|
||||
// DoTimeout performs the given request and waits for response during the given timeout duration.
|
||||
func DoTimeout(c *fiber.Ctx, addr string, timeout time.Duration, clients ...*fasthttp.Client) error
|
||||
// DomainForward the given http request based on the given domain and fills the given http response
|
||||
func DomainForward(hostname string, addr string, clients ...*fasthttp.Client) fiber.Handler
|
||||
// BalancerForward performs the given http request based round robin balancer and fills the given http response
|
||||
func BalancerForward(servers []string, clients ...*fasthttp.Client) fiber.Handler
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
Import the middleware package that is part of the Fiber web framework
|
||||
|
||||
```go
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/proxy"
|
||||
)
|
||||
```
|
||||
|
||||
After you initiate your Fiber app, you can use the following possibilities:
|
||||
|
||||
```go
|
||||
// if target https site uses a self-signed certificate, you should
|
||||
// call WithTlsConfig before Do and Forward
|
||||
proxy.WithTlsConfig(&tls.Config{
|
||||
InsecureSkipVerify: true,
|
||||
})
|
||||
// if you need to use global self-custom client, you should use proxy.WithClient.
|
||||
proxy.WithClient(&fasthttp.Client{
|
||||
NoDefaultUserAgentHeader: true,
|
||||
DisablePathNormalizing: true,
|
||||
})
|
||||
|
||||
// Forward to url
|
||||
app.Get("/gif", proxy.Forward("https://i.imgur.com/IWaBepg.gif"))
|
||||
|
||||
// If you want to forward with a specific domain. You have to use proxy.DomainForward.
|
||||
app.Get("/payments", proxy.DomainForward("docs.gofiber.io", "http://localhost:8000"))
|
||||
|
||||
// Forward to url with local custom client
|
||||
app.Get("/gif", proxy.Forward("https://i.imgur.com/IWaBepg.gif", &fasthttp.Client{
|
||||
NoDefaultUserAgentHeader: true,
|
||||
DisablePathNormalizing: true,
|
||||
}))
|
||||
|
||||
// Make request within handler
|
||||
app.Get("/:id", func(c *fiber.Ctx) error {
|
||||
url := "https://i.imgur.com/"+c.Params("id")+".gif"
|
||||
if err := proxy.Do(c, url); err != nil {
|
||||
return err
|
||||
}
|
||||
// Remove Server header from response
|
||||
c.Response().Header.Del(fiber.HeaderServer)
|
||||
return nil
|
||||
})
|
||||
|
||||
// Make proxy requests while following redirects
|
||||
app.Get("/proxy", func(c *fiber.Ctx) error {
|
||||
if err := proxy.DoRedirects(c, "http://google.com", 3); err != nil {
|
||||
return err
|
||||
}
|
||||
// Remove Server header from response
|
||||
c.Response().Header.Del(fiber.HeaderServer)
|
||||
return nil
|
||||
})
|
||||
|
||||
// Make proxy requests and wait up to 5 seconds before timing out
|
||||
app.Get("/proxy", func(c *fiber.Ctx) error {
|
||||
if err := proxy.DoTimeout(c, "http://localhost:3000", time.Second * 5); err != nil {
|
||||
return err
|
||||
}
|
||||
// Remove Server header from response
|
||||
c.Response().Header.Del(fiber.HeaderServer)
|
||||
return nil
|
||||
})
|
||||
|
||||
// Make proxy requests, timeout a minute from now
|
||||
app.Get("/proxy", func(c *fiber.Ctx) error {
|
||||
if err := proxy.DoDeadline(c, "http://localhost", time.Now().Add(time.Minute)); err != nil {
|
||||
return err
|
||||
}
|
||||
// Remove Server header from response
|
||||
c.Response().Header.Del(fiber.HeaderServer)
|
||||
return nil
|
||||
})
|
||||
|
||||
// Minimal round robin balancer
|
||||
app.Use(proxy.Balancer(proxy.Config{
|
||||
Servers: []string{
|
||||
"http://localhost:3001",
|
||||
"http://localhost:3002",
|
||||
"http://localhost:3003",
|
||||
},
|
||||
}))
|
||||
|
||||
// Or extend your balancer for customization
|
||||
app.Use(proxy.Balancer(proxy.Config{
|
||||
Servers: []string{
|
||||
"http://localhost:3001",
|
||||
"http://localhost:3002",
|
||||
"http://localhost:3003",
|
||||
},
|
||||
ModifyRequest: func(c *fiber.Ctx) error {
|
||||
c.Request().Header.Add("X-Real-IP", c.IP())
|
||||
return nil
|
||||
},
|
||||
ModifyResponse: func(c *fiber.Ctx) error {
|
||||
c.Response().Header.Del(fiber.HeaderServer)
|
||||
return nil
|
||||
},
|
||||
}))
|
||||
|
||||
// Or this way if the balancer is using https and the destination server is only using http.
|
||||
app.Use(proxy.BalancerForward([]string{
|
||||
"http://localhost:3001",
|
||||
"http://localhost:3002",
|
||||
"http://localhost:3003",
|
||||
}))
|
||||
```
|
||||
|
||||
## Config
|
||||
|
||||
| Property | Type | Description | Default |
|
||||
|:----------------|:-----------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:----------------|
|
||||
| Next | `func(*fiber.Ctx) bool` | Next defines a function to skip this middleware when returned true. | `nil` |
|
||||
| Servers | `[]string` | Servers defines a list of `<scheme>://<host>` HTTP servers, which are used in a round-robin manner. i.e.: "https://foobar.com, http://www.foobar.com" | (Required) |
|
||||
| ModifyRequest | `fiber.Handler` | ModifyRequest allows you to alter the request. | `nil` |
|
||||
| ModifyResponse | `fiber.Handler` | ModifyResponse allows you to alter the response. | `nil` |
|
||||
| Timeout | `time.Duration` | Timeout is the request timeout used when calling the proxy client. | 1 second |
|
||||
| ReadBufferSize | `int` | Per-connection buffer size for requests' reading. This also limits the maximum header size. Increase this buffer if your clients send multi-KB RequestURIs and/or multi-KB headers (for example, BIG cookies). | (Not specified) |
|
||||
| WriteBufferSize | `int` | Per-connection buffer size for responses' writing. | (Not specified) |
|
||||
| TlsConfig | `*tls.Config` (or `*fasthttp.TLSConfig` in v3) | TLS config for the HTTP client. | `nil` |
|
||||
| Client | `*fasthttp.LBClient` | Client is a custom client when client config is complex. | `nil` |
|
||||
|
||||
## Default Config
|
||||
|
||||
```go
|
||||
var ConfigDefault = Config{
|
||||
Next: nil,
|
||||
ModifyRequest: nil,
|
||||
ModifyResponse: nil,
|
||||
Timeout: fasthttp.DefaultLBClientTimeout,
|
||||
}
|
||||
```
|
54
docs/api/middleware/recover.md
Normal file
54
docs/api/middleware/recover.md
Normal file
@ -0,0 +1,54 @@
|
||||
---
|
||||
id: recover
|
||||
---
|
||||
|
||||
# Recover
|
||||
|
||||
Recover middleware for [Fiber](https://github.com/gofiber/fiber) that recovers from panics anywhere in the stack chain and handles the control to the centralized [ErrorHandler](https://docs.gofiber.io/guide/error-handling).
|
||||
|
||||
## Signatures
|
||||
|
||||
```go
|
||||
func New(config ...Config) fiber.Handler
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
Import the middleware package that is part of the Fiber web framework
|
||||
|
||||
```go
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/recover"
|
||||
)
|
||||
```
|
||||
|
||||
After you initiate your Fiber app, you can use the following possibilities:
|
||||
|
||||
```go
|
||||
// Initialize default config
|
||||
app.Use(recover.New())
|
||||
|
||||
// This panic will be caught by the middleware
|
||||
app.Get("/", func(c *fiber.Ctx) error {
|
||||
panic("I'm an error")
|
||||
})
|
||||
```
|
||||
|
||||
## Config
|
||||
|
||||
| Property | Type | Description | Default |
|
||||
|:------------------|:--------------------------------|:--------------------------------------------------------------------|:-------------------------|
|
||||
| Next | `func(*fiber.Ctx) bool` | Next defines a function to skip this middleware when returned true. | `nil` |
|
||||
| EnableStackTrace | `bool` | EnableStackTrace enables handling stack trace. | `false` |
|
||||
| StackTraceHandler | `func(*fiber.Ctx, interface{})` | StackTraceHandler defines a function to handle stack trace. | defaultStackTraceHandler |
|
||||
|
||||
## Default Config
|
||||
|
||||
```go
|
||||
var ConfigDefault = Config{
|
||||
Next: nil,
|
||||
EnableStackTrace: false,
|
||||
StackTraceHandler: defaultStackTraceHandler,
|
||||
}
|
||||
```
|
68
docs/api/middleware/redirect.md
Normal file
68
docs/api/middleware/redirect.md
Normal file
@ -0,0 +1,68 @@
|
||||
---
|
||||
id: redirect
|
||||
---
|
||||
|
||||
# Redirect
|
||||
|
||||
Redirection middleware for Fiber.
|
||||
|
||||
## Signatures
|
||||
|
||||
```go
|
||||
func New(config ...Config) fiber.Handler
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/redirect"
|
||||
)
|
||||
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
app.Use(redirect.New(redirect.Config{
|
||||
Rules: map[string]string{
|
||||
"/old": "/new",
|
||||
"/old/*": "/new/$1",
|
||||
},
|
||||
StatusCode: 301,
|
||||
}))
|
||||
|
||||
app.Get("/new", func(c *fiber.Ctx) error {
|
||||
return c.SendString("Hello, World!")
|
||||
})
|
||||
app.Get("/new/*", func(c *fiber.Ctx) error {
|
||||
return c.SendString("Wildcard: " + c.Params("*"))
|
||||
})
|
||||
|
||||
app.Listen(":3000")
|
||||
}
|
||||
```
|
||||
|
||||
**Test:**
|
||||
|
||||
```curl
|
||||
curl http://localhost:3000/old
|
||||
curl http://localhost:3000/old/hello
|
||||
```
|
||||
|
||||
## Config
|
||||
|
||||
| Property | Type | Description | Default |
|
||||
|:-----------|:------------------------|:---------------------------------------------------------------------------------------------------------------------------|:-----------------------|
|
||||
| Next | `func(*fiber.Ctx) bool` | Filter defines a function to skip middleware. | `nil` |
|
||||
| Rules | `map[string]string` | Rules defines the URL path rewrite rules. The values captured in asterisk can be retrieved by index e.g. $1, $2 and so on. | Required |
|
||||
| StatusCode | `int` | The status code when redirecting. This is ignored if Redirect is disabled. | 302 Temporary Redirect |
|
||||
|
||||
## Default Config
|
||||
|
||||
```go
|
||||
var ConfigDefault = Config{
|
||||
StatusCode: fiber.StatusFound,
|
||||
}
|
||||
```
|
62
docs/api/middleware/requestid.md
Normal file
62
docs/api/middleware/requestid.md
Normal file
@ -0,0 +1,62 @@
|
||||
---
|
||||
id: requestid
|
||||
---
|
||||
|
||||
# RequestID
|
||||
|
||||
RequestID middleware for [Fiber](https://github.com/gofiber/fiber) that adds an indentifier to the response.
|
||||
|
||||
## Signatures
|
||||
|
||||
```go
|
||||
func New(config ...Config) fiber.Handler
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
Import the middleware package that is part of the Fiber web framework
|
||||
|
||||
```go
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/requestid"
|
||||
)
|
||||
```
|
||||
|
||||
After you initiate your Fiber app, you can use the following possibilities:
|
||||
|
||||
```go
|
||||
// Initialize default config
|
||||
app.Use(requestid.New())
|
||||
|
||||
// Or extend your config for customization
|
||||
app.Use(requestid.New(requestid.Config{
|
||||
Header: "X-Custom-Header",
|
||||
Generator: func() string {
|
||||
return "static-id"
|
||||
},
|
||||
}))
|
||||
```
|
||||
|
||||
## Config
|
||||
|
||||
| Property | Type | Description | Default |
|
||||
|:-----------|:------------------------|:--------------------------------------------------------------------------------------------------|:---------------|
|
||||
| Next | `func(*fiber.Ctx) bool` | Next defines a function to skip this middleware when returned true. | `nil` |
|
||||
| Header | `string` | Header is the header key where to get/set the unique request ID. | "X-Request-ID" |
|
||||
| Generator | `func() string` | Generator defines a function to generate the unique identifier. | utils.UUID |
|
||||
| ContextKey | `interface{}` | ContextKey defines the key used when storing the request ID in the locals for a specific request. | "requestid" |
|
||||
|
||||
## Default Config
|
||||
The default config uses a fast UUID generator which will expose the number of
|
||||
requests made to the server. To conceal this value for better privacy, use the
|
||||
`utils.UUIDv4` generator.
|
||||
|
||||
```go
|
||||
var ConfigDefault = Config{
|
||||
Next: nil,
|
||||
Header: fiber.HeaderXRequestID,
|
||||
Generator: utils.UUID,
|
||||
ContextKey: "requestid",
|
||||
}
|
||||
```
|
58
docs/api/middleware/rewrite.md
Normal file
58
docs/api/middleware/rewrite.md
Normal file
@ -0,0 +1,58 @@
|
||||
---
|
||||
id: rewrite
|
||||
---
|
||||
|
||||
# Rewrite
|
||||
|
||||
Rewrite middleware rewrites the URL path based on provided rules. It can be helpful for backward compatibility or just creating cleaner and more descriptive links.
|
||||
|
||||
## Signatures
|
||||
|
||||
```go
|
||||
func New(config ...Config) fiber.Handler
|
||||
```
|
||||
|
||||
## Config
|
||||
|
||||
| Property | Type | Description | Default |
|
||||
|:---------|:------------------------|:-----------------------------------------------------------------------------------------------------|:-----------|
|
||||
| Next | `func(*fiber.Ctx) bool` | Next defines a function to skip middleware. | `nil` |
|
||||
| Rules | `map[string]string` | Rules defines the URL path rewrite rules. The values captured in asterisk can be retrieved by index. | (Required) |
|
||||
|
||||
### Examples
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/rewrite"
|
||||
)
|
||||
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
app.Use(rewrite.New(rewrite.Config{
|
||||
Rules: map[string]string{
|
||||
"/old": "/new",
|
||||
"/old/*": "/new/$1",
|
||||
},
|
||||
}))
|
||||
|
||||
app.Get("/new", func(c *fiber.Ctx) error {
|
||||
return c.SendString("Hello, World!")
|
||||
})
|
||||
app.Get("/new/*", func(c *fiber.Ctx) error {
|
||||
return c.SendString("Wildcard: " + c.Params("*"))
|
||||
})
|
||||
|
||||
app.Listen(":3000")
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
**Test:**
|
||||
|
||||
```curl
|
||||
curl http://localhost:3000/old
|
||||
curl http://localhost:3000/old/hello
|
||||
```
|
137
docs/api/middleware/session.md
Normal file
137
docs/api/middleware/session.md
Normal file
@ -0,0 +1,137 @@
|
||||
---
|
||||
id: session
|
||||
---
|
||||
|
||||
# Session
|
||||
|
||||
Session middleware for [Fiber](https://github.com/gofiber/fiber).
|
||||
|
||||
:::note
|
||||
This middleware uses our [Storage](https://github.com/gofiber/storage) package to support various databases through a single interface. The default configuration for this middleware saves data to memory, see the examples below for other databases.
|
||||
:::
|
||||
|
||||
## Signatures
|
||||
|
||||
```go
|
||||
func New(config ...Config) *Store
|
||||
func (s *Store) RegisterType(i interface{})
|
||||
func (s *Store) Get(c *fiber.Ctx) (*Session, error)
|
||||
func (s *Store) Reset() error
|
||||
|
||||
func (s *Session) Get(key string) interface{}
|
||||
func (s *Session) Set(key string, val interface{})
|
||||
func (s *Session) Delete(key string)
|
||||
func (s *Session) Destroy() error
|
||||
func (s *Session) Regenerate() error
|
||||
func (s *Session) Save() error
|
||||
func (s *Session) Fresh() bool
|
||||
func (s *Session) ID() string
|
||||
func (s *Session) Keys() []string
|
||||
```
|
||||
|
||||
:::caution
|
||||
Storing `interface{}` values are limited to built-ins Go types.
|
||||
:::
|
||||
|
||||
## Examples
|
||||
Import the middleware package that is part of the Fiber web framework
|
||||
```go
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/session"
|
||||
)
|
||||
```
|
||||
|
||||
After you initiate your Fiber app, you can use the following possibilities:
|
||||
|
||||
```go
|
||||
// Initialize default config
|
||||
// This stores all of your app's sessions
|
||||
store := session.New()
|
||||
|
||||
app.Get("/", func(c *fiber.Ctx) error {
|
||||
// Get session from storage
|
||||
sess, err := store.Get(c)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// Get value
|
||||
name := sess.Get("name")
|
||||
|
||||
// Set key/value
|
||||
sess.Set("name", "john")
|
||||
|
||||
// Get all Keys
|
||||
keys := sess.Keys()
|
||||
|
||||
// Delete key
|
||||
sess.Delete("name")
|
||||
|
||||
// Destroy session
|
||||
if err := sess.Destroy(); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// Sets a specific expiration for this session
|
||||
sess.SetExpiry(time.Second * 2)
|
||||
|
||||
// Save session
|
||||
if err := sess.Save(); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
return c.SendString(fmt.Sprintf("Welcome %v", name))
|
||||
})
|
||||
```
|
||||
|
||||
## Config
|
||||
|
||||
| Property | Type | Description | Default |
|
||||
|:------------------------|:----------------|:------------------------------------------------------------------------------------------------------------|:----------------------|
|
||||
| Expiration | `time.Duration` | Allowed session duration. | `24 * time.Hour` |
|
||||
| Storage | `fiber.Storage` | Storage interface to store the session data. | `memory.New()` |
|
||||
| KeyLookup | `string` | KeyLookup is a string in the form of "`<source>:<name>`" that is used to extract session id from the request. | `"cookie:session_id"` |
|
||||
| CookieDomain | `string` | Domain of the cookie. | `""` |
|
||||
| CookiePath | `string` | Path of the cookie. | `""` |
|
||||
| CookieSecure | `bool` | Indicates if cookie is secure. | `false` |
|
||||
| CookieHTTPOnly | `bool` | Indicates if cookie is HTTP only. | `false` |
|
||||
| CookieSameSite | `string` | Value of SameSite cookie. | `"Lax"` |
|
||||
| CookieSessionOnly | `bool` | Decides whether cookie should last for only the browser session. Ignores Expiration if set to true. | `false` |
|
||||
| KeyGenerator | `func() string` | KeyGenerator generates the session key. | `utils.UUIDv4` |
|
||||
| CookieName (Deprecated) | `string` | Deprecated: Please use KeyLookup. The session name. | `""` |
|
||||
|
||||
## Default Config
|
||||
|
||||
```go
|
||||
var ConfigDefault = Config{
|
||||
Expiration: 24 * time.Hour,
|
||||
KeyLookup: "cookie:session_id",
|
||||
KeyGenerator: utils.UUIDv4,
|
||||
source: "cookie",
|
||||
sessionName: "session_id",
|
||||
}
|
||||
```
|
||||
|
||||
## Constants
|
||||
|
||||
```go
|
||||
const (
|
||||
SourceCookie Source = "cookie"
|
||||
SourceHeader Source = "header"
|
||||
SourceURLQuery Source = "query"
|
||||
)
|
||||
```
|
||||
|
||||
### Custom Storage/Database
|
||||
|
||||
You can use any storage from our [storage](https://github.com/gofiber/storage/) package.
|
||||
|
||||
```go
|
||||
storage := sqlite3.New() // From github.com/gofiber/storage/sqlite3
|
||||
store := session.New(session.Config{
|
||||
Storage: storage,
|
||||
})
|
||||
```
|
||||
|
||||
To use the store, see the [Examples](#examples).
|
47
docs/api/middleware/skip.md
Normal file
47
docs/api/middleware/skip.md
Normal file
@ -0,0 +1,47 @@
|
||||
---
|
||||
id: skip
|
||||
---
|
||||
|
||||
# Skip
|
||||
|
||||
Skip middleware for [Fiber](https://github.com/gofiber/fiber) that skips a wrapped handler if a predicate is true.
|
||||
|
||||
## Signatures
|
||||
```go
|
||||
func New(handler fiber.Handler, exclude func(c *fiber.Ctx) bool) fiber.Handler
|
||||
```
|
||||
|
||||
## Examples
|
||||
Import the middleware package that is part of the Fiber web framework
|
||||
```go
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/skip"
|
||||
)
|
||||
```
|
||||
|
||||
After you initiate your Fiber app, you can use the following possibilities:
|
||||
|
||||
```go
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
app.Use(skip.New(BasicHandler, func(ctx *fiber.Ctx) bool {
|
||||
return ctx.Method() == fiber.MethodGet
|
||||
}))
|
||||
|
||||
app.Get("/", func(ctx *fiber.Ctx) error {
|
||||
return ctx.SendString("It was a GET request!")
|
||||
})
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
|
||||
func BasicHandler(ctx *fiber.Ctx) error {
|
||||
return ctx.SendString("It was not a GET request!")
|
||||
}
|
||||
```
|
||||
|
||||
:::tip
|
||||
app.Use will handle requests from any route, and any method. In the example above, it will only skip if the method is GET.
|
||||
:::
|
@ -1,22 +1,39 @@
|
||||
# Timeout
|
||||
Timeout middleware for Fiber. As a `fiber.Handler` wrapper, it creates a context with `context.WithTimeout` and pass it in `UserContext`.
|
||||
---
|
||||
id: timeout
|
||||
---
|
||||
|
||||
# Timeout
|
||||
|
||||
There exist two distinct implementations of timeout middleware [Fiber](https://github.com/gofiber/fiber).
|
||||
|
||||
**New**
|
||||
|
||||
Wraps a `fiber.Handler` with a timeout. If the handler takes longer than the given duration to return, the timeout error is set and forwarded to the centralized [ErrorHandler](https://docs.gofiber.io/error-handling).
|
||||
|
||||
:::caution
|
||||
This has been deprecated since it raises race conditions.
|
||||
:::
|
||||
|
||||
**NewWithContext**
|
||||
|
||||
As a `fiber.Handler` wrapper, it creates a context with `context.WithTimeout` and pass it in `UserContext`.
|
||||
|
||||
If the context passed executions (eg. DB ops, Http calls) takes longer than the given duration to return, the timeout error is set and forwarded to the centralized `ErrorHandler`.
|
||||
|
||||
It has no race conditions, ready to use on production.
|
||||
|
||||
### Table of Contents
|
||||
- [Signatures](#signatures)
|
||||
- [Examples](#examples)
|
||||
It does not cancel long running executions. Underlying executions must handle timeout by using `context.Context` parameter.
|
||||
|
||||
## Signatures
|
||||
|
||||
### Signatures
|
||||
```go
|
||||
func New(handler fiber.Handler, timeout time.Duration, timeoutErrors ...error) fiber.Handler
|
||||
func NewWithContext(handler fiber.Handler, timeout time.Duration, timeoutErrors ...error) fiber.Handler
|
||||
```
|
||||
|
||||
### Examples
|
||||
## Examples
|
||||
|
||||
Import the middleware package that is part of the Fiber web framework
|
||||
|
||||
```go
|
||||
import (
|
||||
"github.com/gofiber/fiber/v3"
|
||||
@ -24,11 +41,17 @@ import (
|
||||
)
|
||||
```
|
||||
|
||||
Sample timeout middleware usage
|
||||
After you initiate your Fiber app, you can use the following possibilities:
|
||||
|
||||
```go
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
<<<<<<< HEAD:middleware/timeout/README.md
|
||||
h := func(c fiber.Ctx) error {
|
||||
=======
|
||||
|
||||
h := func(c *fiber.Ctx) error {
|
||||
>>>>>>> origin/master:docs/api/middleware/timeout.md
|
||||
sleepTime, _ := time.ParseDuration(c.Params("sleepTime") + "ms")
|
||||
if err := sleepWithContext(c.UserContext(), sleepTime); err != nil {
|
||||
return fmt.Errorf("%w: execution error", err)
|
||||
@ -37,11 +60,12 @@ func main() {
|
||||
}
|
||||
|
||||
app.Get("/foo/:sleepTime", timeout.New(h, 2*time.Second))
|
||||
_ = app.Listen(":3000")
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
|
||||
func sleepWithContext(ctx context.Context, d time.Duration) error {
|
||||
timer := time.NewTimer(d)
|
||||
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
if !timer.Stop() {
|
||||
@ -55,17 +79,19 @@ func sleepWithContext(ctx context.Context, d time.Duration) error {
|
||||
```
|
||||
|
||||
Test http 200 with curl:
|
||||
|
||||
```bash
|
||||
curl --location -I --request GET 'http://localhost:3000/foo/1000'
|
||||
```
|
||||
|
||||
Test http 408 with curl:
|
||||
|
||||
```bash
|
||||
curl --location -I --request GET 'http://localhost:3000/foo/3000'
|
||||
```
|
||||
|
||||
Use with custom error:
|
||||
|
||||
When using with custom error:
|
||||
```go
|
||||
var ErrFooTimeOut = errors.New("foo context canceled")
|
||||
|
||||
@ -79,8 +105,8 @@ func main() {
|
||||
return nil
|
||||
}
|
||||
|
||||
app.Get("/foo/:sleepTime", timeout.New(h, 2*time.Second, ErrFooTimeOut))
|
||||
_ = app.Listen(":3000")
|
||||
app.Get("/foo/:sleepTime", timeout.NewWithContext(h, 2*time.Second, ErrFooTimeOut))
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
|
||||
func sleepWithContextWithCustomError(ctx context.Context, d time.Duration) error {
|
||||
@ -96,3 +122,29 @@ func sleepWithContextWithCustomError(ctx context.Context, d time.Duration) error
|
||||
return nil
|
||||
}
|
||||
```
|
||||
|
||||
Sample usage with a DB call:
|
||||
|
||||
```go
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
db, _ := gorm.Open(postgres.Open("postgres://localhost/foodb"), &gorm.Config{})
|
||||
|
||||
handler := func(ctx *fiber.Ctx) error {
|
||||
tran := db.WithContext(ctx.UserContext()).Begin()
|
||||
|
||||
if tran = tran.Exec("SELECT pg_sleep(50)"); tran.Error != nil {
|
||||
return tran.Error
|
||||
}
|
||||
|
||||
if tran = tran.Commit(); tran.Error != nil {
|
||||
return tran.Error
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
app.Get("/foo", timeout.NewWithContext(handler, 10*time.Second))
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
```
|
8
docs/extra/_category_.json
Normal file
8
docs/extra/_category_.json
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"label": "Extra",
|
||||
"position": 4,
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
"description": "Extra contents for Fiber."
|
||||
}
|
||||
}
|
112
docs/extra/benchmarks.md
Normal file
112
docs/extra/benchmarks.md
Normal file
@ -0,0 +1,112 @@
|
||||
---
|
||||
id: benchmarks
|
||||
title: 📊 Benchmarks
|
||||
description: >-
|
||||
These benchmarks aim to compare the performance of Fiber and other web
|
||||
frameworks.
|
||||
sidebar_position: 2
|
||||
---
|
||||
|
||||
## TechEmpower
|
||||
|
||||
[TechEmpower](https://www.techempower.com/benchmarks/#section=data-r19&hw=ph&test=composite) provides a performance comparison of many web application frameworks executing fundamental tasks such as JSON serialization, database access, and server-side template composition.
|
||||
|
||||
Each framework is operating in a realistic production configuration. Results are captured on cloud instances and on physical hardware. The test implementations are largely community-contributed and all source is available at the [GitHub repository](https://github.com/TechEmpower/FrameworkBenchmarks).
|
||||
|
||||
* Fiber `v1.10.0`
|
||||
* 28 HT Cores Intel\(R\) Xeon\(R\) Gold 5120 CPU @ 2.20GHz
|
||||
* 32GB RAM
|
||||
* Ubuntu 18.04.3 4.15.0-88-generic
|
||||
* Dedicated Cisco 10-Gbit Ethernet switch.
|
||||
|
||||
### Plaintext
|
||||
|
||||
The Plaintext test is an exercise of the request-routing fundamentals only, designed to demonstrate the capacity of high-performance platforms in particular. Requests will be sent using HTTP pipelining. The response payload is still small, meaning good performance is still necessary in order to saturate the gigabit Ethernet of the test environment.
|
||||
|
||||
See [Plaintext requirements](https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#single-database-query)
|
||||
|
||||
**Fiber** - **6,162,556** responses per second with an average latency of **2.0** ms.
|
||||
**Express** - **367,069** responses per second with an average latency of **354.1** ms.
|
||||
|
||||
![](/img/plaintext.png)
|
||||
|
||||
![Fiber vs Express](/img/plaintext_express.png)
|
||||
|
||||
### Data Updates
|
||||
|
||||
**Fiber** handled **11,846** responses per second with an average latency of **42.8** ms.
|
||||
**Express** handled **2,066** responses per second with an average latency of **390.44** ms.
|
||||
|
||||
![](/img/data_updates.png)
|
||||
|
||||
![Fiber vs Express](/img/data_updates_express.png)
|
||||
|
||||
### Multiple Queries
|
||||
|
||||
**Fiber** handled **19,664** responses per second with an average latency of **25.7** ms.
|
||||
**Express** handled **4,302** responses per second with an average latency of **117.2** ms.
|
||||
|
||||
![](/img/multiple_queries.png)
|
||||
|
||||
![Fiber vs Express](/img/multiple_queries_express.png)
|
||||
|
||||
### Single Query
|
||||
|
||||
**Fiber** handled **368,647** responses per second with an average latency of **0.7** ms.
|
||||
**Express** handled **57,880** responses per second with an average latency of **4.4** ms.
|
||||
|
||||
![](/img/single_query.png)
|
||||
|
||||
![Fiber vs Express](/img/single_query_express.png)
|
||||
|
||||
### JSON Serialization
|
||||
|
||||
**Fiber** handled **1,146,667** responses per second with an average latency of **0.4** ms.
|
||||
**Express** handled **244,847** responses per second with an average latency of **1.1** ms.
|
||||
|
||||
![](/img/json.png)
|
||||
|
||||
![Fiber vs Express](/img/json_express.png)
|
||||
|
||||
## Go web framework benchmark
|
||||
|
||||
🔗 [https://github.com/smallnest/go-web-framework-benchmark](https://github.com/smallnest/go-web-framework-benchmark)
|
||||
|
||||
* **CPU** Intel\(R\) Xeon\(R\) Gold 6140 CPU @ 2.30GHz
|
||||
* **MEM** 4GB
|
||||
* **GO** go1.13.6 linux/amd64
|
||||
* **OS** Linux
|
||||
|
||||
The first test case is to mock **0 ms**, **10 ms**, **100 ms**, **500 ms** processing time in handlers.
|
||||
|
||||
![](/img/benchmark.png)
|
||||
|
||||
The concurrency clients are **5000**.
|
||||
|
||||
![](/img/benchmark_latency.png)
|
||||
|
||||
Latency is the time of real processing time by web servers. _The smaller is the better._
|
||||
|
||||
![](/img/benchmark_alloc.png)
|
||||
|
||||
Allocs is the heap allocations by web servers when test is running. The unit is MB. _The smaller is the better._
|
||||
|
||||
If we enable **http pipelining**, test result as below:
|
||||
|
||||
![](/img/benchmark-pipeline.png)
|
||||
|
||||
Concurrency test in **30 ms** processing time, the test result for **100**, **1000**, **5000** clients is:
|
||||
|
||||
![](/img/concurrency.png)
|
||||
|
||||
![](/img/concurrency_latency.png)
|
||||
|
||||
![](/img/concurrency_alloc.png)
|
||||
|
||||
If we enable **http pipelining**, test result as below:
|
||||
|
||||
![](/img/concurrency-pipeline.png)
|
||||
|
||||
Dependency graph for `v1.9.0`
|
||||
|
||||
![](/img/graph.svg)
|
169
docs/extra/faq.md
Normal file
169
docs/extra/faq.md
Normal file
@ -0,0 +1,169 @@
|
||||
---
|
||||
id: faq
|
||||
title: 🤔 FAQ
|
||||
description: >-
|
||||
List of frequently asked questions. Feel free to open an issue to add your
|
||||
question to this page.
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
## How should I structure my application?
|
||||
|
||||
There is no definitive answer to this question. The answer depends on the scale of your application and the team that is involved. To be as flexible as possible, Fiber makes no assumptions in terms of structure.
|
||||
|
||||
Routes and other application-specific logic can live in as many files as you wish, in any directory structure you prefer. View the following examples for inspiration:
|
||||
|
||||
* [gofiber/boilerplate](https://github.com/gofiber/boilerplate)
|
||||
* [thomasvvugt/fiber-boilerplate](https://github.com/thomasvvugt/fiber-boilerplate)
|
||||
* [Youtube - Building a REST API using Gorm and Fiber](https://www.youtube.com/watch?v=Iq2qT0fRhAA)
|
||||
* [embedmode/fiberseed](https://github.com/embedmode/fiberseed)
|
||||
|
||||
## How do I handle custom 404 responses?
|
||||
|
||||
If you're using v2.32.0 or later, all you need to do is to implement a custom error handler. See below, or see a more detailed explanation at [Error Handling](../guide/error-handling.md#custom-error-handler).
|
||||
|
||||
If you're using v2.31.0 or earlier, the error handler will not capture 404 errors. Instead, you need to add a middleware function at the very bottom of the stack \(below all other functions\) to handle a 404 response:
|
||||
|
||||
```go title="Example"
|
||||
app.Use(func(c *fiber.Ctx) error {
|
||||
return c.Status(fiber.StatusNotFound).SendString("Sorry can't find that!")
|
||||
})
|
||||
```
|
||||
|
||||
## How can i use live reload ?
|
||||
|
||||
[Air](https://github.com/cosmtrek/air) is a handy tool that automatically restarts your Go applications whenever the source code changes, making your development process faster and more efficient.
|
||||
|
||||
To use Air in a Fiber project, follow these steps:
|
||||
|
||||
1. Install Air by downloading the appropriate binary for your operating system from the GitHub release page or by building the tool directly from source.
|
||||
2. Create a configuration file for Air in your project directory. This file can be named, for example, .air.toml or air.conf. Here's a sample configuration file that works with Fiber:
|
||||
```toml
|
||||
# .air.toml
|
||||
root = "."
|
||||
tmp_dir = "tmp"
|
||||
[build]
|
||||
cmd = "go build -o ./tmp/main ."
|
||||
bin = "./tmp/main"
|
||||
delay = 1000 # ms
|
||||
exclude_dir = ["assets", "tmp", "vendor"]
|
||||
include_ext = ["go", "tpl", "tmpl", "html"]
|
||||
exclude_regex = ["_test\\.go"]
|
||||
```
|
||||
3. Start your Fiber application using Air by running the following command in the terminal:
|
||||
```sh
|
||||
air
|
||||
```
|
||||
|
||||
As you make changes to your source code, Air will detect them and automatically restart the application.
|
||||
|
||||
A complete example demonstrating the use of Air with Fiber can be found in the [Fiber Recipes repository](https://github.com/gofiber/recipes/tree/master/air). This example shows how to configure and use Air in a Fiber project to create an efficient development environment.
|
||||
|
||||
|
||||
## How do I set up an error handler?
|
||||
|
||||
To override the default error handler, you can override the default when providing a [Config](../api/fiber.md#config) when initiating a new [Fiber instance](../api/fiber.md#new).
|
||||
|
||||
```go title="Example"
|
||||
app := fiber.New(fiber.Config{
|
||||
ErrorHandler: func(c *fiber.Ctx, err error) error {
|
||||
return c.Status(fiber.StatusInternalServerError).SendString(err.Error())
|
||||
},
|
||||
})
|
||||
```
|
||||
|
||||
We have a dedicated page explaining how error handling works in Fiber, see [Error Handling](../guide/error-handling.md).
|
||||
|
||||
## Which template engines does Fiber support?
|
||||
|
||||
Fiber currently supports 9 template engines in our [gofiber/template](https://docs.gofiber.io/template/) middleware:
|
||||
|
||||
* [ace](https://docs.gofiber.io/template/ace/)
|
||||
* [amber](https://docs.gofiber.io/template/amber/)
|
||||
* [django](https://docs.gofiber.io/template/django/)
|
||||
* [handlebars](https://docs.gofiber.io/template/handlebars)
|
||||
* [html](https://docs.gofiber.io/template/html)
|
||||
* [jet](https://docs.gofiber.io/template/jet)
|
||||
* [mustache](https://docs.gofiber.io/template/mustache)
|
||||
* [pug](https://docs.gofiber.io/template/pug)
|
||||
* [slim](https://docs.gofiber.io/template/pug)
|
||||
|
||||
To learn more about using Templates in Fiber, see [Templates](../guide/templates.md).
|
||||
|
||||
## Does Fiber have a community chat?
|
||||
|
||||
Yes, we have our own [Discord ](https://gofiber.io/discord)server, where we hang out. We have different rooms for every subject.
|
||||
If you have questions or just want to have a chat, feel free to join us via this **>** [**invite link**](https://gofiber.io/discord) **<**.
|
||||
|
||||
![](/img/support-discord.png)
|
||||
|
||||
## Does fiber support sub domain routing ?
|
||||
|
||||
Yes we do, here are some examples:
|
||||
This example works v2
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/logger"
|
||||
)
|
||||
|
||||
type Host struct {
|
||||
Fiber *fiber.App
|
||||
}
|
||||
|
||||
func main() {
|
||||
// Hosts
|
||||
hosts := map[string]*Host{}
|
||||
//-----
|
||||
// API
|
||||
//-----
|
||||
api := fiber.New()
|
||||
api.Use(logger.New(logger.Config{
|
||||
Format: "[${ip}]:${port} ${status} - ${method} ${path}\n",
|
||||
}))
|
||||
hosts["api.localhost:3000"] = &Host{api}
|
||||
api.Get("/", func(c *fiber.Ctx) error {
|
||||
return c.SendString("API")
|
||||
})
|
||||
//------
|
||||
// Blog
|
||||
//------
|
||||
blog := fiber.New()
|
||||
blog.Use(logger.New(logger.Config{
|
||||
Format: "[${ip}]:${port} ${status} - ${method} ${path}\n",
|
||||
}))
|
||||
hosts["blog.localhost:3000"] = &Host{blog}
|
||||
blog.Get("/", func(c *fiber.Ctx) error {
|
||||
return c.SendString("Blog")
|
||||
})
|
||||
//---------
|
||||
// Website
|
||||
//---------
|
||||
site := fiber.New()
|
||||
site.Use(logger.New(logger.Config{
|
||||
Format: "[${ip}]:${port} ${status} - ${method} ${path}\n",
|
||||
}))
|
||||
|
||||
hosts["localhost:3000"] = &Host{site}
|
||||
site.Get("/", func(c *fiber.Ctx) error {
|
||||
return c.SendString("Website")
|
||||
})
|
||||
// Server
|
||||
app := fiber.New()
|
||||
app.Use(func(c *fiber.Ctx) error {
|
||||
host := hosts[c.Hostname()]
|
||||
if host == nil {
|
||||
return c.SendStatus(fiber.StatusNotFound)
|
||||
} else {
|
||||
host.Fiber.Handler()(c.Context())
|
||||
return nil
|
||||
}
|
||||
})
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
```
|
||||
If more information is needed, please refer to this issue [#750](https://github.com/gofiber/fiber/issues/750)
|
8
docs/guide/_category_.json
Normal file
8
docs/guide/_category_.json
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"label": "Guide",
|
||||
"position": 3,
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
"description": "Guides for Fiber."
|
||||
}
|
||||
}
|
128
docs/guide/error-handling.md
Normal file
128
docs/guide/error-handling.md
Normal file
@ -0,0 +1,128 @@
|
||||
---
|
||||
id: error-handling
|
||||
title: 🐛 Error Handling
|
||||
description: >-
|
||||
Fiber supports centralized error handling by returning an error to the handler
|
||||
which allows you to log errors to external services or send a customized HTTP
|
||||
response to the client.
|
||||
sidebar_position: 4
|
||||
---
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabItem from '@theme/TabItem';
|
||||
|
||||
## Catching Errors
|
||||
|
||||
It’s essential to ensure that Fiber catches all errors that occur while running route handlers and middleware. You must return them to the handler function, where Fiber will catch and process them.
|
||||
|
||||
<Tabs>
|
||||
<TabItem value="example" label="Example">
|
||||
|
||||
```go
|
||||
app.Get("/", func(c *fiber.Ctx) error {
|
||||
// Pass error to Fiber
|
||||
return c.SendFile("file-does-not-exist")
|
||||
})
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
Fiber does not handle [panics](https://go.dev/blog/defer-panic-and-recover) by default. To recover from a panic thrown by any handler in the stack, you need to include the `Recover` middleware below:
|
||||
|
||||
```go title="Example"
|
||||
package main
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/recover"
|
||||
)
|
||||
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
app.Use(recover.New())
|
||||
|
||||
app.Get("/", func(c *fiber.Ctx) error {
|
||||
panic("This panic is caught by fiber")
|
||||
})
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
```
|
||||
|
||||
You could use Fiber's custom error struct to pass an additional `status code` using `fiber.NewError()`. It's optional to pass a message; if this is left empty, it will default to the status code message \(`404` equals `Not Found`\).
|
||||
|
||||
```go title="Example"
|
||||
app.Get("/", func(c *fiber.Ctx) error {
|
||||
// 503 Service Unavailable
|
||||
return fiber.ErrServiceUnavailable
|
||||
|
||||
// 503 On vacation!
|
||||
return fiber.NewError(fiber.StatusServiceUnavailable, "On vacation!")
|
||||
})
|
||||
```
|
||||
|
||||
## Default Error Handler
|
||||
|
||||
Fiber provides an error handler by default. For a standard error, the response is sent as **500 Internal Server Error**. If the error is of type [fiber.Error](https://godoc.org/github.com/gofiber/fiber#Error), the response is sent with the provided status code and message.
|
||||
|
||||
```go title="Example"
|
||||
// Default error handler
|
||||
var DefaultErrorHandler = func(c *fiber.Ctx, err error) error {
|
||||
// Status code defaults to 500
|
||||
code := fiber.StatusInternalServerError
|
||||
|
||||
// Retrieve the custom status code if it's a *fiber.Error
|
||||
var e *fiber.Error
|
||||
if errors.As(err, &e) {
|
||||
code = e.Code
|
||||
}
|
||||
|
||||
// Set Content-Type: text/plain; charset=utf-8
|
||||
c.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8)
|
||||
|
||||
// Return status code with error message
|
||||
return c.Status(code).SendString(err.Error())
|
||||
}
|
||||
```
|
||||
|
||||
## Custom Error Handler
|
||||
|
||||
A custom error handler can be set using a [Config ](../api/fiber.md#config)when initializing a [Fiber instance](../api/fiber.md#new).
|
||||
|
||||
In most cases, the default error handler should be sufficient. However, a custom error handler can come in handy if you want to capture different types of errors and take action accordingly e.g., send a notification email or log an error to the centralized system. You can also send customized responses to the client e.g., error page or just a JSON response.
|
||||
|
||||
The following example shows how to display error pages for different types of errors.
|
||||
|
||||
```go title="Example"
|
||||
// Create a new fiber instance with custom config
|
||||
app := fiber.New(fiber.Config{
|
||||
// Override default error handler
|
||||
ErrorHandler: func(ctx *fiber.Ctx, err error) error {
|
||||
// Status code defaults to 500
|
||||
code := fiber.StatusInternalServerError
|
||||
|
||||
// Retrieve the custom status code if it's a *fiber.Error
|
||||
var e *fiber.Error
|
||||
if errors.As(err, &e) {
|
||||
code = e.Code
|
||||
}
|
||||
|
||||
// Send custom error page
|
||||
err = ctx.Status(code).SendFile(fmt.Sprintf("./%d.html", code))
|
||||
if err != nil {
|
||||
// In case the SendFile fails
|
||||
return ctx.Status(fiber.StatusInternalServerError).SendString("Internal Server Error")
|
||||
}
|
||||
|
||||
// Return from handler
|
||||
return nil
|
||||
},
|
||||
})
|
||||
|
||||
// ...
|
||||
```
|
||||
|
||||
> Special thanks to the [Echo](https://echo.labstack.com/) & [Express](https://expressjs.com/) framework for inspiration regarding error handling.
|
36
docs/guide/faster-fiber.md
Normal file
36
docs/guide/faster-fiber.md
Normal file
@ -0,0 +1,36 @@
|
||||
---
|
||||
id: faster-fiber
|
||||
title: ⚡ Make Fiber Faster
|
||||
sidebar_position: 7
|
||||
---
|
||||
|
||||
## Custom JSON Encoder/Decoder
|
||||
Since Fiber v2.32.0, we use **encoding/json** as default json library due to stability and producibility. However, the standard library is a bit slow compared to 3rd party libraries. If you're not happy with the performance of **encoding/json**, we recommend you to use these libraries:
|
||||
- [goccy/go-json](https://github.com/goccy/go-json)
|
||||
- [bytedance/sonic](https://github.com/bytedance/sonic)
|
||||
- [segmentio/encoding](https://github.com/segmentio/encoding)
|
||||
- [mailru/easyjson](https://github.com/mailru/easyjson)
|
||||
- [minio/simdjson-go](https://github.com/minio/simdjson-go)
|
||||
- [wI2L/jettison](https://github.com/wI2L/jettison)
|
||||
|
||||
```go title="Example"
|
||||
package main
|
||||
|
||||
import "github.com/gofiber/fiber/v2"
|
||||
import "github.com/goccy/go-json"
|
||||
|
||||
func main() {
|
||||
app := fiber.New(fiber.Config{
|
||||
JSONEncoder: json.Marshal,
|
||||
JSONDecoder: json.Unmarshal,
|
||||
})
|
||||
|
||||
# ...
|
||||
}
|
||||
```
|
||||
|
||||
### References
|
||||
- [Set custom JSON encoder for client](../api/client.md#jsonencoder)
|
||||
- [Set custom JSON decoder for client](../api/client.md#jsondecoder)
|
||||
- [Set custom JSON encoder for application](../api/fiber.md#config)
|
||||
- [Set custom JSON decoder for application](../api/fiber.md#config)
|
79
docs/guide/grouping.md
Normal file
79
docs/guide/grouping.md
Normal file
@ -0,0 +1,79 @@
|
||||
---
|
||||
id: grouping
|
||||
title: 🎭 Grouping
|
||||
sidebar_position: 2
|
||||
---
|
||||
|
||||
:::info
|
||||
In general, the Group functionality in Fiber behaves similarly to ExpressJS. Groups are declared virtually and all routes declared within the group are flattened into a single list with a prefix, which is then checked by the framework in the order it was declared. This means that the behavior of Group in Fiber is identical to that of ExpressJS.
|
||||
:::
|
||||
|
||||
## Paths
|
||||
|
||||
Like **Routing**, groups can also have paths that belong to a cluster.
|
||||
|
||||
```go
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
api := app.Group("/api", middleware) // /api
|
||||
|
||||
v1 := api.Group("/v1", middleware) // /api/v1
|
||||
v1.Get("/list", handler) // /api/v1/list
|
||||
v1.Get("/user", handler) // /api/v1/user
|
||||
|
||||
v2 := api.Group("/v2", middleware) // /api/v2
|
||||
v2.Get("/list", handler) // /api/v2/list
|
||||
v2.Get("/user", handler) // /api/v2/user
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
```
|
||||
|
||||
A **Group** of paths can have an optional handler.
|
||||
|
||||
```go
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
api := app.Group("/api") // /api
|
||||
|
||||
v1 := api.Group("/v1") // /api/v1
|
||||
v1.Get("/list", handler) // /api/v1/list
|
||||
v1.Get("/user", handler) // /api/v1/user
|
||||
|
||||
v2 := api.Group("/v2") // /api/v2
|
||||
v2.Get("/list", handler) // /api/v2/list
|
||||
v2.Get("/user", handler) // /api/v2/user
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
```
|
||||
|
||||
:::caution
|
||||
Running **/api**, **/v1** or **/v2** will result in **404** error, make sure you have the errors set.
|
||||
:::
|
||||
|
||||
## Group Handlers
|
||||
|
||||
Group handlers can also be used as a routing path but they must have **Next** added to them so that the flow can continue.
|
||||
|
||||
```go
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
handler := func(c *fiber.Ctx) error {
|
||||
return c.SendStatus(fiber.StatusOK)
|
||||
}
|
||||
api := app.Group("/api") // /api
|
||||
|
||||
v1 := api.Group("/v1", func(c *fiber.Ctx) error { // middleware for /api/v1
|
||||
c.Set("Version", "v1")
|
||||
return c.Next()
|
||||
})
|
||||
v1.Get("/list", handler) // /api/v1/list
|
||||
v1.Get("/user", handler) // /api/v1/user
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
```
|
218
docs/guide/hooks.md
Normal file
218
docs/guide/hooks.md
Normal file
@ -0,0 +1,218 @@
|
||||
---
|
||||
id: hooks
|
||||
title: 🪝 Hooks
|
||||
sidebar_position: 6
|
||||
---
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabItem from '@theme/TabItem';
|
||||
|
||||
With Fiber v2.30.0, you can execute custom user functions when to run some methods. Here is a list of this hooks:
|
||||
- [OnRoute](#onroute)
|
||||
- [OnName](#onname)
|
||||
- [OnGroup](#ongroup)
|
||||
- [OnGroupName](#ongroupname)
|
||||
- [OnListen](#onlisten)
|
||||
- [OnFork](#onfork)
|
||||
- [OnShutdown](#onshutdown)
|
||||
- [OnMount](#onmount)
|
||||
|
||||
## Constants
|
||||
```go
|
||||
// Handlers define a function to create hooks for Fiber.
|
||||
type OnRouteHandler = func(Route) error
|
||||
type OnNameHandler = OnRouteHandler
|
||||
type OnGroupHandler = func(Group) error
|
||||
type OnGroupNameHandler = OnGroupHandler
|
||||
type OnListenHandler = func(ListenData) error
|
||||
type OnForkHandler = func(int) error
|
||||
type OnShutdownHandler = func() error
|
||||
type OnMountHandler = func(*App) error
|
||||
```
|
||||
|
||||
## OnRoute
|
||||
|
||||
OnRoute is a hook to execute user functions on each route registeration. Also you can get route properties by **route** parameter.
|
||||
|
||||
```go title="Signature"
|
||||
func (app *App) OnRoute(handler ...OnRouteHandler)
|
||||
```
|
||||
|
||||
## OnName
|
||||
|
||||
OnName is a hook to execute user functions on each route naming. Also you can get route properties by **route** parameter.
|
||||
|
||||
:::caution
|
||||
OnName only works with naming routes, not groups.
|
||||
:::
|
||||
|
||||
```go title="Signature"
|
||||
func (app *App) OnName(handler ...OnNameHandler)
|
||||
```
|
||||
|
||||
<Tabs>
|
||||
<TabItem value="onname-example" label="OnName Example">
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
)
|
||||
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
app.Get("/", func(c *fiber.Ctx) error {
|
||||
return c.SendString(c.Route().Name)
|
||||
}).Name("index")
|
||||
|
||||
app.Hooks().OnName(func(r fiber.Route) error {
|
||||
fmt.Print("Name: " + r.Name + ", ")
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
app.Hooks().OnName(func(r fiber.Route) error {
|
||||
fmt.Print("Method: " + r.Method + "\n")
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
app.Get("/add/user", func(c *fiber.Ctx) error {
|
||||
return c.SendString(c.Route().Name)
|
||||
}).Name("addUser")
|
||||
|
||||
app.Delete("/destroy/user", func(c *fiber.Ctx) error {
|
||||
return c.SendString(c.Route().Name)
|
||||
}).Name("destroyUser")
|
||||
|
||||
app.Listen(":5000")
|
||||
}
|
||||
|
||||
// Results:
|
||||
// Name: addUser, Method: GET
|
||||
// Name: destroyUser, Method: DELETE
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
## OnGroup
|
||||
|
||||
OnGroup is a hook to execute user functions on each group registeration. Also you can get group properties by **group** parameter.
|
||||
|
||||
```go title="Signature"
|
||||
func (app *App) OnGroup(handler ...OnGroupHandler)
|
||||
```
|
||||
|
||||
## OnGroupName
|
||||
|
||||
OnGroupName is a hook to execute user functions on each group naming. Also you can get group properties by **group** parameter.
|
||||
|
||||
:::caution
|
||||
OnGroupName only works with naming groups, not routes.
|
||||
:::
|
||||
|
||||
```go title="Signature"
|
||||
func (app *App) OnGroupName(handler ...OnGroupNameHandler)
|
||||
```
|
||||
|
||||
## OnListen
|
||||
|
||||
OnListen is a hook to execute user functions on Listen, ListenTLS, Listener.
|
||||
|
||||
```go title="Signature"
|
||||
func (app *App) OnListen(handler ...OnListenHandler)
|
||||
```
|
||||
|
||||
<Tabs>
|
||||
<TabItem value="onlisten-example" label="OnListen Example">
|
||||
|
||||
```go
|
||||
app := fiber.New(fiber.Config{
|
||||
DisableStartupMessage: true,
|
||||
})
|
||||
|
||||
app.Hooks().OnListen(func(listenData fiber.ListenData) error {
|
||||
if fiber.IsChild() {
|
||||
return nil
|
||||
}
|
||||
scheme := "http"
|
||||
if data.TLS {
|
||||
scheme = "https"
|
||||
}
|
||||
log.Println(scheme + "://" + listenData.Host + ":" + listenData.Port)
|
||||
return nil
|
||||
})
|
||||
|
||||
app.Listen(":5000")
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
## OnFork
|
||||
|
||||
OnFork is a hook to execute user functions on Fork.
|
||||
|
||||
```go title="Signature"
|
||||
func (app *App) OnFork(handler ...OnForkHandler)
|
||||
```
|
||||
|
||||
## OnShutdown
|
||||
|
||||
OnShutdown is a hook to execute user functions after Shutdown.
|
||||
|
||||
```go title="Signature"
|
||||
func (app *App) OnShutdown(handler ...OnShutdownHandler)
|
||||
```
|
||||
|
||||
## OnMount
|
||||
|
||||
OnMount is a hook to execute user function after mounting process. The mount event is fired when sub-app is mounted on a parent app. The parent app is passed as a parameter. It works for app and group mounting.
|
||||
|
||||
```go title="Signature"
|
||||
func (h *Hooks) OnMount(handler ...OnMountHandler)
|
||||
```
|
||||
|
||||
<Tabs>
|
||||
<TabItem value="onmount-example" label="OnMount Example">
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
)
|
||||
|
||||
func main() {
|
||||
app := New()
|
||||
app.Get("/", testSimpleHandler).Name("x")
|
||||
|
||||
subApp := New()
|
||||
subApp.Get("/test", testSimpleHandler)
|
||||
|
||||
subApp.Hooks().OnMount(func(parent *fiber.App) error {
|
||||
fmt.Print("Mount path of parent app: "+parent.MountPath())
|
||||
// ...
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
app.Mount("/sub", subApp)
|
||||
}
|
||||
|
||||
// Result:
|
||||
// Mount path of parent app:
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
|
||||
:::caution
|
||||
OnName/OnRoute/OnGroup/OnGroupName hooks are mount-sensitive. If you use one of these routes on sub app and you mount it; paths of routes and groups will start with mount prefix.
|
287
docs/guide/routing.md
Normal file
287
docs/guide/routing.md
Normal file
@ -0,0 +1,287 @@
|
||||
---
|
||||
id: routing
|
||||
title: 🔌 Routing
|
||||
description: >-
|
||||
Routing refers to how an application's endpoints (URIs) respond to client
|
||||
requests.
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabItem from '@theme/TabItem';
|
||||
import RoutingHandler from './../partials/routing/handler.md';
|
||||
|
||||
## Handlers
|
||||
|
||||
<RoutingHandler />
|
||||
|
||||
## Paths
|
||||
|
||||
Route paths, combined with a request method, define the endpoints at which requests can be made. Route paths can be **strings** or **string patterns**.
|
||||
|
||||
**Examples of route paths based on strings**
|
||||
|
||||
```go
|
||||
// This route path will match requests to the root route, "/":
|
||||
app.Get("/", func(c *fiber.Ctx) error {
|
||||
return c.SendString("root")
|
||||
})
|
||||
|
||||
// This route path will match requests to "/about":
|
||||
app.Get("/about", func(c *fiber.Ctx) error {
|
||||
return c.SendString("about")
|
||||
})
|
||||
|
||||
// This route path will match requests to "/random.txt":
|
||||
app.Get("/random.txt", func(c *fiber.Ctx) error {
|
||||
return c.SendString("random.txt")
|
||||
})
|
||||
```
|
||||
|
||||
As with the expressJs framework, the order of the route declaration plays a role.
|
||||
When a request is received, the routes are checked in the order in which they are declared.
|
||||
|
||||
:::info
|
||||
So please be careful to write routes with variable parameters after the routes that contain fixed parts, so that these variable parts do not match instead and unexpected behavior occurs.
|
||||
:::
|
||||
|
||||
## Parameters
|
||||
|
||||
Route parameters are dynamic elements in the route, which are **named** or **not named segments**. This segments that are used to capture the values specified at their position in the URL. The obtained values can be retrieved using the [Params](https://fiber.wiki/context#params) function, with the name of the route parameter specified in the path as their respective keys or for unnamed parameters the character\(\*, +\) and the counter of this.
|
||||
|
||||
The characters :, +, and \* are characters that introduce a parameter.
|
||||
|
||||
Greedy parameters are indicated by wildcard\(\*\) or plus\(+\) signs.
|
||||
|
||||
The routing also offers the possibility to use optional parameters, for the named parameters these are marked with a final "?", unlike the plus sign which is not optional, you can use the wildcard character for a parameter range which is optional and greedy.
|
||||
|
||||
**Example of define routes with route parameters**
|
||||
|
||||
```go
|
||||
// Parameters
|
||||
app.Get("/user/:name/books/:title", func(c *fiber.Ctx) error {
|
||||
fmt.Fprintf(c, "%s\n", c.Params("name"))
|
||||
fmt.Fprintf(c, "%s\n", c.Params("title"))
|
||||
return nil
|
||||
})
|
||||
// Plus - greedy - not optional
|
||||
app.Get("/user/+", func(c *fiber.Ctx) error {
|
||||
return c.SendString(c.Params("+"))
|
||||
})
|
||||
|
||||
// Optional parameter
|
||||
app.Get("/user/:name?", func(c *fiber.Ctx) error {
|
||||
return c.SendString(c.Params("name"))
|
||||
})
|
||||
|
||||
// Wildcard - greedy - optional
|
||||
app.Get("/user/*", func(c *fiber.Ctx) error {
|
||||
return c.SendString(c.Params("*"))
|
||||
})
|
||||
|
||||
// This route path will match requests to "/v1/some/resource/name:customVerb", since the parameter character is escaped
|
||||
app.Get("/v1/some/resource/name\\:customVerb", func(c *fiber.Ctx) error {
|
||||
return c.SendString("Hello, Community")
|
||||
})
|
||||
```
|
||||
|
||||
:::info
|
||||
Since the hyphen \(`-`\) and the dot \(`.`\) are interpreted literally, they can be used along with route parameters for useful purposes.
|
||||
:::
|
||||
|
||||
:::info
|
||||
All special parameter characters can also be escaped with `"\\"` and lose their value, so you can use them in the route if you want, like in the custom methods of the [google api design guide](https://cloud.google.com/apis/design/custom_methods).
|
||||
:::
|
||||
|
||||
```go
|
||||
// http://localhost:3000/plantae/prunus.persica
|
||||
app.Get("/plantae/:genus.:species", func(c *fiber.Ctx) error {
|
||||
fmt.Fprintf(c, "%s.%s\n", c.Params("genus"), c.Params("species"))
|
||||
return nil // prunus.persica
|
||||
})
|
||||
```
|
||||
|
||||
```go
|
||||
// http://localhost:3000/flights/LAX-SFO
|
||||
app.Get("/flights/:from-:to", func(c *fiber.Ctx) error {
|
||||
fmt.Fprintf(c, "%s-%s\n", c.Params("from"), c.Params("to"))
|
||||
return nil // LAX-SFO
|
||||
})
|
||||
```
|
||||
|
||||
Our intelligent router recognizes that the introductory parameter characters should be part of the request route in this case and can process them as such.
|
||||
|
||||
```go
|
||||
// http://localhost:3000/shop/product/color:blue/size:xs
|
||||
app.Get("/shop/product/color::color/size::size", func(c *fiber.Ctx) error {
|
||||
fmt.Fprintf(c, "%s:%s\n", c.Params("color"), c.Params("size"))
|
||||
return nil // blue:xs
|
||||
})
|
||||
```
|
||||
|
||||
In addition, several parameters in a row and several unnamed parameter characters in the route, such as the wildcard or plus character, are possible, which greatly expands the possibilities of the router for the user.
|
||||
|
||||
```go
|
||||
// GET /@v1
|
||||
// Params: "sign" -> "@", "param" -> "v1"
|
||||
app.Get("/:sign:param", handler)
|
||||
|
||||
// GET /api-v1
|
||||
// Params: "name" -> "v1"
|
||||
app.Get("/api-:name", handler)
|
||||
|
||||
// GET /customer/v1/cart/proxy
|
||||
// Params: "*1" -> "customer/", "*2" -> "/cart"
|
||||
app.Get("/*v1*/proxy", handler)
|
||||
|
||||
// GET /v1/brand/4/shop/blue/xs
|
||||
// Params: "*1" -> "brand/4", "*2" -> "blue/xs"
|
||||
app.Get("/v1/*/shop/*", handler)
|
||||
```
|
||||
|
||||
We have adapted the routing strongly to the express routing, but currently without the possibility of the regular expressions, because they are quite slow. The possibilities can be tested with version 0.1.7 \(express 4\) in the online [Express route tester](http://forbeslindesay.github.io/express-route-tester/).
|
||||
|
||||
### Constraints
|
||||
Route constraints execute when a match has occurred to the incoming URL and the URL path is tokenized into route values by parameters. The feature was intorduced in `v2.37.0` and inspired by [.NET Core](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing?view=aspnetcore-6.0#route-constraints).
|
||||
|
||||
:::caution
|
||||
Constraints aren't validation for parameters. If constraint aren't valid for parameter value, Fiber returns **404 handler**.
|
||||
:::
|
||||
|
||||
| Constraint | Example | Example matches |
|
||||
| ----------------- | ------------------------------------ | ------------------------------------------------------------------------------------------- |
|
||||
| int | :id<int\> | 123456789, -123456789 |
|
||||
| bool | :active<bool\> | true,false |
|
||||
| guid | :id<guid\> | CD2C1638-1638-72D5-1638-DEADBEEF1638 |
|
||||
| float | :weight<float\> | 1.234, -1,001.01e8 |
|
||||
| minLen(value) | :username<minLen(4)\> | Test (must be at least 4 characters) |
|
||||
| maxLen(value) | :filename<maxLen(8)\> | MyFile (must be no more than 8 characters |
|
||||
| len(length) | :filename<len(12)\> | somefile.txt (exactly 12 characters) |
|
||||
| min(value) | :age<min(18)\> | 19 (Integer value must be at least 18) |
|
||||
| max(value) | :age<max(120)\> | 91 (Integer value must be no more than 120) |
|
||||
| range(min,max) | :age<range(18,120)\> | 91 (Integer value must be at least 18 but no more than 120) |
|
||||
| alpha | :name<alpha\> | Rick (String must consist of one or more alphabetical characters, a-z and case-insensitive) |
|
||||
| datetime | :dob<datetime(2006\\\\-01\\\\-02)\> | 2005-11-01 |
|
||||
| regex(expression) | :date<regex(\\d{4}-\\d{2}-\\d{2})}\> | 2022-08-27 (Must match regular expression) |
|
||||
|
||||
**Examples**
|
||||
|
||||
<Tabs>
|
||||
<TabItem value="single-constraint" label="Single Constraint">
|
||||
|
||||
```go
|
||||
app.Get("/:test<min(5)>", func(c *fiber.Ctx) error {
|
||||
return c.SendString(c.Params("test"))
|
||||
})
|
||||
|
||||
// curl -X GET http://localhost:3000/12
|
||||
// 12
|
||||
|
||||
// curl -X GET http://localhost:3000/1
|
||||
// Cannot GET /1
|
||||
```
|
||||
</TabItem>
|
||||
<TabItem value="multiple-constraints" label="Multiple Constraints">
|
||||
|
||||
You can use `;` for multiple constraints.
|
||||
```go
|
||||
app.Get("/:test<min(100);maxLen(5)>", func(c *fiber.Ctx) error {
|
||||
return c.SendString(c.Params("test"))
|
||||
})
|
||||
|
||||
// curl -X GET http://localhost:3000/120000
|
||||
// Cannot GET /120000
|
||||
|
||||
// curl -X GET http://localhost:3000/1
|
||||
// Cannot GET /1
|
||||
|
||||
// curl -X GET http://localhost:3000/250
|
||||
// 250
|
||||
```
|
||||
</TabItem>
|
||||
<TabItem value="regex-constraint" label="Regex Constraint">
|
||||
|
||||
Fiber precompiles regex query when to register routes. So there're no performance overhead for regex constraint.
|
||||
```go
|
||||
app.Get("/:date<regex(\\d{4}-\\d{2}-\\d{2})}>", func(c *fiber.Ctx) error {
|
||||
return c.SendString(c.Params("date"))
|
||||
})
|
||||
|
||||
// curl -X GET http://localhost:3000/125
|
||||
// Cannot GET /125
|
||||
|
||||
// curl -X GET http://localhost:3000/test
|
||||
// Cannot GET /test
|
||||
|
||||
// curl -X GET http://localhost:3000/2022-08-27
|
||||
// 2022-08-27
|
||||
```
|
||||
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
:::caution
|
||||
You should use `\\` before routing-specific characters when to use datetime constraint (`*`, `+`, `?`, `:`, `/`, `<`, `>`, `;`, `(`, `)`), to avoid wrong parsing.
|
||||
:::
|
||||
|
||||
**Optional Parameter Example**
|
||||
|
||||
You can impose constraints on optional parameters as well.
|
||||
|
||||
```go
|
||||
app.Get("/:test<int>?", func(c *fiber.Ctx) error {
|
||||
return c.SendString(c.Params("test"))
|
||||
})
|
||||
// curl -X GET http://localhost:3000/42
|
||||
// 42
|
||||
// curl -X GET http://localhost:3000/
|
||||
//
|
||||
// curl -X GET http://localhost:3000/7.0
|
||||
// Cannot GET /7.0
|
||||
```
|
||||
|
||||
## Middleware
|
||||
|
||||
Functions that are designed to make changes to the request or response are called **middleware functions**. The [Next](../api/ctx.md#next) is a **Fiber** router function, when called, executes the **next** function that **matches** the current route.
|
||||
|
||||
**Example of a middleware function**
|
||||
|
||||
```go
|
||||
app.Use(func(c *fiber.Ctx) error {
|
||||
// Set a custom header on all responses:
|
||||
c.Set("X-Custom-Header", "Hello, World")
|
||||
|
||||
// Go to next middleware:
|
||||
return c.Next()
|
||||
})
|
||||
|
||||
app.Get("/", func(c *fiber.Ctx) error {
|
||||
return c.SendString("Hello, World!")
|
||||
})
|
||||
```
|
||||
|
||||
`Use` method path is a **mount**, or **prefix** path, and limits middleware to only apply to any paths requested that begin with it.
|
||||
|
||||
## Grouping
|
||||
|
||||
If you have many endpoints, you can organize your routes using `Group`.
|
||||
|
||||
```go
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
api := app.Group("/api", middleware) // /api
|
||||
|
||||
v1 := api.Group("/v1", middleware) // /api/v1
|
||||
v1.Get("/list", handler) // /api/v1/list
|
||||
v1.Get("/user", handler) // /api/v1/user
|
||||
|
||||
v2 := api.Group("/v2", middleware) // /api/v2
|
||||
v2.Get("/list", handler) // /api/v2/list
|
||||
v2.Get("/user", handler) // /api/v2/user
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
```
|
||||
|
||||
More information about this in our [Grouping Guide](./grouping.md)
|
106
docs/guide/templates.md
Normal file
106
docs/guide/templates.md
Normal file
@ -0,0 +1,106 @@
|
||||
---
|
||||
id: templates
|
||||
title: 📝 Templates
|
||||
description: Fiber supports server-side template engines.
|
||||
sidebar_position: 3
|
||||
---
|
||||
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabItem from '@theme/TabItem';
|
||||
|
||||
## Template interfaces
|
||||
|
||||
Fiber provides a Views interface to provide your own template engine:
|
||||
|
||||
<Tabs>
|
||||
<TabItem value="views" label="Views">
|
||||
|
||||
```go
|
||||
type Views interface {
|
||||
Load() error
|
||||
Render(io.Writer, string, interface{}, ...string) error
|
||||
}
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
`Views` interface contains a `Load` and `Render` method, `Load` is executed by Fiber on app initialization to load/parse the templates.
|
||||
|
||||
```go
|
||||
// Pass engine to Fiber's Views Engine
|
||||
app := fiber.New(fiber.Config{
|
||||
Views: engine,
|
||||
// Views Layout is the global layout for all template render until override on Render function.
|
||||
ViewsLayout: "layouts/main"
|
||||
})
|
||||
```
|
||||
|
||||
The `Render` method is linked to the [**ctx.Render\(\)**](../api/ctx.md#render) function that accepts a template name and binding data. It will use global layout if layout is not being defined in `Render` function.
|
||||
If the Fiber config option `PassLocalsToViews` is enabled, then all locals set using `ctx.Locals(key, value)` will be passed to the template.
|
||||
|
||||
```go
|
||||
app.Get("/", func(c *fiber.Ctx) error {
|
||||
return c.Render("index", fiber.Map{
|
||||
"hello": "world",
|
||||
});
|
||||
})
|
||||
```
|
||||
|
||||
## Engines
|
||||
|
||||
Fiber team maintains [templates](https://docs.gofiber.io/template) package that provides wrappers for multiple template engines:
|
||||
|
||||
* [ace](https://docs.gofiber.io/template/ace/)
|
||||
* [amber](https://docs.gofiber.io/template/amber/)
|
||||
* [django](https://docs.gofiber.io/template/django/)
|
||||
* [handlebars](https://docs.gofiber.io/template/handlebars)
|
||||
* [html](https://docs.gofiber.io/template/html)
|
||||
* [jet](https://docs.gofiber.io/template/jet)
|
||||
* [mustache](https://docs.gofiber.io/template/mustache)
|
||||
* [pug](https://docs.gofiber.io/template/pug)
|
||||
* [slim](https://docs.gofiber.io/template/slim)
|
||||
|
||||
<Tabs>
|
||||
<TabItem value="example" label="Example">
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"log"
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/template/html/v2"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// Initialize standard Go html template engine
|
||||
engine := html.New("./views", ".html")
|
||||
// If you want other engine, just replace with following
|
||||
// Create a new engine with django
|
||||
// engine := django.New("./views", ".django")
|
||||
|
||||
app := fiber.New(fiber.Config{
|
||||
Views: engine,
|
||||
})
|
||||
app.Get("/", func(c *fiber.Ctx) error {
|
||||
// Render index template
|
||||
return c.Render("index", fiber.Map{
|
||||
"Title": "Hello, World!",
|
||||
})
|
||||
})
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
```
|
||||
</TabItem>
|
||||
<TabItem value="index" label="views/index.html">
|
||||
|
||||
```markup
|
||||
<!DOCTYPE html>
|
||||
<body>
|
||||
<h1>{{.Title}}</h1>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
168
docs/guide/validation.md
Normal file
168
docs/guide/validation.md
Normal file
@ -0,0 +1,168 @@
|
||||
---
|
||||
id: validation
|
||||
title: 🔎 Validation
|
||||
sidebar_position: 5
|
||||
---
|
||||
|
||||
## Validator package
|
||||
|
||||
Fiber can make _great_ use of the validator package to ensure correct validation of data to store.
|
||||
|
||||
- [Official validator Github page \(Installation, use, examples..\).](https://github.com/go-playground/validator)
|
||||
|
||||
You can find the detailed descriptions of the _validations_ used in the fields contained on the structs below:
|
||||
|
||||
- [Detailed docs](https://pkg.go.dev/github.com/go-playground/validator?tab=doc)
|
||||
|
||||
```go title="Validation Example"
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"strings"
|
||||
|
||||
"github.com/go-playground/validator/v10"
|
||||
"github.com/gofiber/fiber/v2"
|
||||
)
|
||||
|
||||
type (
|
||||
User struct {
|
||||
Name string `validate:"required,min=5,max=20"` // Required field, min 5 char long max 20
|
||||
Age int `validate:"required,teener"` // Required field, and client needs to implement our 'teener' tag format which we'll see later
|
||||
}
|
||||
|
||||
ErrorResponse struct {
|
||||
Error bool
|
||||
FailedField string
|
||||
Tag string
|
||||
Value interface{}
|
||||
}
|
||||
|
||||
XValidator struct {
|
||||
validator *validator.Validate
|
||||
}
|
||||
|
||||
GlobalErrorHandlerResp struct {
|
||||
Success bool `json:"success"`
|
||||
Message string `json:"message"`
|
||||
}
|
||||
)
|
||||
|
||||
// This is the validator instance
|
||||
// for more information see: https://github.com/go-playground/validator
|
||||
var validate = validator.New()
|
||||
|
||||
func (v XValidator) Validate(data interface{}) []ErrorResponse {
|
||||
validationErrors := []ErrorResponse{}
|
||||
|
||||
errs := validate.Struct(data)
|
||||
if errs != nil {
|
||||
for _, err := range errs.(validator.ValidationErrors) {
|
||||
// In this case data object is actually holding the User struct
|
||||
var elem ErrorResponse
|
||||
|
||||
elem.FailedField = err.Field() // Export struct field name
|
||||
elem.Tag = err.Tag() // Export struct tag
|
||||
elem.Value = err.Value() // Export field value
|
||||
elem.Error = true
|
||||
|
||||
validationErrors = append(validationErrors, elem)
|
||||
}
|
||||
}
|
||||
|
||||
return validationErrors
|
||||
}
|
||||
|
||||
func main() {
|
||||
myValidator := &XValidator{
|
||||
validator: validate,
|
||||
}
|
||||
|
||||
app := fiber.New(fiber.Config{
|
||||
// Global custom error handler
|
||||
ErrorHandler: func(c *fiber.Ctx, err error) error {
|
||||
return c.Status(fiber.StatusBadRequest).JSON(GlobalErrorHandlerResp{
|
||||
Success: false,
|
||||
Message: err.Error(),
|
||||
})
|
||||
},
|
||||
})
|
||||
|
||||
// Custom struct validation tag format
|
||||
myValidator.validator.RegisterValidation("teener", func(fl validator.FieldLevel) bool {
|
||||
// User.Age needs to fit our needs, 12-18 years old.
|
||||
return fl.Field().Int() >= 12 && fl.Field().Int() <= 18
|
||||
})
|
||||
|
||||
app.Get("/", func(c *fiber.Ctx) error {
|
||||
user := &User{
|
||||
Name: c.Query("name"),
|
||||
Age: c.QueryInt("age"),
|
||||
}
|
||||
|
||||
// Validation
|
||||
if errs := myValidator.Validate(user); len(errs) > 0 && errs[0].Error {
|
||||
errMsgs := make([]string, 0)
|
||||
|
||||
for _, err := range errs {
|
||||
errMsgs = append(errMsgs, fmt.Sprintf(
|
||||
"[%s]: '%v' | Needs to implement '%s'",
|
||||
err.FailedField,
|
||||
err.Value,
|
||||
err.Tag,
|
||||
))
|
||||
}
|
||||
|
||||
return &fiber.Error{
|
||||
Code: fiber.ErrBadRequest.Code,
|
||||
Message: strings.Join(errMsgs, " and "),
|
||||
}
|
||||
}
|
||||
|
||||
// Logic, validated with success
|
||||
return c.SendString("Hello, World!")
|
||||
})
|
||||
|
||||
log.Fatal(app.Listen(":3000"))
|
||||
}
|
||||
|
||||
/**
|
||||
OUTPUT
|
||||
|
||||
[1]
|
||||
Request:
|
||||
|
||||
GET http://127.0.0.1:3000/
|
||||
|
||||
Response:
|
||||
|
||||
{"success":false,"message":"[Name]: '' | Needs to implement 'required' and [Age]: '0' | Needs to implement 'required'"}
|
||||
|
||||
[2]
|
||||
Request:
|
||||
|
||||
GET http://127.0.0.1:3000/?name=efdal&age=9
|
||||
|
||||
Response:
|
||||
{"success":false,"message":"[Age]: '9' | Needs to implement 'teener'"}
|
||||
|
||||
[3]
|
||||
Request:
|
||||
|
||||
GET http://127.0.0.1:3000/?name=efdal&age=
|
||||
|
||||
Response:
|
||||
{"success":false,"message":"[Age]: '0' | Needs to implement 'required'"}
|
||||
|
||||
[4]
|
||||
Request:
|
||||
|
||||
GET http://127.0.0.1:3000/?name=efdal&age=18
|
||||
|
||||
Response:
|
||||
Hello, World!
|
||||
|
||||
**/
|
||||
|
||||
```
|
195
docs/intro.md
Normal file
195
docs/intro.md
Normal file
@ -0,0 +1,195 @@
|
||||
---
|
||||
slug: /
|
||||
id: welcome
|
||||
title: 👋 Welcome
|
||||
sidebar_position: 1
|
||||
---
|
||||
An online API documentation with examples so you can start building web apps with Fiber right away!
|
||||
|
||||
**Fiber** is an [Express](https://github.com/expressjs/express) inspired **web framework** built on top of [Fasthttp](https://github.com/valyala/fasthttp), the **fastest** HTTP engine for [Go](https://go.dev/doc/). Designed to **ease** things up for **fast** development with **zero memory allocation** and **performance** in mind.
|
||||
|
||||
These docs are for **Fiber v2**, which was released on **September 15th, 2020**.
|
||||
|
||||
### Installation
|
||||
|
||||
First of all, [download](https://go.dev/dl/) and install Go. `1.17` or higher is required.
|
||||
|
||||
Installation is done using the [`go get`](https://pkg.go.dev/cmd/go/#hdr-Add_dependencies_to_current_module_and_install_them) command:
|
||||
|
||||
```bash
|
||||
go get github.com/gofiber/fiber/v2
|
||||
```
|
||||
|
||||
### Zero Allocation
|
||||
Some values returned from \***fiber.Ctx** are **not** immutable by default.
|
||||
|
||||
Because fiber is optimized for **high-performance**, values returned from **fiber.Ctx** are **not** immutable by default and **will** be re-used across requests. As a rule of thumb, you **must** only use context values within the handler, and you **must not** keep any references. As soon as you return from the handler, any values you have obtained from the context will be re-used in future requests and will change below your feet. Here is an example:
|
||||
|
||||
```go
|
||||
func handler(c *fiber.Ctx) error {
|
||||
// Variable is only valid within this handler
|
||||
result := c.Params("foo")
|
||||
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
If you need to persist such values outside the handler, make copies of their **underlying buffer** using the [copy](https://pkg.go.dev/builtin/#copy) builtin. Here is an example for persisting a string:
|
||||
|
||||
```go
|
||||
func handler(c *fiber.Ctx) error {
|
||||
// Variable is only valid within this handler
|
||||
result := c.Params("foo")
|
||||
|
||||
// Make a copy
|
||||
buffer := make([]byte, len(result))
|
||||
copy(buffer, result)
|
||||
resultCopy := string(buffer)
|
||||
// Variable is now valid forever
|
||||
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
We created a custom `CopyString` function that does the above and is available under [gofiber/utils](https://github.com/gofiber/fiber/tree/master/utils).
|
||||
|
||||
```go
|
||||
app.Get("/:foo", func(c *fiber.Ctx) error {
|
||||
// Variable is now immutable
|
||||
result := utils.CopyString(c.Params("foo"))
|
||||
|
||||
// ...
|
||||
})
|
||||
```
|
||||
|
||||
Alternatively, you can also use the `Immutable` setting. It will make all values returned from the context immutable, allowing you to persist them anywhere. Of course, this comes at the cost of performance.
|
||||
|
||||
```go
|
||||
app := fiber.New(fiber.Config{
|
||||
Immutable: true,
|
||||
})
|
||||
```
|
||||
|
||||
For more information, please check [**\#426**](https://github.com/gofiber/fiber/issues/426) and [**\#185**](https://github.com/gofiber/fiber/issues/185).
|
||||
|
||||
### Hello, World!
|
||||
|
||||
Embedded below is essentially the most straightforward **Fiber** app you can create:
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import "github.com/gofiber/fiber/v2"
|
||||
|
||||
func main() {
|
||||
app := fiber.New()
|
||||
|
||||
app.Get("/", func(c *fiber.Ctx) error {
|
||||
return c.SendString("Hello, World!")
|
||||
})
|
||||
|
||||
app.Listen(":3000")
|
||||
}
|
||||
```
|
||||
|
||||
```text
|
||||
go run server.go
|
||||
```
|
||||
|
||||
Browse to `http://localhost:3000` and you should see `Hello, World!` on the page.
|
||||
|
||||
### Basic routing
|
||||
|
||||
Routing refers to determining how an application responds to a client request to a particular endpoint, which is a URI (or path) and a specific HTTP request method (`GET`, `PUT`, `POST`, etc.).
|
||||
|
||||
Each route can have **multiple handler functions** that are executed when the route is matched.
|
||||
|
||||
Route definition takes the following structures:
|
||||
|
||||
```go
|
||||
// Function signature
|
||||
app.Method(path string, ...func(*fiber.Ctx) error)
|
||||
```
|
||||
|
||||
- `app` is an instance of **Fiber**
|
||||
- `Method` is an [HTTP request method](https://docs.gofiber.io/api/app#route-handlers): `GET`, `PUT`, `POST`, etc.
|
||||
- `path` is a virtual path on the server
|
||||
- `func(*fiber.Ctx) error` is a callback function containing the [Context](https://docs.gofiber.io/api/ctx) executed when the route is matched
|
||||
|
||||
**Simple route**
|
||||
|
||||
```go
|
||||
// Respond with "Hello, World!" on root path, "/"
|
||||
app.Get("/", func(c *fiber.Ctx) error {
|
||||
return c.SendString("Hello, World!")
|
||||
})
|
||||
```
|
||||
|
||||
**Parameters**
|
||||
|
||||
```go
|
||||
// GET http://localhost:8080/hello%20world
|
||||
|
||||
app.Get("/:value", func(c *fiber.Ctx) error {
|
||||
return c.SendString("value: " + c.Params("value"))
|
||||
// => Get request with value: hello world
|
||||
})
|
||||
```
|
||||
|
||||
**Optional parameter**
|
||||
|
||||
```go
|
||||
// GET http://localhost:3000/john
|
||||
|
||||
app.Get("/:name?", func(c *fiber.Ctx) error {
|
||||
if c.Params("name") != "" {
|
||||
return c.SendString("Hello " + c.Params("name"))
|
||||
// => Hello john
|
||||
}
|
||||
return c.SendString("Where is john?")
|
||||
})
|
||||
```
|
||||
|
||||
**Wildcards**
|
||||
|
||||
```go
|
||||
// GET http://localhost:3000/api/user/john
|
||||
|
||||
app.Get("/api/*", func(c *fiber.Ctx) error {
|
||||
return c.SendString("API path: " + c.Params("*"))
|
||||
// => API path: user/john
|
||||
})
|
||||
```
|
||||
|
||||
### Static files
|
||||
|
||||
To serve static files such as **images**, **CSS**, and **JavaScript** files, replace your function handler with a file or directory string.
|
||||
|
||||
Function signature:
|
||||
|
||||
```go
|
||||
app.Static(prefix, root string, config ...Static)
|
||||
```
|
||||
|
||||
Use the following code to serve files in a directory named `./public`:
|
||||
|
||||
```go
|
||||
app := fiber.New()
|
||||
|
||||
app.Static("/", "./public")
|
||||
|
||||
app.Listen(":3000")
|
||||
```
|
||||
|
||||
Now, you can load the files that are in the `./public` directory:
|
||||
|
||||
```bash
|
||||
http://localhost:3000/hello.html
|
||||
http://localhost:3000/js/jquery.js
|
||||
http://localhost:3000/css/style.css
|
||||
```
|
||||
|
||||
### Note
|
||||
|
||||
For more information on how to build APIs in Go with Fiber, please check out this excellent article
|
||||
[on building an express-style API in Go with Fiber](https://blog.logrocket.com/express-style-api-go-fiber/).
|
69
docs/partials/routing/handler.md
Normal file
69
docs/partials/routing/handler.md
Normal file
@ -0,0 +1,69 @@
|
||||
---
|
||||
id: route-handlers
|
||||
title: Route Handlers
|
||||
---
|
||||
|
||||
Registers a route bound to a specific [HTTP method](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods).
|
||||
|
||||
```go title="Signatures"
|
||||
// HTTP methods
|
||||
func (app *App) Get(path string, handlers ...Handler) Router
|
||||
func (app *App) Head(path string, handlers ...Handler) Router
|
||||
func (app *App) Post(path string, handlers ...Handler) Router
|
||||
func (app *App) Put(path string, handlers ...Handler) Router
|
||||
func (app *App) Delete(path string, handlers ...Handler) Router
|
||||
func (app *App) Connect(path string, handlers ...Handler) Router
|
||||
func (app *App) Options(path string, handlers ...Handler) Router
|
||||
func (app *App) Trace(path string, handlers ...Handler) Router
|
||||
func (app *App) Patch(path string, handlers ...Handler) Router
|
||||
|
||||
// Add allows you to specifiy a method as value
|
||||
func (app *App) Add(method, path string, handlers ...Handler) Router
|
||||
|
||||
// All will register the route on all HTTP methods
|
||||
// Almost the same as app.Use but not bound to prefixes
|
||||
func (app *App) All(path string, handlers ...Handler) Router
|
||||
```
|
||||
|
||||
```go title="Examples"
|
||||
// Simple GET handler
|
||||
app.Get("/api/list", func(c *fiber.Ctx) error {
|
||||
return c.SendString("I'm a GET request!")
|
||||
})
|
||||
|
||||
// Simple POST handler
|
||||
app.Post("/api/register", func(c *fiber.Ctx) error {
|
||||
return c.SendString("I'm a POST request!")
|
||||
})
|
||||
```
|
||||
|
||||
**Use** can be used for middleware packages and prefix catchers. These routes will only match the beginning of each path i.e. `/john` will match `/john/doe`, `/johnnnnn` etc
|
||||
|
||||
```go title="Signature"
|
||||
func (app *App) Use(args ...interface{}) Router
|
||||
```
|
||||
|
||||
```go title="Examples"
|
||||
// Match any request
|
||||
app.Use(func(c *fiber.Ctx) error {
|
||||
return c.Next()
|
||||
})
|
||||
|
||||
// Match request starting with /api
|
||||
app.Use("/api", func(c *fiber.Ctx) error {
|
||||
return c.Next()
|
||||
})
|
||||
|
||||
// Match requests starting with /api or /home (multiple-prefix support)
|
||||
app.Use([]string{"/api", "/home"}, func(c *fiber.Ctx) error {
|
||||
return c.Next()
|
||||
})
|
||||
|
||||
// Attach multiple handlers
|
||||
app.Use("/api", func(c *fiber.Ctx) error {
|
||||
c.Set("X-Custom-Header", random.String(32))
|
||||
return c.Next()
|
||||
}, func(c *fiber.Ctx) error {
|
||||
return c.Next()
|
||||
})
|
||||
```
|
19
go.mod
19
go.mod
@ -3,23 +3,24 @@ module github.com/gofiber/fiber/v3
|
||||
go 1.20
|
||||
|
||||
require (
|
||||
github.com/gofiber/utils/v2 v2.0.0-beta.1
|
||||
github.com/gofiber/fiber/v2 v2.48.0
|
||||
github.com/gofiber/utils/v2 v2.0.0-beta.3
|
||||
github.com/google/uuid v1.3.0
|
||||
github.com/mattn/go-colorable v0.1.13
|
||||
github.com/mattn/go-isatty v0.0.17
|
||||
github.com/stretchr/testify v1.8.1
|
||||
github.com/tinylib/msgp v1.1.6
|
||||
github.com/mattn/go-isatty v0.0.19
|
||||
github.com/stretchr/testify v1.8.4
|
||||
github.com/tinylib/msgp v1.1.8
|
||||
github.com/valyala/bytebufferpool v1.0.0
|
||||
github.com/valyala/fasthttp v1.44.0
|
||||
github.com/valyala/fasthttp v1.48.0
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/andybalholm/brotli v1.0.4 // indirect
|
||||
github.com/andybalholm/brotli v1.0.5 // indirect
|
||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/klauspost/compress v1.15.15 // indirect
|
||||
github.com/philhofer/fwd v1.1.1 // indirect
|
||||
github.com/klauspost/compress v1.16.7 // indirect
|
||||
github.com/philhofer/fwd v1.1.2 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
github.com/valyala/tcplisten v1.0.0 // indirect
|
||||
golang.org/x/sys v0.4.0 // indirect
|
||||
golang.org/x/sys v0.10.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
)
|
||||
|
81
go.sum
81
go.sum
@ -1,76 +1,69 @@
|
||||
github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY=
|
||||
github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs=
|
||||
github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/gofiber/utils/v2 v2.0.0-beta.1 h1:ACfPdqeclx+BFIja19UjkKx7k3r5tmpILpNgzrfPLKs=
|
||||
github.com/gofiber/utils/v2 v2.0.0-beta.1/go.mod h1:CG89nDoIkEFIJaw5LdLO9AmBM11odse/LC79KQujm74=
|
||||
github.com/gofiber/fiber/v2 v2.48.0 h1:cRVMCb9aUJDsyHxGFLwz/sGzDggdailZZyptU9F9cU0=
|
||||
github.com/gofiber/fiber/v2 v2.48.0/go.mod h1:xqJgfqrc23FJuqGOW6DVgi3HyZEm2Mn9pRqUb2kHSX8=
|
||||
github.com/gofiber/utils/v2 v2.0.0-beta.3 h1:pfOhUDDVjBJpkWv6C5jaDyYLvpui7zQ97zpyFFsUOKw=
|
||||
github.com/gofiber/utils/v2 v2.0.0-beta.3/go.mod h1:jsl17+MsKfwJjM3ONCE9Rzji/j8XNbwjhUVTjzgfDCo=
|
||||
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
|
||||
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
|
||||
github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw=
|
||||
github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4=
|
||||
github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I=
|
||||
github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
|
||||
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
|
||||
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
|
||||
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
||||
github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
|
||||
github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
||||
github.com/philhofer/fwd v1.1.1 h1:GdGcTjf5RNAxwS4QLsiMzJYj5KEvPJD3Abr261yRQXQ=
|
||||
github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
|
||||
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
|
||||
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||
github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw=
|
||||
github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
|
||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||
github.com/tinylib/msgp v1.1.6 h1:i+SbKraHhnrf9M5MYmvQhFnbLhAXSDWF8WWsuyRdocw=
|
||||
github.com/tinylib/msgp v1.1.6/go.mod h1:75BAfg2hauQhs3qedfdDZmWAPcFMAvJE5b9rGOMufyw=
|
||||
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/tinylib/msgp v1.1.8 h1:FCXC1xanKO4I8plpHGH2P7koL/RzZs12l/+r7vakfm0=
|
||||
github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw=
|
||||
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
|
||||
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
|
||||
github.com/valyala/fasthttp v1.44.0 h1:R+gLUhldIsfg1HokMuQjdQ5bh9nuXHPIfvkYUu9eR5Q=
|
||||
github.com/valyala/fasthttp v1.44.0/go.mod h1:f6VbjjoI3z1NDOZOv17o6RvtRSWxC77seBFc2uWtgiY=
|
||||
github.com/valyala/fasthttp v1.48.0 h1:oJWvHb9BIZToTQS3MuQ2R3bJZiNSa2KiNdeI8A+79Tc=
|
||||
github.com/valyala/fasthttp v1.48.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA=
|
||||
github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8=
|
||||
github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
|
||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||
golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20220906165146-f3363e06e74c/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||
golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18=
|
||||
golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA=
|
||||
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||
golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||
golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
|
39
group.go
39
group.go
@ -11,17 +11,26 @@ import (
|
||||
|
||||
// Group struct
|
||||
type Group struct {
|
||||
app *App
|
||||
parentGroup *Group
|
||||
name string
|
||||
app *App
|
||||
parentGroup *Group
|
||||
name string
|
||||
anyRouteDefined bool
|
||||
|
||||
Prefix string
|
||||
}
|
||||
|
||||
// Name Assign name to specific route.
|
||||
// Name Assign name to specific route or group itself.
|
||||
//
|
||||
// If this method is used before any route added to group, it'll set group name and OnGroupNameHook will be used.
|
||||
// Otherwise, it'll set route name and OnName hook will be used.
|
||||
func (grp *Group) Name(name string) Router {
|
||||
grp.app.mutex.Lock()
|
||||
if grp.anyRouteDefined {
|
||||
grp.app.Name(name)
|
||||
|
||||
return grp
|
||||
}
|
||||
|
||||
grp.app.mutex.Lock()
|
||||
if grp.parentGroup != nil {
|
||||
grp.name = grp.parentGroup.name + name
|
||||
} else {
|
||||
@ -91,6 +100,10 @@ func (grp *Group) Use(args ...any) Router {
|
||||
grp.app.register([]string{methodUse}, getGroupPath(grp.Prefix, prefix), grp, nil, handlers...)
|
||||
}
|
||||
|
||||
if !grp.anyRouteDefined {
|
||||
grp.anyRouteDefined = true
|
||||
}
|
||||
|
||||
return grp
|
||||
}
|
||||
|
||||
@ -149,12 +162,22 @@ func (grp *Group) Patch(path string, handler Handler, middleware ...Handler) Rou
|
||||
|
||||
// Add allows you to specify multiple HTTP methods to register a route.
|
||||
func (grp *Group) Add(methods []string, path string, handler Handler, middleware ...Handler) Router {
|
||||
return grp.app.register(methods, getGroupPath(grp.Prefix, path), grp, handler, middleware...)
|
||||
grp.app.register(methods, getGroupPath(grp.Prefix, path), grp, handler, middleware...)
|
||||
if !grp.anyRouteDefined {
|
||||
grp.anyRouteDefined = true
|
||||
}
|
||||
|
||||
return grp
|
||||
}
|
||||
|
||||
// Static will create a file server serving static files
|
||||
func (grp *Group) Static(prefix, root string, config ...Static) Router {
|
||||
return grp.app.registerStatic(getGroupPath(grp.Prefix, prefix), root, config...)
|
||||
grp.app.registerStatic(getGroupPath(grp.Prefix, prefix), root, config...)
|
||||
if !grp.anyRouteDefined {
|
||||
grp.anyRouteDefined = true
|
||||
}
|
||||
|
||||
return grp
|
||||
}
|
||||
|
||||
// All will register the handler on all HTTP methods
|
||||
@ -170,7 +193,7 @@ func (grp *Group) All(path string, handler Handler, middleware ...Handler) Route
|
||||
func (grp *Group) Group(prefix string, handlers ...Handler) Router {
|
||||
prefix = getGroupPath(grp.Prefix, prefix)
|
||||
if len(handlers) > 0 {
|
||||
_ = grp.app.register([]string{methodUse}, prefix, grp, nil, handlers...)
|
||||
grp.app.register([]string{methodUse}, prefix, grp, nil, handlers...)
|
||||
}
|
||||
|
||||
// Create new group
|
||||
|
171
helpers.go
171
helpers.go
@ -9,7 +9,6 @@ import (
|
||||
"crypto/tls"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"net"
|
||||
"os"
|
||||
"path/filepath"
|
||||
@ -18,10 +17,23 @@ import (
|
||||
"time"
|
||||
"unsafe"
|
||||
|
||||
"github.com/gofiber/fiber/v2/log"
|
||||
"github.com/gofiber/utils/v2"
|
||||
|
||||
"github.com/valyala/bytebufferpool"
|
||||
"github.com/valyala/fasthttp"
|
||||
)
|
||||
|
||||
// acceptType is a struct that holds the parsed value of an Accept header
|
||||
// along with quality, specificity, and order.
|
||||
// used for sorting accept headers.
|
||||
type acceptedType struct {
|
||||
spec string
|
||||
quality float64
|
||||
specificity int
|
||||
order int
|
||||
}
|
||||
|
||||
// getTLSConfig returns a net listener's tls config
|
||||
func getTLSConfig(ln net.Listener) *tls.Config {
|
||||
// Get listener type
|
||||
@ -62,7 +74,7 @@ func readContent(rf io.ReaderFrom, name string) (int64, error) {
|
||||
}
|
||||
defer func() {
|
||||
if err = f.Close(); err != nil {
|
||||
log.Printf("Error closing file: %s\n", err)
|
||||
log.Errorf("Error closing file: %s", err)
|
||||
}
|
||||
}()
|
||||
if n, err := rf.ReadFrom(f); err != nil {
|
||||
@ -205,42 +217,173 @@ func getGroupPath(prefix, path string) string {
|
||||
return strings.TrimRight(prefix, "/") + path
|
||||
}
|
||||
|
||||
// return valid offer for header negotiation
|
||||
func getOffer(header string, offers ...string) string {
|
||||
// acceptsOffer This function determines if an offer matches a given specification.
|
||||
// It checks if the specification ends with a '*' or if the offer has the prefix of the specification.
|
||||
// Returns true if the offer matches the specification, false otherwise.
|
||||
func acceptsOffer(spec, offer string) bool {
|
||||
if len(spec) >= 1 && spec[len(spec)-1] == '*' {
|
||||
return true
|
||||
} else if strings.HasPrefix(spec, offer) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// acceptsOfferType This function determines if an offer type matches a given specification.
|
||||
// It checks if the specification is equal to */* (i.e., all types are accepted).
|
||||
// It gets the MIME type of the offer (either from the offer itself or by its file extension).
|
||||
// It checks if the offer MIME type matches the specification MIME type or if the specification is of the form <MIME_type>/* and the offer MIME type has the same MIME type.
|
||||
// Returns true if the offer type matches the specification, false otherwise.
|
||||
func acceptsOfferType(spec, offerType string) bool {
|
||||
// Accept: */*
|
||||
if spec == "*/*" {
|
||||
return true
|
||||
}
|
||||
|
||||
var mimetype string
|
||||
if strings.IndexByte(offerType, '/') != -1 {
|
||||
mimetype = offerType // MIME type
|
||||
} else {
|
||||
mimetype = utils.GetMIME(offerType) // extension
|
||||
}
|
||||
|
||||
if spec == mimetype {
|
||||
// Accept: <MIME_type>/<MIME_subtype>
|
||||
return true
|
||||
}
|
||||
|
||||
s := strings.IndexByte(mimetype, '/')
|
||||
// Accept: <MIME_type>/*
|
||||
if strings.HasPrefix(spec, mimetype[:s]) && (spec[s:] == "/*" || mimetype[s:] == "/*") {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// getOffer return valid offer for header negotiation
|
||||
func getOffer(header string, isAccepted func(spec, offer string) bool, offers ...string) string {
|
||||
if len(offers) == 0 {
|
||||
return ""
|
||||
} else if header == "" {
|
||||
}
|
||||
if header == "" {
|
||||
return offers[0]
|
||||
}
|
||||
|
||||
spec, commaPos := "", 0
|
||||
for len(header) > 0 && commaPos != -1 {
|
||||
// Parse header and get accepted types with their quality and specificity
|
||||
// See: https://www.rfc-editor.org/rfc/rfc9110#name-content-negotiation-fields
|
||||
spec, commaPos, order := "", 0, 0
|
||||
acceptedTypes := make([]acceptedType, 0, 20)
|
||||
for len(header) > 0 {
|
||||
order++
|
||||
|
||||
// Skip spaces
|
||||
header = strings.TrimLeft(header, " ")
|
||||
|
||||
// Get spec
|
||||
commaPos = strings.IndexByte(header, ',')
|
||||
if commaPos != -1 {
|
||||
spec = strings.TrimSpace(header[:commaPos])
|
||||
} else {
|
||||
spec = header
|
||||
spec = strings.TrimLeft(header, " ")
|
||||
}
|
||||
|
||||
// Get quality
|
||||
quality := 1.0
|
||||
if factorSign := strings.IndexByte(spec, ';'); factorSign != -1 {
|
||||
factor := strings.Trim(spec[factorSign+1:], " ")
|
||||
if strings.HasPrefix(factor, "q=") {
|
||||
if q, err := fasthttp.ParseUfloat(utils.UnsafeBytes(factor[2:])); err == nil {
|
||||
quality = q
|
||||
}
|
||||
}
|
||||
spec = spec[:factorSign]
|
||||
}
|
||||
|
||||
for _, offer := range offers {
|
||||
// has star prefix
|
||||
if len(spec) >= 1 && spec[len(spec)-1] == '*' {
|
||||
return offer
|
||||
} else if strings.HasPrefix(spec, offer) {
|
||||
return offer
|
||||
// Skip if quality is 0.0
|
||||
// See: https://www.rfc-editor.org/rfc/rfc9110#quality.values
|
||||
if quality == 0.0 {
|
||||
if commaPos != -1 {
|
||||
header = header[commaPos+1:]
|
||||
} else {
|
||||
break
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
// Get specificity
|
||||
specificity := 0
|
||||
// check for wildcard this could be a mime */* or a wildcard character *
|
||||
if spec == "*/*" || spec == "*" {
|
||||
specificity = 1
|
||||
} else if strings.HasSuffix(spec, "/*") {
|
||||
specificity = 2
|
||||
} else if strings.IndexByte(spec, '/') != -1 {
|
||||
specificity = 3
|
||||
} else {
|
||||
specificity = 4
|
||||
}
|
||||
|
||||
// Add to accepted types
|
||||
acceptedTypes = append(acceptedTypes, acceptedType{spec, quality, specificity, order})
|
||||
|
||||
// Next
|
||||
if commaPos != -1 {
|
||||
header = header[commaPos+1:]
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if len(acceptedTypes) > 1 {
|
||||
// Sort accepted types by quality and specificity, preserving order of equal elements
|
||||
sortAcceptedTypes(&acceptedTypes)
|
||||
}
|
||||
|
||||
// Find the first offer that matches the accepted types
|
||||
for _, acceptedType := range acceptedTypes {
|
||||
for _, offer := range offers {
|
||||
if len(offer) == 0 {
|
||||
continue
|
||||
}
|
||||
if isAccepted(acceptedType.spec, offer) {
|
||||
return offer
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// sortAcceptedTypes sorts accepted types by quality and specificity, preserving order of equal elements
|
||||
//
|
||||
// Parameters are not supported, they are ignored when sorting by specificity.
|
||||
//
|
||||
// See: https://www.rfc-editor.org/rfc/rfc9110#name-content-negotiation-fields
|
||||
func sortAcceptedTypes(at *[]acceptedType) {
|
||||
if at == nil || len(*at) < 2 {
|
||||
return
|
||||
}
|
||||
acceptedTypes := *at
|
||||
|
||||
for i := 1; i < len(acceptedTypes); i++ {
|
||||
lo, hi := 0, i-1
|
||||
for lo <= hi {
|
||||
mid := (lo + hi) / 2
|
||||
if acceptedTypes[i].quality < acceptedTypes[mid].quality ||
|
||||
(acceptedTypes[i].quality == acceptedTypes[mid].quality && acceptedTypes[i].specificity < acceptedTypes[mid].specificity) ||
|
||||
(acceptedTypes[i].quality == acceptedTypes[mid].quality && acceptedTypes[i].specificity == acceptedTypes[mid].specificity && acceptedTypes[i].order > acceptedTypes[mid].order) {
|
||||
lo = mid + 1
|
||||
} else {
|
||||
hi = mid - 1
|
||||
}
|
||||
}
|
||||
for j := i; j > lo; j-- {
|
||||
acceptedTypes[j-1], acceptedTypes[j] = acceptedTypes[j], acceptedTypes[j-1]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func matchEtag(s, etag string) bool {
|
||||
if s == etag || s == "W/"+etag || "W/"+s == etag {
|
||||
return true
|
||||
|
128
helpers_test.go
128
helpers_test.go
@ -15,6 +15,128 @@ import (
|
||||
"github.com/valyala/fasthttp"
|
||||
)
|
||||
|
||||
func Test_Utils_GetOffer(t *testing.T) {
|
||||
t.Parallel()
|
||||
require.Equal(t, "", getOffer("hello", acceptsOffer))
|
||||
require.Equal(t, "1", getOffer("", acceptsOffer, "1"))
|
||||
require.Equal(t, "", getOffer("2", acceptsOffer, "1"))
|
||||
|
||||
require.Equal(t, "", getOffer("", acceptsOfferType))
|
||||
require.Equal(t, "", getOffer("text/html", acceptsOfferType))
|
||||
require.Equal(t, "", getOffer("text/html", acceptsOfferType, "application/json"))
|
||||
require.Equal(t, "", getOffer("text/html;q=0", acceptsOfferType, "text/html"))
|
||||
require.Equal(t, "", getOffer("application/json, */*; q=0", acceptsOfferType, "image/png"))
|
||||
require.Equal(t, "application/xml", getOffer("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", acceptsOfferType, "application/xml", "application/json"))
|
||||
require.Equal(t, "text/html", getOffer("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", acceptsOfferType, "text/html"))
|
||||
require.Equal(t, "application/pdf", getOffer("text/plain;q=0,application/pdf;q=0.9,*/*;q=0.000", acceptsOfferType, "application/pdf", "application/json"))
|
||||
require.Equal(t, "application/pdf", getOffer("text/plain;q=0,application/pdf;q=0.9,*/*;q=0.000", acceptsOfferType, "application/pdf", "application/json"))
|
||||
|
||||
require.Equal(t, "", getOffer("utf-8, iso-8859-1;q=0.5", acceptsOffer))
|
||||
require.Equal(t, "", getOffer("utf-8, iso-8859-1;q=0.5", acceptsOffer, "ascii"))
|
||||
require.Equal(t, "utf-8", getOffer("utf-8, iso-8859-1;q=0.5", acceptsOffer, "utf-8"))
|
||||
require.Equal(t, "iso-8859-1", getOffer("utf-8;q=0, iso-8859-1;q=0.5", acceptsOffer, "utf-8", "iso-8859-1"))
|
||||
|
||||
require.Equal(t, "deflate", getOffer("gzip, deflate", acceptsOffer, "deflate"))
|
||||
require.Equal(t, "", getOffer("gzip, deflate;q=0", acceptsOffer, "deflate"))
|
||||
}
|
||||
|
||||
func Benchmark_Utils_GetOffer(b *testing.B) {
|
||||
headers := []string{
|
||||
"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
|
||||
"application/json",
|
||||
"utf-8, iso-8859-1;q=0.5",
|
||||
"gzip, deflate",
|
||||
}
|
||||
offers := [][]string{
|
||||
{"text/html", "application/xml", "application/xml+xhtml"},
|
||||
{"application/json"},
|
||||
{"utf-8"},
|
||||
{"deflate"},
|
||||
}
|
||||
for n := 0; n < b.N; n++ {
|
||||
for i, header := range headers {
|
||||
getOffer(header, acceptsOfferType, offers[i]...)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func Test_Utils_SortAcceptedTypes(t *testing.T) {
|
||||
t.Parallel()
|
||||
acceptedTypes := []acceptedType{
|
||||
{spec: "text/html", quality: 1, specificity: 3, order: 0},
|
||||
{spec: "text/*", quality: 0.5, specificity: 2, order: 1},
|
||||
{spec: "*/*", quality: 0.1, specificity: 1, order: 2},
|
||||
{spec: "application/json", quality: 0.999, specificity: 3, order: 3},
|
||||
{spec: "application/xml", quality: 1, specificity: 3, order: 4},
|
||||
{spec: "application/pdf", quality: 1, specificity: 3, order: 5},
|
||||
{spec: "image/png", quality: 1, specificity: 3, order: 6},
|
||||
{spec: "image/jpeg", quality: 1, specificity: 3, order: 7},
|
||||
{spec: "image/*", quality: 1, specificity: 2, order: 8},
|
||||
{spec: "image/gif", quality: 1, specificity: 3, order: 9},
|
||||
{spec: "text/plain", quality: 1, specificity: 3, order: 10},
|
||||
}
|
||||
sortAcceptedTypes(&acceptedTypes)
|
||||
require.Equal(t, acceptedTypes, []acceptedType{
|
||||
{spec: "text/html", quality: 1, specificity: 3, order: 0},
|
||||
{spec: "application/xml", quality: 1, specificity: 3, order: 4},
|
||||
{spec: "application/pdf", quality: 1, specificity: 3, order: 5},
|
||||
{spec: "image/png", quality: 1, specificity: 3, order: 6},
|
||||
{spec: "image/jpeg", quality: 1, specificity: 3, order: 7},
|
||||
{spec: "image/gif", quality: 1, specificity: 3, order: 9},
|
||||
{spec: "text/plain", quality: 1, specificity: 3, order: 10},
|
||||
{spec: "image/*", quality: 1, specificity: 2, order: 8},
|
||||
{spec: "application/json", quality: 0.999, specificity: 3, order: 3},
|
||||
{spec: "text/*", quality: 0.5, specificity: 2, order: 1},
|
||||
{spec: "*/*", quality: 0.1, specificity: 1, order: 2},
|
||||
})
|
||||
}
|
||||
|
||||
// go test -v -run=^$ -bench=Benchmark_Utils_SortAcceptedTypes_Sorted -benchmem -count=4
|
||||
func Benchmark_Utils_SortAcceptedTypes_Sorted(b *testing.B) {
|
||||
acceptedTypes := make([]acceptedType, 3)
|
||||
for n := 0; n < b.N; n++ {
|
||||
acceptedTypes[0] = acceptedType{spec: "text/html", quality: 1, specificity: 1, order: 0}
|
||||
acceptedTypes[1] = acceptedType{spec: "text/*", quality: 0.5, specificity: 1, order: 1}
|
||||
acceptedTypes[2] = acceptedType{spec: "*/*", quality: 0.1, specificity: 1, order: 2}
|
||||
sortAcceptedTypes(&acceptedTypes)
|
||||
}
|
||||
require.Equal(b, "text/html", acceptedTypes[0].spec)
|
||||
require.Equal(b, "text/*", acceptedTypes[1].spec)
|
||||
require.Equal(b, "*/*", acceptedTypes[2].spec)
|
||||
}
|
||||
|
||||
// go test -v -run=^$ -bench=Benchmark_Utils_SortAcceptedTypes_Unsorted -benchmem -count=4
|
||||
func Benchmark_Utils_SortAcceptedTypes_Unsorted(b *testing.B) {
|
||||
acceptedTypes := make([]acceptedType, 11)
|
||||
for n := 0; n < b.N; n++ {
|
||||
acceptedTypes[0] = acceptedType{spec: "text/html", quality: 1, specificity: 3, order: 0}
|
||||
acceptedTypes[1] = acceptedType{spec: "text/*", quality: 0.5, specificity: 2, order: 1}
|
||||
acceptedTypes[2] = acceptedType{spec: "*/*", quality: 0.1, specificity: 1, order: 2}
|
||||
acceptedTypes[3] = acceptedType{spec: "application/json", quality: 0.999, specificity: 3, order: 3}
|
||||
acceptedTypes[4] = acceptedType{spec: "application/xml", quality: 1, specificity: 3, order: 4}
|
||||
acceptedTypes[5] = acceptedType{spec: "application/pdf", quality: 1, specificity: 3, order: 5}
|
||||
acceptedTypes[6] = acceptedType{spec: "image/png", quality: 1, specificity: 3, order: 6}
|
||||
acceptedTypes[7] = acceptedType{spec: "image/jpeg", quality: 1, specificity: 3, order: 7}
|
||||
acceptedTypes[8] = acceptedType{spec: "image/*", quality: 1, specificity: 2, order: 8}
|
||||
acceptedTypes[9] = acceptedType{spec: "image/gif", quality: 1, specificity: 3, order: 9}
|
||||
acceptedTypes[10] = acceptedType{spec: "text/plain", quality: 1, specificity: 3, order: 10}
|
||||
sortAcceptedTypes(&acceptedTypes)
|
||||
}
|
||||
require.Equal(b, acceptedTypes, []acceptedType{
|
||||
{spec: "text/html", quality: 1, specificity: 3, order: 0},
|
||||
{spec: "application/xml", quality: 1, specificity: 3, order: 4},
|
||||
{spec: "application/pdf", quality: 1, specificity: 3, order: 5},
|
||||
{spec: "image/png", quality: 1, specificity: 3, order: 6},
|
||||
{spec: "image/jpeg", quality: 1, specificity: 3, order: 7},
|
||||
{spec: "image/gif", quality: 1, specificity: 3, order: 9},
|
||||
{spec: "text/plain", quality: 1, specificity: 3, order: 10},
|
||||
{spec: "image/*", quality: 1, specificity: 2, order: 8},
|
||||
{spec: "application/json", quality: 0.999, specificity: 3, order: 3},
|
||||
{spec: "text/*", quality: 0.5, specificity: 2, order: 1},
|
||||
{spec: "*/*", quality: 0.1, specificity: 1, order: 2},
|
||||
})
|
||||
}
|
||||
|
||||
func Test_Utils_UniqueRouteStack(t *testing.T) {
|
||||
t.Parallel()
|
||||
route1 := &Route{}
|
||||
@ -108,12 +230,6 @@ func Test_Utils_Parse_Address(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func Test_Utils_GetOffset(t *testing.T) {
|
||||
require.Equal(t, "", getOffer("hello"))
|
||||
require.Equal(t, "1", getOffer("", "1"))
|
||||
require.Equal(t, "", getOffer("2", "1"))
|
||||
}
|
||||
|
||||
func Test_Utils_TestConn_Deadline(t *testing.T) {
|
||||
t.Parallel()
|
||||
conn := &testConn{}
|
||||
|
21
hooks.go
21
hooks.go
@ -1,7 +1,7 @@
|
||||
package fiber
|
||||
|
||||
import (
|
||||
"log"
|
||||
"github.com/gofiber/fiber/v2/log"
|
||||
)
|
||||
|
||||
// OnRouteHandler Handlers define a function to create hooks for Fiber.
|
||||
@ -10,8 +10,8 @@ type (
|
||||
OnNameHandler = OnRouteHandler
|
||||
OnGroupHandler = func(Group) error
|
||||
OnGroupNameHandler = OnGroupHandler
|
||||
OnListenHandler = func() error
|
||||
OnShutdownHandler = OnListenHandler
|
||||
OnListenHandler = func(ListenData) error
|
||||
OnShutdownHandler = func() error
|
||||
OnForkHandler = func(int) error
|
||||
OnMountHandler = func(*App) error
|
||||
)
|
||||
@ -32,6 +32,13 @@ type Hooks struct {
|
||||
onMount []OnMountHandler
|
||||
}
|
||||
|
||||
// ListenData is a struct to use it with OnListenHandler
|
||||
type ListenData struct {
|
||||
Host string
|
||||
Port string
|
||||
TLS bool
|
||||
}
|
||||
|
||||
func newHooks(app *App) *Hooks {
|
||||
return &Hooks{
|
||||
app: app,
|
||||
@ -174,9 +181,9 @@ func (h *Hooks) executeOnGroupNameHooks(group Group) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (h *Hooks) executeOnListenHooks() error {
|
||||
func (h *Hooks) executeOnListenHooks(listenData ListenData) error {
|
||||
for _, v := range h.onListen {
|
||||
if err := v(); err != nil {
|
||||
if err := v(listenData); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
@ -187,7 +194,7 @@ func (h *Hooks) executeOnListenHooks() error {
|
||||
func (h *Hooks) executeOnShutdownHooks() {
|
||||
for _, v := range h.onShutdown {
|
||||
if err := v(); err != nil {
|
||||
log.Printf("failed to call shutdown hook: %v\n", err)
|
||||
log.Errorf("failed to call shutdown hook: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -195,7 +202,7 @@ func (h *Hooks) executeOnShutdownHooks() {
|
||||
func (h *Hooks) executeOnForkHooks(pid int) {
|
||||
for _, v := range h.onFork {
|
||||
if err := v(pid); err != nil {
|
||||
log.Printf("failed to call fork hook: %v\n", err)
|
||||
log.Errorf("failed to call fork hook: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -138,6 +138,9 @@ func Test_Hook_OnGroupName(t *testing.T) {
|
||||
buf := bytebufferpool.Get()
|
||||
defer bytebufferpool.Put(buf)
|
||||
|
||||
buf2 := bytebufferpool.Get()
|
||||
defer bytebufferpool.Put(buf2)
|
||||
|
||||
app.Hooks().OnGroupName(func(g Group) error {
|
||||
_, err := buf.WriteString(g.name)
|
||||
require.NoError(t, nil, err)
|
||||
@ -145,11 +148,19 @@ func Test_Hook_OnGroupName(t *testing.T) {
|
||||
return nil
|
||||
})
|
||||
|
||||
app.Hooks().OnName(func(r Route) error {
|
||||
_, err := buf2.WriteString(r.Name)
|
||||
require.NoError(t, err)
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
grp := app.Group("/x").Name("x.")
|
||||
grp.Get("/test", testSimpleHandler)
|
||||
grp.Get("/test", testSimpleHandler).Name("test")
|
||||
grp.Get("/test2", testSimpleHandler)
|
||||
|
||||
require.Equal(t, "x.", buf.String())
|
||||
require.Equal(t, "x.test", buf2.String())
|
||||
}
|
||||
|
||||
func Test_Hook_OnGroupName_Error(t *testing.T) {
|
||||
@ -195,7 +206,30 @@ func Test_Hook_OnListen(t *testing.T) {
|
||||
buf := bytebufferpool.Get()
|
||||
defer bytebufferpool.Put(buf)
|
||||
|
||||
app.Hooks().OnListen(func() error {
|
||||
app.Hooks().OnListen(func(listenData ListenData) error {
|
||||
_, err := buf.WriteString("ready")
|
||||
require.NoError(t, err)
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
go func() {
|
||||
time.Sleep(1000 * time.Millisecond)
|
||||
require.Equal(t, nil, app.Shutdown())
|
||||
}()
|
||||
require.Equal(t, nil, app.Listen(":9000"))
|
||||
|
||||
require.Equal(t, "ready", buf.String())
|
||||
}
|
||||
|
||||
func Test_Hook_OnListenPrefork(t *testing.T) {
|
||||
t.Parallel()
|
||||
app := New()
|
||||
|
||||
buf := bytebufferpool.Get()
|
||||
defer bytebufferpool.Put(buf)
|
||||
|
||||
app.Hooks().OnListen(func(listenData ListenData) error {
|
||||
_, err := buf.WriteString("ready")
|
||||
require.NoError(t, nil, err)
|
||||
|
||||
@ -207,7 +241,7 @@ func Test_Hook_OnListen(t *testing.T) {
|
||||
require.Nil(t, app.Shutdown())
|
||||
}()
|
||||
|
||||
require.Nil(t, app.Listen(":9000", ListenConfig{DisableStartupMessage: true}))
|
||||
require.Nil(t, app.Listen(":9000", ListenConfig{DisableStartupMessage: true, EnablePrefork: true}))
|
||||
require.Equal(t, "ready", buf.String())
|
||||
}
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user