douhui4699 2014-08-13 17:07
浏览 55
已采纳

Golang中的服务器头中间件

I'm trying to set Server Header on every Response. I'm trying to achieve this, using a Middleware for Gin. However, this does not set the Header, for some reason. I've tried to debug this so far, and I could not understand why this should not work. Probably I'm missing something here.

Here is the code

package main

import "fmt"
import "github.com/gin-gonic/gin"

const SERVER_INFO = "Some-Play-Server"

type ServerHeader struct {
    gin.ResponseWriter
    ServerInfo string
}

func (w *ServerHeader) Write(data []byte) (int, error) {
    if w.Header().Get("Server") == "" {
        w.Header().Add("Server", w.ServerInfo)
    }

    return w.ResponseWriter.Write(data)
}

func InitServerHeader() gin.HandlerFunc {
    return func(c *gin.Context) {
        writer := &ServerHeader{c.Writer, SERVER_INFO}
        c.Writer = writer
        c.Next()
    }
}

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

    fmt.Println("Server Listening on 0.0.0.0:8080")
    mux.Run(":8080")
}

And, here is the Test Output

❯ curl -v http://localhost:8080/
* About to connect() to localhost port 8080 (#0)
* Connected to localhost (::1) port 8080 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.30.0
> Host: localhost:8080
> Accept: */*
> 
< HTTP/1.1 200 OK
< Content-Type: text/plain
< Date: Wed, 13 Aug 2014 16:54:21 GMT
< Content-Length: 2
< 
OK
  • 写回答

4条回答 默认 最新

  • dongmangzong8006 2014-08-14 00:45
    关注

    You did not use the right method for that ..

    package main
    
    import "fmt"
    import "github.com/gin-gonic/gin"
    
    const SERVER_INFO = "Some-Play-Server"
    
    type ServerHeader struct {
        gin.ResponseWriter
        ServerInfo string
    }
    
    func (w *ServerHeader) WriteHeader(code int) {
        if w.Header().Get("Server") == "" {
            w.Header().Add("Server", w.ServerInfo)
        }
    
        w.ResponseWriter.WriteHeader(code)
    }
    
    func InitServerHeader() gin.HandlerFunc {
        return func(c *gin.Context) {
            writer := &ServerHeader{c.Writer, SERVER_INFO}
            c.Writer = writer
            c.Next()
        }
    }
    
    func main() {
        mux := gin.Default()
        mux.Use(InitServerHeader())
        mux.GET("/", func(c *gin.Context) {
            c.String(200, "OK")
        })
    
        fmt.Println("Server Listening on 0.0.0.0:8080")
        mux.Run(":8080")
    }
    

    Here is the Output

    $ curl -v 'http://localhost:8080/'
    * About to connect() to localhost port 8080 (#0)
    * Connected to localhost (::1) port 8080 (#0)
    > GET / HTTP/1.1
    > User-Agent: curl/7.30.0
    > Host: localhost:8080
    > Accept: */*
    > 
    < HTTP/1.1 200 OK
    < Content-Type: text/plain
    < Server: Some-Play-Server
    < Date: Thu, 14 Aug 2014 00:41:27 GMT
    < Content-Length: 2
    < 
    OK
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况
  • ¥15 画两个图 python或R
  • ¥15 在线请求openmv与pixhawk 实现实时目标跟踪的具体通讯方法
  • ¥15 八路抢答器设计出现故障
  • ¥15 opencv 无法读取视频