【问题标题】:Modify request header in middleware修改中间件中的请求头
【发布时间】:2016-10-09 00:00:30
【问题描述】:

希望这是获得一些声望的简单方法。这看起来很简单,所以我一定是做错了什么,只是看不到。

我有一个简单的中间件,其中包含一个事务 ID,并将其添加到请求和响应标头中。

    func HandleTransactionID(fn http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, req *http.Request) {
        tid := uuid.NewV4()
        req.Header.Set(TransIDHeader, TransIDPrefix + tid.String())
        w.Header().Set(TransIDHeader, TransIDPrefix + tid.String())
        fn(w, req)
    }
}

在我的单元测试中,我确认响应标头已成功设置,但似乎并未设置请求标头。我会假设可以修改请求标头,所以?

const (
    WriteTestHeader = "WriterTransHeader"
    RequestTestHeader = "ReqTransHeader"
)


func recorderFunc(w http.ResponseWriter, req *http.Request){
    w.Header().Set(WriteTestHeader, w.Header().Get(TransIDHeader))
    w.Header().Set(RequestTestHeader, req.Header.Get(TransIDHeader))
}

func TestHandleTransactionID(t *testing.T) {
    recorder := httptest.NewRecorder()
    req := httptest.NewRequest("GET", "/foo", nil)
    middleware.HandleTransactionID(recorderFunc)(recorder, req)

    if req.Header.Get(RequestTestHeader) == "" {
        t.Error("request header is nil")
    }
    if recorder.Header().Get(WriteTestHeader) == "" {
        t.Error("response header is nil")
    }
    if req.Header.Get(RequestTestHeader) != recorder.Header().Get(WriteTestHeader) {
        t.Errorf("header value mismatch: %s != %s",
            req.Header.Get(RequestTestHeader),
            recorder.Header().Get(WriteTestHeader))
    }
}

【问题讨论】:

  • 您可以尝试直接在 recorderFunc 中记录标题吗? log.Println(req.Header.Get(TransIDHeader), w.Header().Get(TransIDHeader))
  • 以为我之前这样做了,它打印了空字符串,但我可以再试一次。
  • 您能否确认TransIDPrefix + tid.String() 不是空字符串,因为当我使用硬编码字符串时,我能够打印这些值。
  • 那是我执行 println() 的时候,但我会验证。我暂时被其他项目拖住了。这周应该会回来。

标签: go middleware


【解决方案1】:

在您的测试中,req.Header.Get(RequestTestHeader) 将始终保持为空字符串,因为您没有在请求标头中将 Key 设置为“RequestTestHeader”,而是在 ResponseWriter w.Header().Set(RequestTestHeader, req.Header.Get(TransIDHeader)) 中设置

另外,如果你的中间件函数签名使用 http.Handler 接口 func HandleTransactionID(fn http.Handler) http.Handler,这将被认为是惯用的 Go。

【讨论】:

  • 好收获。由于一个不相关的问题,我试图修复这个测试搞砸了。瞌睡时写作是个坏主意。 :-/
猜你喜欢
  • 2011-10-21
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
  • 2011-03-22
相关资源
最近更新 更多