Go Gin - http "HEAD" 请求方法

Go Gin - http "HEAD" request method

如果传入请求方法在如下所示的中间件中为“HEAD”,我尝试将 http 方法设置为“GET”。

如果我执行 curl -I,Gin 似乎将此识别为“GET”请求, 但它以 404 响应,如附件日志所示(底部)。

我只是想看看如果不在路由器级别实施“HEAD”方法,这是否可行。 有什么建议吗?

func CORS() gin.HandlerFunc {
    return func(c *gin.Context) {
        c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
        c.Writer.Header().Set("Access-Control-Allow-Credentials", "true")
        c.Writer.Header().Set("Access-Control-Allow-Headers", "*")
        c.Writer.Header().Set("Access-Control-Allow-Methods", "*")

        if c.Request.Method == "OPTIONS" {
            c.AbortWithStatus(http.StatusNoContent)
            return
        }

        //  set http method to "GET" if an incoming request is "HEAD"
        if c.Request.Method == "HEAD" {
            c.Request.Method = "GET"
        }

        c.Next()
    }
}

gin's log

由于gin中间件是路由匹配后得到的处理函数,中间件是在路由匹配后执行的,因此中间件无法修改路由匹配方式

通过装饰一层http.Handler(gin.Engine),使用http.Server中间件修改请求方法

注意:'HEAD' 请求没有响应正文。如果'HEAD'转'GET'后有响应体,不符合http协议规范,建议将'Get'处理函数全部注册到'Head' 方法。

func main() {
    router := gin.Default()

    s := &http.Server{
        Addr:           ":8080",
        Handler:        http.Handler(func(w http.ResponseWriter, r *http.Request){
            if r.Method == "HEAD" {
                r.Method = "GET"
            }
            router.ServeHTTP(w, r)
        }),
        ReadTimeout:    10 * time.Second,
        WriteTimeout:   10 * time.Second,
        MaxHeaderBytes: 1 << 20,
    }
    s.ListenAndServe()
}