func processRequest(registry kit.Registry, request kit.Request, handler kit.RequestHandler) (kit.Response, bool) { var response kit.Response // Run before middlewares. for _, middleware := range registry.HttpFrontend().BeforeMiddlewares() { var skip bool response, skip = middleware(registry, request) if skip { return nil, true } else if response != nil { break } } // Only run the handler if no middleware provided a response. if response == nil { skip := false response, skip = handler(registry, request) if skip { return nil, true } } if response.GetHttpStatus() == 0 { // Note: error handler middleware will set proper http status for error responses. response.SetHttpStatus(200) } // Run after request middlewares. // Note: error responses are converted with the serverErrrorMiddleware middleware. // Note: serializing the response into the proper format is done with the SerializeResponseMiddleware. for _, middleware := range registry.HttpFrontend().AfterMiddlewares() { resp, skip := middleware(registry, request, response) if skip { return nil, true } else if resp != nil { response = resp } } return response, false }
func RequestLoggerMiddleware(registry kit.Registry, r kit.Request, response kit.Response) (kit.Response, bool) { // Calculate time taken. rawStarted, ok1 := r.GetContext().Get("startTime") rawFinished, ok2 := r.GetContext().Get("endTime") timeTaken := int64(-1) if ok1 && ok2 { started := rawStarted.(time.Time) finished := rawFinished.(time.Time) timeTaken = int64(finished.Sub(started) / time.Millisecond) } // Log the request. method := r.GetHttpMethod() path := r.GetPath() if response.GetError() != nil { registry.Logger().WithFields(logrus.Fields{ "frontend": r.GetFrontend(), "action": "request", "method": method, "path": path, "status": response.GetHttpStatus(), "err": response.GetError(), "milliseconds": timeTaken, }).Errorf("%v: %v - %v - %v", response.GetHttpStatus(), method, path, response.GetError()) } else { registry.Logger().WithFields(logrus.Fields{ "frontend": r.GetFrontend(), "action": "request", "method": method, "path": path, "status": response.GetHttpStatus(), "milliseconds": timeTaken, }).Debugf("%v: %v - %v", response.GetHttpStatus(), method, path) } return nil, false }