在中间件中修改请求header
Modify request header in middleware
希望这是获得一些声望的简单方法。这看起来很简单,所以我一定是做错了什么,只是看不到。
我有一个简单的中间件,它有一个事务 ID,并将其添加到请求和响应中 headers。
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)
}
}
在我的单元测试中,我已确认已成功设置响应 header,但似乎并未设置请求 header。我假设可以修改请求 headers,所以 ?
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))
}
}
在您的测试中,req.Header.Get(RequestTestHeader)
将始终保持为空字符串,因为您没有在请求 header 中将密钥设置为 'RequestTestHeader',而是在 ResponseWriter w.Header().Set(RequestTestHeader, req.Header.Get(TransIDHeader))
中
在一个不相关的说明中,使用 http.Handler 接口让你的中间件函数签名被认为是 idomatic Go,func HandleTransactionID(fn http.Handler) http.Handler
。
希望这是获得一些声望的简单方法。这看起来很简单,所以我一定是做错了什么,只是看不到。
我有一个简单的中间件,它有一个事务 ID,并将其添加到请求和响应中 headers。
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)
}
}
在我的单元测试中,我已确认已成功设置响应 header,但似乎并未设置请求 header。我假设可以修改请求 headers,所以 ?
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))
}
}
在您的测试中,req.Header.Get(RequestTestHeader)
将始终保持为空字符串,因为您没有在请求 header 中将密钥设置为 'RequestTestHeader',而是在 ResponseWriter w.Header().Set(RequestTestHeader, req.Header.Get(TransIDHeader))
中
在一个不相关的说明中,使用 http.Handler 接口让你的中间件函数签名被认为是 idomatic Go,func HandleTransactionID(fn http.Handler) http.Handler
。