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)
This commit is contained in:
Matthew Holt
2019-06-21 14:36:26 -06:00
parent 81a9e125b5
commit d49f762f6d
12 changed files with 109 additions and 35 deletions

View File

@ -4,6 +4,7 @@ import (
"bytes"
"net/http"
"strconv"
"strings"
"sync"
"gopkg.in/russross/blackfriday.v2"
@ -28,12 +29,19 @@ func (m Markdown) ServeHTTP(w http.ResponseWriter, r *http.Request, next caddyht
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/")
}
err := next.ServeHTTP(rr, r)
rec := caddyhttp.NewResponseRecorder(w, buf, shouldBuf)
err := next.ServeHTTP(rec, r)
if err != nil {
return err
}
if !rec.Buffered() {
return nil
}
output := blackfriday.Run(buf.Bytes())
@ -43,7 +51,7 @@ func (m Markdown) ServeHTTP(w http.ResponseWriter, r *http.Request, next caddyht
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())
w.Write(output)
return nil