8 changed files with 133 additions and 34 deletions
@ -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) |
Loading…
Reference in new issue