0
package middleware

import (
"fmt"

"github.com/labstack/echo/v4"
)

type _getData struct {
Token string `header:"Authorization"`
}

func TokenCheck(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
    a := new(_getData)
    c.Bind(a)
    fmt.Print(a)
    return next(c)
}
}

There is an authrozation value in the header, using bind to the echo framework, I want to know the authrozation value, but there is no returned value.

jub0bs
  • 60,866
  • 25
  • 183
  • 186
Choi yun seok
  • 309
  • 2
  • 15
  • 1
    Does echo library support tags? I do not find any. https://stackoverflow.com/questions/10858787/what-are-the-uses-for-tags-in-go – MenyT Sep 24 '21 at 06:18

1 Answers1

3

BindHeaders was not called in Bind. The Source code:

func (b *DefaultBinder) Bind(i interface{}, c Context) (err error) {
    if err := b.BindPathParams(c, i); err != nil {
        return err
    }
    // Issue #1670 - Query params are binded only for GET/DELETE and NOT for usual request with body (POST/PUT/PATCH)
    // Reasoning here is that parameters in query and bind destination struct could have UNEXPECTED matches and results due that.
    // i.e. is `&id=1&lang=en` from URL same as `{"id":100,"lang":"de"}` request body and which one should have priority when binding.
    // This HTTP method check restores pre v4.1.11 behavior and avoids different problems when query is mixed with body
    if c.Request().Method == http.MethodGet || c.Request().Method == http.MethodDelete {
        if err = b.BindQueryParams(c, i); err != nil {
            return err
        }
    }
    return b.BindBody(c, i)
}

You can get the value in the header in the following ways:

func TokenCheck(next echo.HandlerFunc) echo.HandlerFunc {
    b := &echo.DefaultBinder{}
    return func(c echo.Context) error {
        a := new(_getData)
        b.BindHeaders(c, a)
        fmt.Print(a)
        return next(c)
    }
}

Or:

token := c.Request().Header.Get("Authorization")
Trock
  • 546
  • 2
  • 13