Fasthttp + fasthttprouter, пытается написать промежуточное ПО
В настоящее время я пытаюсь написать промежуточное программное обеспечение для работы с fasthttp и fasthttprouter. И я застрял.
func jwt(h fasthttprouter.Handle) fasthttprouter.Handle {
myfunc := func(ctx *fasthttp.RequestCtx, _ fasthttprouter.Params) {
fmt.Println(string(ctx.Request.Header.Cookie("Authorization")))
}
return myfunc
}
Как мне запустить настоящий обработчик сейчас? Я чувствую, что упускаю что-то очень простое.
Я прочитал этот пост в блоге: Middleware на Голанге. Но я потерян.
Есть идеи?
С уважением
2 ответа
Решение
Например, давайте создадим функцию промежуточного программного обеспечения, которая будет обрабатывать CORS, используя:
https://github.com/buaazp/fasthttprouter и https://github.com/valyala/fasthttp
var (
corsAllowHeaders = "authorization"
corsAllowMethods ="HEAD,GET,POST,PUT,DELETE,OPTIONS"
corsAllowOrigin = "*"
corsAllowCredentials = "true"
)
func CORS(next fasthttprouter.Handle) fasthttprouter.Handle {
return fasthttprouter.Handle(func(ctx *fasthttp.RequestCtx, p fasthttprouter.Params) {
ctx.Response.Header.Set("Access-Control-Allow-Credentials", corsAllowCredentials)
ctx.Response.Header.Set("Access-Control-Allow-Headers", corsAllowHeaders)
ctx.Response.Header.Set("Access-Control-Allow-Methods", corsAllowMethods)
ctx.Response.Header.Set("Access-Control-Allow-Origin", corsAllowOrigin)
next(ctx, p)
})
}
Теперь мы связываем эту функцию промежуточного программного обеспечения с нашим обработчиком индекса и регистрируем его на маршрутизаторе.
func Index(ctx *fasthttp.RequestCtx, _ fasthttprouter.Params) {
fmt.Fprint(ctx, "some-api")
}
func main() {
var handler fasthttprouter.Handle
handler = Index
handler = CORS(handler)
router.Handle("GET", "/", handler)
}
Пример аутентификации промежуточного программного обеспечения для fasthttp & fasthttprouter (новые версии)
type Middleware func(h fasthttp.RequestHandler) fasthttp.RequestHandler
type AuthFunc func(ctx *fasthttp.RequestCtx) bool
func NewAuthMiddleware(authFunc AuthFunc) Middleware {
return func(h fasthttp.RequestHandler) fasthttp.RequestHandler {
return func(ctx *fasthttp.RequestCtx) {
result, err: = authFunc(ctx)
if result {
h(ctx)
} else {
ctx.Response.SetStatusCode(fasthttp.StatusUnauthorized)
}
}
}
}
func AuthCheck(ctx *fasthttp.RequestCtx)(bool, error) {
return false; // for example ;)
}
// router
authMiddleware: = middleware.NewAuthMiddleware(security.AuthCheck)
...
router.GET("/protected", authMiddleware(handlers.ProtectedHandler))