func devdHandler(log termlog.Logger, route Route, templates *template.Template, logHeaders bool, ignoreHeaders []*regexp.Regexp, livereload bool, latency int) http.Handler { ci := inject.CopyInject{} if livereload { ci = injectLivereload } next := route.Endpoint.Handler(templates, ci) return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { var sublog termlog.Logger if matchStringAny(ignoreHeaders, fmt.Sprintf("%s%s", route.Host, r.RequestURI)) { sublog = termlog.DummyLogger{} } else { sublog = log.Group() } timr := timer.Timer{} defer func() { timing := termlog.DefaultPalette.Timestamp.SprintFunc()("timing: ") sublog.SayAs( "timer", timing+timr.String(), ) sublog.Done() }() timr.RequestHeaders() time.Sleep(time.Millisecond * time.Duration(latency)) sublog.Say("%s %s", r.Method, r.URL) if logHeaders { LogHeader(sublog, r.Header) } ctx := timr.NewContext(context.Background()) ctx = termlog.NewContext(ctx, sublog) next.ServeHTTPContext( ctx, &ResponseLogWriter{ log: sublog, rw: w, timr: &timr, logHeaders: logHeaders, }, r, ) }) }