gpt4 book ai didi

http - 在 http.FileServer 上记录 404

转载 作者:IT王子 更新时间:2023-10-29 01:24:43 26 4
gpt4 key购买 nike

我使用 http.FileServer 提供来自 dirPath 的 jpeg 图像:

http.Handle("/o/", http.StripPrefix(
path.Join("/o", dirPath), http.FileServer(http.Dir(dirPath))))

我不明白的是当对不存在的文件发出请求时如何记录。当我使用浏览器发出请求时,我可以看到 http.FileServer 返回 404 page not found,但服务器控制台上没有。

最佳答案

http.Handlerhttp.StripPrefix() 返回和 http.FileServer()不要记录 HTTP 404 错误。您必须扩展它们的功能才能实现您想要的。

我们可以将 http.StripPrefix()http.FileServer() 返回的 http.Handler 值包装在另一个 http.Handlerhttp.HandlerFunc .包装处理程序后,当然要注册包装器。

包装器实现将简单地调用包装器,一旦它返回,就可以检查 HTTP 响应状态代码。如果它是一个错误(或者特别是 HTTP 404 Not Found),可以适本地记录它。

问题是 http.ResponseWriter不支持读取响应状态码。我们可以做的是我们也包装 http.ResponseWriter 并且在写入状态代码时,我们将存储它以备后用。

我们的 http.ResponseWriter 包装器:

type StatusRespWr struct {
http.ResponseWriter // We embed http.ResponseWriter
status int
}

func (w *StatusRespWr) WriteHeader(status int) {
w.status = status // Store the status for our own use
w.ResponseWriter.WriteHeader(status)
}

并包装http.Handler:

func wrapHandler(h http.Handler) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
srw := &StatusRespWr{ResponseWriter: w}
h.ServeHTTP(srw, r)
if srw.status >= 400 { // 400+ codes are the error codes
log.Printf("Error status code: %d when serving path: %s",
srw.status, r.RequestURI)
}
}
}

主要功能是创建一个文件服务器,包装并注册它:

http.HandleFunc("/o/", wrapHandler(
http.StripPrefix("/o", http.FileServer(http.Dir("/test")))))
panic(http.ListenAndServe(":8181", nil))

请求一个不存在的文件时的示例输出:

2015/12/01 11:47:40 Error status code: 404 when serving path: /o/sub/b.txt2

关于http - 在 http.FileServer 上记录 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34017342/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com