From e40bbecb16d196d2d700a9484e53c11b64dfe8d9 Mon Sep 17 00:00:00 2001 From: Matthew Holt Date: Tue, 7 May 2019 09:56:13 -0600 Subject: Rough implementation of auto HTTP->HTTPS redirects Also added GracePeriod for server shutdowns --- modules/caddyhttp/staticresp.go | 57 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 modules/caddyhttp/staticresp.go (limited to 'modules/caddyhttp/staticresp.go') diff --git a/modules/caddyhttp/staticresp.go b/modules/caddyhttp/staticresp.go new file mode 100644 index 0000000..dca60cb --- /dev/null +++ b/modules/caddyhttp/staticresp.go @@ -0,0 +1,57 @@ +package caddyhttp + +import ( + "fmt" + "net/http" + + "bitbucket.org/lightcodelabs/caddy2" +) + +func init() { + caddy2.RegisterModule(caddy2.Module{ + Name: "http.responders.static", + New: func() (interface{}, error) { return new(Static), nil }, + }) +} + +// Static implements a simple responder for static responses. +// It is Caddy's default responder. TODO: Or is it? +type Static struct { + StatusCode int `json:"status_code"` + Headers http.Header `json:"headers"` + Body string `json:"body"` + Close bool `json:"close"` +} + +func (s Static) ServeHTTP(w http.ResponseWriter, r *http.Request) error { + repl := r.Context().Value(ReplacerCtxKey).(*Replacer) + + // close the connection + r.Close = s.Close + + // set all headers, with replacements + for field, vals := range s.Headers { + field = repl.Replace(field, "") + for i := range vals { + vals[i] = repl.Replace(vals[i], "") + } + w.Header()[field] = vals + } + + // write the headers with a status code + statusCode := s.StatusCode + if statusCode == 0 { + statusCode = http.StatusOK + } + w.WriteHeader(statusCode) + + // write the response body, with replacements + if s.Body != "" { + fmt.Fprint(w, repl.Replace(s.Body, "")) + } + + return nil +} + +// Interface guard +var _ Handler = (*Static)(nil) -- cgit v1.2.3