diff options
Diffstat (limited to 'modules/caddyhttp/markdown')
-rw-r--r-- | modules/caddyhttp/markdown/markdown.go | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/modules/caddyhttp/markdown/markdown.go b/modules/caddyhttp/markdown/markdown.go new file mode 100644 index 0000000..9c23e44 --- /dev/null +++ b/modules/caddyhttp/markdown/markdown.go @@ -0,0 +1,53 @@ +package markdown + +import ( + "net/http" + "strconv" + + "gopkg.in/russross/blackfriday.v2" + + "bitbucket.org/lightcodelabs/caddy2" + "bitbucket.org/lightcodelabs/caddy2/modules/caddyhttp" +) + +func init() { + caddy2.RegisterModule(caddy2.Module{ + Name: "http.middleware.markdown", + New: func() interface{} { return new(Markdown) }, + }) +} + +// Markdown is a middleware for rendering a Markdown response body. +type Markdown struct { +} + +func (m Markdown) ServeHTTP(w http.ResponseWriter, r *http.Request, next caddyhttp.Handler) error { + mrw := &markdownResponseWriter{ + ResponseWriterWrapper: &caddyhttp.ResponseWriterWrapper{ResponseWriter: w}, + } + return next.ServeHTTP(mrw, r) +} + +type markdownResponseWriter struct { + *caddyhttp.ResponseWriterWrapper + statusCode int + wroteHeader bool +} + +func (mrw *markdownResponseWriter) WriteHeader(code int) { + mrw.statusCode = code +} + +func (mrw *markdownResponseWriter) Write(d []byte) (int, error) { + output := blackfriday.Run(d) + if !mrw.wroteHeader { + mrw.Header().Set("Content-Length", strconv.Itoa(len(output))) + mrw.Header().Set("Content-Type", "text/html; charset=utf-8") + mrw.WriteHeader(mrw.statusCode) + mrw.wroteHeader = true + } + return mrw.ResponseWriter.Write(output) +} + +// Interface guard +var _ caddyhttp.MiddlewareHandler = (*Markdown)(nil) |