55 "fmt"
66 "io"
77 "net/http"
8+ "time"
89
910 "github.com/gorilla/handlers"
1011 "github.com/gorilla/mux"
@@ -15,11 +16,19 @@ import (
1516
1617type requestHandler struct {
1718 adapter scanner.Adapter
19+ logger Logger
1820}
1921
20- func NewAPIHandler (adapter scanner.Adapter , logger io.Writer ) http.Handler {
22+ type Logger interface {
23+ Writer () * io.PipeWriter
24+ Error (args ... interface {})
25+ Errorf (format string , args ... interface {})
26+ }
27+
28+ func NewAPIHandler (adapter scanner.Adapter , logger Logger ) http.Handler {
2129 handler := requestHandler {
2230 adapter : adapter ,
31+ logger : logger ,
2332 }
2433
2534 router := mux .NewRouter ()
@@ -30,7 +39,7 @@ func NewAPIHandler(adapter scanner.Adapter, logger io.Writer) http.Handler {
3039 apiV1Router .Methods (http .MethodPost ).Path ("/scan" ).HandlerFunc (handler .scan )
3140 apiV1Router .Methods (http .MethodGet ).Path ("/scan/{scan_request_id}/report" ).HandlerFunc (handler .getReport )
3241
33- return handlers .LoggingHandler (logger , router )
42+ return handlers .LoggingHandler (logger . Writer () , router )
3443}
3544
3645func health (res http.ResponseWriter , req * http.Request ) {
@@ -40,8 +49,10 @@ func health(res http.ResponseWriter, req *http.Request) {
4049func (h * requestHandler ) metadata (res http.ResponseWriter , req * http.Request ) {
4150 metadata , err := h .adapter .GetMetadata ()
4251 if err != nil {
52+ h .logRequestError (req , err )
4353 res .Header ().Set ("Content-Type" , harbor .ScanAdapterErrorMimeType )
4454 res .WriteHeader (http .StatusInternalServerError )
55+
4556 json .NewEncoder (res ).Encode (errorResponseFromError (err ))
4657 return
4758 }
@@ -100,6 +111,16 @@ func (h *requestHandler) getReport(res http.ResponseWriter, req *http.Request) {
100111 json .NewEncoder (res ).Encode (vulnerabilityReport )
101112}
102113
114+ func (h * requestHandler ) logRequestError (req * http.Request , err error ) {
115+ ts := time .Now ()
116+ h .logger .Errorf ("[%s] \" %s %s %s\" request ERROR: %s" ,
117+ ts .Format ("02/Jan/2006:15:04:05 -0700" ),
118+ req .Method ,
119+ req .RequestURI ,
120+ req .Proto ,
121+ err )
122+ }
123+
103124func errorResponseFromError (err error ) harbor.ErrorResponse {
104125 return harbor.ErrorResponse {
105126 Error : & harbor.ModelError {
0 commit comments