/* MakeHandlerAPI executes f. A non nil bytes.Buffer is only passed to f for GET requests. For GET request the response in b is written to the client with gzipping. When res.Code is not http.StatusOK the contents of res.Msg are written to w. Surrogate-Control headers are also set for intermediate caches. */ func MakeHandlerAPI(f RequestHandler) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { t := mtrapp.Start() var res *Result switch r.Method { case "GET": b := bufferPool.Get().(*bytes.Buffer) defer bufferPool.Put(b) b.Reset() res = f(r, w.Header(), b) t.Stop() WriteBytes(w, r, res, b, false) default: res = f(r, w.Header(), nil) t.Stop() Write(w, r, res) } t.Track(name(f) + "." + r.Method) res.Count() // log errors and slow 200s if res.Code != http.StatusOK { log.Printf("status: %d serving %s", res.Code, r.RequestURI) } else if t.Taken() > 250 { log.Printf("slow: took %d ms serving %s", t.Taken(), r.RequestURI) } } }
/* MakeHandler executes f and writes the response in b to the client with gzipping and Surrogate-Control headers. HTML error pages are written to the client when res.Code is not http.StatusOK. */ func MakeHandlerPage(f RequestHandler) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { t := mtrapp.Start() b := bufferPool.Get().(*bytes.Buffer) defer bufferPool.Put(b) b.Reset() res := f(r, w.Header(), b) t.Stop() WriteBytes(w, r, res, b, true) t.Track(name(f) + "." + r.Method) res.Count() res.log(r) if t.Taken() > 250 { log.Printf("slow: took %d ms serving %s", t.Taken(), r.RequestURI) } } }