Журнал 404 на http.FileServer
Я работаю в формате JPEG из dirPath
с помощью http.FileServer
с:
http.Handle("/o/", http.StripPrefix(
path.Join("/o", dirPath), http.FileServer(http.Dir(dirPath))))
Что я не понимаю, так это как войти, когда сделан запрос на файл, который не существует. я могу видеть http.FileServer
возвращающая страница 404 не найдена, когда я делаю запрос в браузере, но не на консоли сервера.
1 ответ
http.Handler
с возвращено http.StripPrefix()
а также http.FileServer()
не регистрировать ошибки HTTP 404. Вы должны расширить их функциональность, чтобы достичь того, что вы хотите.
Мы можем обернуть http.Handler
значение, возвращаемое http.StripPrefix()
или же http.FileServer()
в другой http.Handler
или же http.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