Журнал 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
Другие вопросы по тегам