Merge branch 'master' into 4194-keep-logging
[arvados.git] / services / keep / keep_utils.go
1 package keep_utils
2
3 // RESTRouterWrapper
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   data []byte
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.data = data
25   return loggingWriter.ResponseWriter.Write(data)
26 }
27
28 type RESTRouterWrapper struct {
29   router *mux.Router
30 }
31
32 func MakeRESTRouterWrapper(r *mux.Router) (RESTRouterWrapper) {
33   return (RESTRouterWrapper{r})
34 }
35
36 func (this RESTRouterWrapper) ServeHTTP(resp http.ResponseWriter, req *http.Request) {
37   loggingWriter := LoggingResponseWriter{200, nil, resp}
38   this.router.ServeHTTP(&loggingWriter, req)
39   if loggingWriter.data != nil && loggingWriter.status == 200 {
40     data_len := len(loggingWriter.data)
41     if data_len > 200 {  // this could be a block, so just print the size
42       log.Printf("[%s] %s %s %d %d", req.RemoteAddr, req.Method, req.URL.Path[1:], loggingWriter.status, data_len)
43     } else {  // this could be a hash or status or a small block etc
44       log.Printf("[%s] %s %s %d %s", req.RemoteAddr, req.Method, req.URL.Path[1:], loggingWriter.status, loggingWriter.data)
45     }
46   } else {
47     log.Printf("[%s] %s %s %d", req.RemoteAddr, req.Method, req.URL.Path[1:], loggingWriter.status)
48   }
49 }