summaryrefslogtreecommitdiff
path: root/modules/caddyhttp/rewrite
diff options
context:
space:
mode:
Diffstat (limited to 'modules/caddyhttp/rewrite')
-rw-r--r--modules/caddyhttp/rewrite/rewrite.go71
1 files changed, 71 insertions, 0 deletions
diff --git a/modules/caddyhttp/rewrite/rewrite.go b/modules/caddyhttp/rewrite/rewrite.go
new file mode 100644
index 0000000..1afb8a4
--- /dev/null
+++ b/modules/caddyhttp/rewrite/rewrite.go
@@ -0,0 +1,71 @@
+package headers
+
+import (
+ "net/http"
+ "net/url"
+ "strings"
+
+ "bitbucket.org/lightcodelabs/caddy2"
+ "bitbucket.org/lightcodelabs/caddy2/modules/caddyhttp"
+)
+
+func init() {
+ caddy2.RegisterModule(caddy2.Module{
+ Name: "http.middleware.rewrite",
+ New: func() (interface{}, error) { return new(Rewrite), nil },
+ })
+}
+
+// Rewrite is a middleware which can rewrite HTTP requests.
+type Rewrite struct {
+ Method string `json:"method"`
+ URI string `json:"uri"`
+ Rehandle bool `json:"rehandle"`
+}
+
+func (rewr Rewrite) ServeHTTP(w http.ResponseWriter, r *http.Request, next caddyhttp.Handler) error {
+ repl := r.Context().Value(caddy2.ReplacerCtxKey).(caddy2.Replacer)
+ var rehandleNeeded bool
+
+ if rewr.Method != "" {
+ method := r.Method
+ r.Method = strings.ToUpper(repl.ReplaceAll(rewr.Method, ""))
+ if r.Method != method {
+ rehandleNeeded = true
+ }
+ }
+
+ if rewr.URI != "" {
+ // TODO: clean this all up, I don't think it's right
+
+ oldURI := r.RequestURI
+ newURI := repl.ReplaceAll(rewr.URI, "")
+ u, err := url.Parse(newURI)
+ if err != nil {
+ return caddyhttp.Error(http.StatusInternalServerError, err)
+ }
+
+ r.RequestURI = newURI
+
+ r.URL.Path = u.Path
+ if u.RawQuery != "" {
+ r.URL.RawQuery = u.RawQuery
+ }
+ if u.Fragment != "" {
+ r.URL.Fragment = u.Fragment
+ }
+
+ if newURI != oldURI {
+ rehandleNeeded = true
+ }
+ }
+
+ if rehandleNeeded && rewr.Rehandle {
+ return caddyhttp.ErrRehandle
+ }
+
+ return next.ServeHTTP(w, r)
+}
+
+// Interface guard
+var _ caddyhttp.MiddlewareHandler = (*Rewrite)(nil)