// WrapHandler wraps an httpctx.Handler in the paraphernalia needed by devd for // logging, latency, and so forth. func (dd *Devd) WrapHandler(log termlog.Logger, next httpctx.Handler) http.Handler { h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { revertOriginalHost(r) timr := timer.Timer{} sublog := log.Group() defer func() { timing := termlog.DefaultPalette.Timestamp.SprintFunc()("timing: ") sublog.SayAs("timer", timing+timr.String()) sublog.Done() }() if matchStringAny(dd.IgnoreLogs, fmt.Sprintf("%s%s", r.URL.Host, r.RequestURI)) { sublog.Quiet() } timr.RequestHeaders() time.Sleep(time.Millisecond * time.Duration(dd.Latency)) sublog.Say("%s %s", r.Method, r.URL) LogHeader(sublog, r.Header) ctx := timr.NewContext(context.Background()) ctx = termlog.NewContext(ctx, sublog) next.ServeHTTPContext( ctx, &ResponseLogWriter{Log: sublog, Resp: w, Timer: &timr}, r, ) }) return h }
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, ) }) }
// RouteHandler handles a single route func (dd *Devd) RouteHandler(log termlog.Logger, route Route, templates *template.Template) http.Handler { ci := inject.CopyInject{} if dd.HasLivereload() { ci = livereload.Injector } next := route.Endpoint.Handler(templates, ci) h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { timr := timer.Timer{} sublog := log.Group() defer func() { timing := termlog.DefaultPalette.Timestamp.SprintFunc()("timing: ") sublog.SayAs( "timer", timing+timr.String(), ) sublog.Done() }() if matchStringAny(dd.IgnoreLogs, fmt.Sprintf("%s%s", route.Host, r.RequestURI)) { sublog.Quiet() } timr.RequestHeaders() time.Sleep(time.Millisecond * time.Duration(dd.Latency)) sublog.Say("%s %s", r.Method, r.URL) LogHeader(sublog, r.Header) ctx := timr.NewContext(context.Background()) ctx = termlog.NewContext(ctx, sublog) next.ServeHTTPContext( ctx, &ResponseLogWriter{ Log: sublog, Resp: w, Timer: &timr, }, r, ) }) return http.StripPrefix(route.Path, h) }