ServeHTTP serves routes
(rw http.ResponseWriter, req *http.Request)
| 110 | |
| 111 | // ServeHTTP serves routes |
| 112 | func (r *Router) ServeHTTP(rw http.ResponseWriter, req *http.Request) { |
| 113 | // Attach timer to the context |
| 114 | req, timeoutCancel := StartRequestTimer(req, r.config.RequestTimeout) |
| 115 | defer timeoutCancel() |
| 116 | |
| 117 | // Create the [ResponseWriter] |
| 118 | rww := r.rwFactory.NewWriter(rw) |
| 119 | |
| 120 | // Get/create request ID |
| 121 | reqID := r.getRequestID(req) |
| 122 | |
| 123 | // Replace request IP from headers |
| 124 | r.replaceRemoteAddr(req) |
| 125 | |
| 126 | rww.Header().Set(httpheaders.Server, DefaultServerName) |
| 127 | rww.Header().Set(httpheaders.XRequestID, reqID) |
| 128 | |
| 129 | for _, rr := range r.routes { |
| 130 | if !rr.isMatch(req) { |
| 131 | continue |
| 132 | } |
| 133 | |
| 134 | // Set req.Pattern. We use it to trim path prefixes in handlers. |
| 135 | req.Pattern = rr.path |
| 136 | |
| 137 | if !rr.silent { |
| 138 | LogRequest(reqID, req) |
| 139 | } |
| 140 | |
| 141 | rr.handler(reqID, rww, req) |
| 142 | return |
| 143 | } |
| 144 | |
| 145 | // Means that we have not found matching route |
| 146 | LogRequest(reqID, req) |
| 147 | LogResponse(reqID, req, http.StatusNotFound, newRouteNotDefinedError(req.URL.Path)) |
| 148 | r.NotFoundHandler(reqID, rww, req) |
| 149 | } |
| 150 | |
| 151 | // NotFoundHandler is default 404 handler |
| 152 | func (r *Router) NotFoundHandler(reqID string, rw ResponseWriter, req *http.Request) *Error { |