Golang 中的服务器头中间件

use*_*499 4 http go http-headers

我正在尝试在每个响应上设置服务器标头。我正在尝试使用Gin 中间件来实现这一目标。但是,由于某种原因,这不会设置标头。到目前为止,我已经尝试对此进行调试,但我无法理解为什么这不起作用。也许我在这里遗漏了一些东西。

\n\n

这是代码

\n\n
package main\n\nimport "fmt"\nimport "github.com/gin-gonic/gin"\n\nconst SERVER_INFO = "Some-Play-Server"\n\ntype ServerHeader struct {\n    gin.ResponseWriter\n    ServerInfo string\n}\n\nfunc (w *ServerHeader) Write(data []byte) (int, error) {\n    if w.Header().Get("Server") == "" {\n        w.Header().Add("Server", w.ServerInfo)\n    }\n\n    return w.ResponseWriter.Write(data)\n}\n\nfunc InitServerHeader() gin.HandlerFunc {\n    return func(c *gin.Context) {\n        writer := &ServerHeader{c.Writer, SERVER_INFO}\n        c.Writer = writer\n        c.Next()\n    }\n}\n\nfunc main() {\n    mux := gin.Default()\n    mux.Use(InitServerHeader())\n    mux.GET("/", func(c *gin.Context) {\n        c.String(200, "OK")\n    })\n\n    fmt.Println("Server Listening on 0.0.0.0:8080")\n    mux.Run(":8080")\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

而且,这是测试输出

\n\n
\xe2\x9d\xaf curl -v http://localhost:8080/\n* About to connect() to localhost port 8080 (#0)\n* Connected to localhost (::1) port 8080 (#0)\n> GET / HTTP/1.1\n> User-Agent: curl/7.30.0\n> Host: localhost:8080\n> Accept: */*\n> \n< HTTP/1.1 200 OK\n< Content-Type: text/plain\n< Date: Wed, 13 Aug 2014 16:54:21 GMT\n< Content-Length: 2\n< \nOK\n
Run Code Online (Sandbox Code Playgroud)\n

小智 5

这里 Gin 的创建者:不要覆盖 c.Writer,这会带来太多的开销和不必要的复杂性。如果您想支持透明的 gzip 压缩或缓存,则应覆盖 writer(请参阅 gzip 中间件)。如果你想添加标题,只需这样做:

func main() {
    mux := gin.Default()
    mux.Use(serverHeader)
    mux.GET("/", func(c *gin.Context) {
        c.String(200, "OK")
    })    
    mux.Run(":8080")
}

func serverHeader(c *gin.Context) {
    // shortcut for c.Writer.Header().Set("Server", "Some-Play-Server")
    c.Header("Server", "Some-Play-Server")
}
Run Code Online (Sandbox Code Playgroud)

完毕!由于它作为全局中间件附加,因此所有响应都将包含服务器标头,即使在提供静态文件时也是如此!