From d49f762f6d9cdc2e92e8de40f0b0e99a9d0c4fc9 Mon Sep 17 00:00:00 2001 From: Matthew Holt Date: Fri, 21 Jun 2019 14:36:26 -0600 Subject: Various bug fixes and minor improvements - Fix static responder so it doesn't replace its own headers config, and instead replaces the actual response header values - caddyhttp.ResponseRecorder type optionally buffers response - Add interface guards to ensure regexp matchers get provisioned - Use default HTTP port if one is not explicitly set - Encode middleware writes status code 200 if not written upstream - Templates and markdown only try to execute on text responses - Static file server sets Content-Type based on file extension only (this whole thing -- MIME sniffing, etc -- needs more configurability) --- modules/caddyhttp/templates/templates.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'modules/caddyhttp/templates/templates.go') diff --git a/modules/caddyhttp/templates/templates.go b/modules/caddyhttp/templates/templates.go index c659f6b..e329e2e 100644 --- a/modules/caddyhttp/templates/templates.go +++ b/modules/caddyhttp/templates/templates.go @@ -6,6 +6,7 @@ import ( "io" "net/http" "strconv" + "strings" "github.com/caddyserver/caddy" "github.com/caddyserver/caddy/modules/caddyhttp" @@ -37,14 +38,21 @@ func (t *Templates) ServeHTTP(w http.ResponseWriter, r *http.Request, next caddy buf.Reset() defer bufPool.Put(buf) - rr := caddyhttp.NewResponseRecorder(w, buf) + shouldBuf := func(status int) bool { + return strings.HasPrefix(w.Header().Get("Content-Type"), "text/") + } + + rec := caddyhttp.NewResponseRecorder(w, buf, shouldBuf) - err := next.ServeHTTP(rr, r) + err := next.ServeHTTP(rec, r) if err != nil { return err } + if !rec.Buffered() { + return nil + } - err = t.executeTemplate(rr, r) + err = t.executeTemplate(rec, r) if err != nil { return err } @@ -54,7 +62,7 @@ func (t *Templates) ServeHTTP(w http.ResponseWriter, r *http.Request, next caddy w.Header().Del("Etag") // don't know a way to quickly generate etag for dynamic content w.Header().Del("Last-Modified") // useless for dynamic content since it's always changing - w.WriteHeader(rr.Status()) + w.WriteHeader(rec.Status()) io.Copy(w, buf) return nil -- cgit v1.2.3