refs #4194
[arvados.git] / services / keepstore / logging_router.go
1 package main
2
3 // LoggingRESTRouter
4 // LoggingResponseWriter
5
6 import (
7         "github.com/gorilla/mux"
8         "log"
9         "net/http"
10 )
11
12 type LoggingResponseWriter struct {
13         Status int
14         Length int
15         http.ResponseWriter
16 }
17
18 func (loggingWriter *LoggingResponseWriter) WriteHeader(code int) {
19         loggingWriter.Status = code
20         loggingWriter.ResponseWriter.WriteHeader(code)
21 }
22
23 func (loggingWriter *LoggingResponseWriter) Write(data []byte) (int, error) {
24         loggingWriter.Length += len(data)
25         return loggingWriter.ResponseWriter.Write(data)
26 }
27
28 type LoggingRESTRouter struct {
29         router *mux.Router
30 }
31
32 func MakeLoggingRESTRouter() *LoggingRESTRouter {
33         router := MakeRESTRouter()
34         return (&LoggingRESTRouter{router})
35 }
36
37 func (loggingRouter *LoggingRESTRouter) ServeHTTP(resp http.ResponseWriter, req *http.Request) {
38         loggingWriter := LoggingResponseWriter{200, 0, resp}
39         loggingRouter.router.ServeHTTP(&loggingWriter, req)
40         log.Printf("[%s] %s %s %d %d", req.RemoteAddr, req.Method, req.URL.Path[1:], loggingWriter.Status, loggingWriter.Length)
41 }