swarm/api: wrapping the responseWriter

This commit is contained in:
Anton Evangelatov 2018-03-15 13:59:03 +01:00
parent 719da647d8
commit 6a2b73eae5

View file

@ -799,10 +799,13 @@ func (s *Server) HandleGetFile(w http.ResponseWriter, r *Request) {
http.ServeContent(w, &r.Request, "", time.Now(), reader) http.ServeContent(w, &r.Request, "", time.Now(), reader)
} }
func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { func (s *Server) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
req := &Request{Request: *r, ruid: uuid.New()[:8]} req := &Request{Request: *r, ruid: uuid.New()[:8]}
requestCount.Inc(1) requestCount.Inc(1)
log.Info("serve request", "ruid", req.ruid, "method", r.Method, "url", r.RequestURI) log.Info("serving request", "ruid", req.ruid, "method", r.Method, "url", r.RequestURI)
// wrapping the ResponseWriter, so that we get the response code set by http.ServeContent
w := newLoggingResponseWriter(rw)
if r.RequestURI == "/" && strings.Contains(r.Header.Get("Accept"), "text/html") { if r.RequestURI == "/" && strings.Contains(r.Header.Get("Accept"), "text/html") {
@ -880,6 +883,8 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
default: default:
Respond(w, req, fmt.Sprintf("%s method is not supported", r.Method), http.StatusMethodNotAllowed) Respond(w, req, fmt.Sprintf("%s method is not supported", r.Method), http.StatusMethodNotAllowed)
} }
log.Info("served response", "ruid", req.ruid, "code", w.statusCode)
} }
func (s *Server) updateManifest(key storage.Key, update func(mw *api.ManifestWriter) error) (storage.Key, error) { func (s *Server) updateManifest(key storage.Key, update func(mw *api.ManifestWriter) error) (storage.Key, error) {
@ -899,3 +904,17 @@ func (s *Server) updateManifest(key storage.Key, update func(mw *api.ManifestWri
log.Debug(fmt.Sprintf("generated manifest %s", key)) log.Debug(fmt.Sprintf("generated manifest %s", key))
return key, nil return key, nil
} }
type loggingResponseWriter struct {
http.ResponseWriter
statusCode int
}
func newLoggingResponseWriter(w http.ResponseWriter) *loggingResponseWriter {
return &loggingResponseWriter{w, http.StatusOK}
}
func (lrw *loggingResponseWriter) WriteHeader(code int) {
lrw.statusCode = code
lrw.ResponseWriter.WriteHeader(code)
}