Fiber handler accepts request with wrong content type

WBOY
Release: 2024-02-10 23:51:08
forward
1181 people have browsed it

Fiber 处理程序接受错误内容类型的请求

Fiber is an efficient PHP extension that can be used to build asynchronous, coroutine and concurrent applications. Its handlers can accept requests with various error content types, such as JSON, XML, etc. With Fiber, developers can more flexibly handle requests in different formats and handle errors accordingly. This enables developers to better manage and maintain their applications, improving code robustness and maintainability. In this article, we'll take a deep dive into how Fiber handles different types of request errors and provide useful advice and tips for developers.

Question content

I am building a simple restful api using fiber 2.44.0 and go 1.20. I'm currently testing if I can enforce what's acceptable for a given handler (a very common thing), but it looks like I'm doing something wrong, or fibre.ctx.accepts doesn't quite follow Works the way I expect.

This is a very simple route that I defined. Note the usage of ctx.accepts... but it doesn't matter what accept http header I use, all requests will go through.

// app.go
func main() {
    config := fiber.Config{
        StrictRouting: true,
    }
    app := fiber.New(config)
    app.Use(logger.New(), recover.New())

    app.Get("/", handlers.RootHandler)

    log.Fatal(app.Listen(":8080"))
}

// ============================================================================

// handlers/handlers.go
func RootHandler(ctx *fiber.Ctx) error {
    ctx.Accepts(fiber.MIMETextPlain, fiber.MIMETextPlainCharsetUTF8)
    ctx.Set(fiber.HeaderContentType, ctx.GetReqHeaders()[fiber.HeaderAccept])
    return ctx.Status(fiber.StatusOK).SendString("Hello, world!")
}
Copy after login

Is there a way to avoid this behavior and configure the handler/routing correctly?

Solution

The signature of this function is:

func (c *ctx) accepts(offers ...string) string
Copy after login

It will return the quotes that are acceptable among the quotes you passed to this function. If the accept header in the request does not match any of the offers, it will return an empty string (see Implementation). So if you want to force a given handler to accept something acceptable, you can simply check if the return value is an empty string:

func RootHandler(ctx *fiber.Ctx) error {
    if offer := ctx.Accepts(fiber.MIMETextPlain, fiber.MIMETextPlainCharsetUTF8); offer == "" {
        return ctx.SendStatus(fiber.StatusNotAcceptable)
    }
    // ...
}
Copy after login

The above is the detailed content of Fiber handler accepts request with wrong content type. For more information, please follow other related articles on the PHP Chinese website!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!