我正在尝试链接HTTP处理程序以提供一些附加功能,例如:
package router
import (
// snip
"github.com/gorilla/mux"
"github.com/gorilla/handlers"
"net/http"
)
// snip
r := mux.NewRouter()
/* routing code */
var h http.Handler
h = r
if useGzip {
h = handlers.CompressHandler(h)
}
if useLogFile {
fn := pathToLog
accessLog, err := os.OpenFile(fn, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666)
if err != nil {
panic(err)
}
h = handlers.CombinedLoggingHandler(accessLog, h)
}
// etc...
问题是,如果大猩猩/多路复用器路由器指向的控制器之一已经设置了任何HTTP标头(例如w.WriteHeader(404)
或w.Header().Set("Content-Type", "application/json")
),这将无声地破坏任何试图设置或添加自己标头的“包装器”处理程序,例如压缩处理程序。我看不到任何错误,除非我忘记在某个地方抓到一个错误,但是浏览器得到的响应无效。
除了将标头存放在某个地方然后由最终处理程序编写它们之外,是否有任何优雅的方式来处理此问题?似乎那意味着要重写处理程序的代码,如果可能的话,我希望避免这样做。
致电后w.WriteHeader(404)
,标头会挂在线上。因此,您无法再添加它。最好的方法是缓冲状态代码,并将其写入链的末尾。
例如,您可以提供您自己的包装程序http.ResponseWriter
,以重新执行WriteHeader()
以保存状态值。然后添加方法Commit()
以实际编写它。调用Commit()
最后一个处理程序。当然,您必须以某种方式确定哪个处理程序是最后一个。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句