From aa6c5fde07574b48593ddcbf95ca6988c2172b4a Mon Sep 17 00:00:00 2001 From: Matt Holt Date: Thu, 19 Mar 2020 11:51:28 -0600 Subject: httpcaddyfile: Unify strip_prefix, strip_suffix, uri_replace directives (#3157) * rewrite: strip_prefix, strip_suffix, uri_replace -> uri (closes #3140) * Add period, to satisfy @whitestrake :) and my own OCD * Restore implied / prefix --- modules/caddyhttp/rewrite/caddyfile.go | 127 +++++++++++++-------------------- 1 file changed, 51 insertions(+), 76 deletions(-) (limited to 'modules/caddyhttp/rewrite') diff --git a/modules/caddyhttp/rewrite/caddyfile.go b/modules/caddyhttp/rewrite/caddyfile.go index e69ea21..ee7dd23 100644 --- a/modules/caddyhttp/rewrite/caddyfile.go +++ b/modules/caddyhttp/rewrite/caddyfile.go @@ -24,9 +24,7 @@ import ( func init() { httpcaddyfile.RegisterHandlerDirective("rewrite", parseCaddyfileRewrite) - httpcaddyfile.RegisterHandlerDirective("strip_prefix", parseCaddyfileStripPrefix) - httpcaddyfile.RegisterHandlerDirective("strip_suffix", parseCaddyfileStripSuffix) - httpcaddyfile.RegisterHandlerDirective("uri_replace", parseCaddyfileURIReplace) + httpcaddyfile.RegisterHandlerDirective("uri", parseCaddyfileURI) } // parseCaddyfileRewrite sets up a basic rewrite handler from Caddyfile tokens. Syntax: @@ -49,89 +47,66 @@ func parseCaddyfileRewrite(h httpcaddyfile.Helper) (caddyhttp.MiddlewareHandler, return rewr, nil } -// parseCaddyfileStripPrefix sets up a handler from Caddyfile tokens. Syntax: +// parseCaddyfileURI sets up a handler for manipulating (but not "rewriting") the +// URI from Caddyfile tokens. Syntax: // -// strip_prefix [] +// uri [] strip_prefix|strip_suffix|replace [ []] // -// The request path will be stripped the given prefix. -func parseCaddyfileStripPrefix(h httpcaddyfile.Helper) (caddyhttp.MiddlewareHandler, error) { +// If strip_prefix or strip_suffix are used, then will be stripped +// only if it is the beginning or the end, respectively, of the URI path. If +// replace is used, then will be replaced with across +// the whole URI, up to times (or unlimited if unspecified). +func parseCaddyfileURI(h httpcaddyfile.Helper) (caddyhttp.MiddlewareHandler, error) { var rewr Rewrite - for h.Next() { - if !h.NextArg() { - return nil, h.ArgErr() - } - rewr.StripPathPrefix = h.Val() - if !strings.HasPrefix(rewr.StripPathPrefix, "/") { - rewr.StripPathPrefix = "/" + rewr.StripPathPrefix - } - if h.NextArg() { - return nil, h.ArgErr() - } - } - return rewr, nil -} - -// parseCaddyfileStripSuffix sets up a handler from Caddyfile tokens. Syntax: -// -// strip_suffix [] -// -// The request path will be stripped the given suffix. -func parseCaddyfileStripSuffix(h httpcaddyfile.Helper) (caddyhttp.MiddlewareHandler, error) { - var rewr Rewrite - for h.Next() { - if !h.NextArg() { - return nil, h.ArgErr() - } - rewr.StripPathSuffix = h.Val() - if h.NextArg() { - return nil, h.ArgErr() - } - } - return rewr, nil -} - -// parseCaddyfileURIReplace sets up a handler from Caddyfile tokens. Syntax: -// -// uri_replace [] [] -// -// Substring replacements will be performed on the request URI up to the -// number specified by limit, if any (default = 0, or no limit). -func parseCaddyfileURIReplace(h httpcaddyfile.Helper) (caddyhttp.MiddlewareHandler, error) { - var rewr Rewrite - - var repls []replacer - for h.Next() { args := h.RemainingArgs() - var find, replace, lim string - switch len(args) { - case 3: - lim = args[2] - fallthrough - case 2: - find = args[0] - replace = args[1] - default: + if len(args) < 2 { return nil, h.ArgErr() } + switch args[0] { + case "strip_prefix": + if len(args) > 2 { + return nil, h.ArgErr() + } + rewr.StripPathPrefix = args[1] + if !strings.HasPrefix(rewr.StripPathPrefix, "/") { + rewr.StripPathPrefix = "/" + rewr.StripPathPrefix + } + case "strip_suffix": + if len(args) > 2 { + return nil, h.ArgErr() + } + rewr.StripPathSuffix = args[1] + case "replace": + var find, replace, lim string + switch len(args) { + case 4: + lim = args[3] + fallthrough + case 3: + find = args[1] + replace = args[2] + default: + return nil, h.ArgErr() + } - var limInt int - if lim != "" { - var err error - limInt, err = strconv.Atoi(lim) - if err != nil { - return nil, h.Errf("limit must be an integer; invalid: %v", err) + var limInt int + if lim != "" { + var err error + limInt, err = strconv.Atoi(lim) + if err != nil { + return nil, h.Errf("limit must be an integer; invalid: %v", err) + } } - } - repls = append(repls, replacer{ - Find: find, - Replace: replace, - Limit: limInt, - }) + rewr.URISubstring = append(rewr.URISubstring, replacer{ + Find: find, + Replace: replace, + Limit: limInt, + }) + default: + return nil, h.Errf("unrecognized URI manipulation '%s'", args[0]) + } } - - rewr.URISubstring = repls - return rewr, nil } -- cgit v1.2.3