mirror of
https://github.com/caddyserver/caddy.git
synced 2024-11-29 20:24:11 +08:00
Merge pull request #251 from abiosoft/master
rewrite: Use middleware.Replacer
This commit is contained in:
commit
104a5998cb
|
@ -3,6 +3,7 @@ package middleware
|
||||||
import (
|
import (
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"path"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
@ -63,6 +64,14 @@ func NewReplacer(r *http.Request, rr *responseRecorder, emptyValue string) Repla
|
||||||
"{when}": func() string {
|
"{when}": func() string {
|
||||||
return time.Now().Format(timeFormat)
|
return time.Now().Format(timeFormat)
|
||||||
}(),
|
}(),
|
||||||
|
"{file}": func() string {
|
||||||
|
_, file := path.Split(r.URL.Path)
|
||||||
|
return file
|
||||||
|
}(),
|
||||||
|
"{dir}": func() string {
|
||||||
|
dir, _ := path.Split(r.URL.Path)
|
||||||
|
return dir
|
||||||
|
}(),
|
||||||
},
|
},
|
||||||
emptyValue: emptyValue,
|
emptyValue: emptyValue,
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,9 +3,8 @@
|
||||||
package rewrite
|
package rewrite
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"path"
|
"path"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
@ -96,15 +95,6 @@ func NewRegexpRule(base, pattern, to string, ext []string) (*RegexpRule, error)
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// regexpVars are variables that can be used for To (rewrite destination path).
|
|
||||||
var regexpVars = []string{
|
|
||||||
"{path}",
|
|
||||||
"{query}",
|
|
||||||
"{file}",
|
|
||||||
"{dir}",
|
|
||||||
"{frag}",
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rewrite rewrites the internal location of the current request.
|
// Rewrite rewrites the internal location of the current request.
|
||||||
func (r *RegexpRule) Rewrite(req *http.Request) bool {
|
func (r *RegexpRule) Rewrite(req *http.Request) bool {
|
||||||
rPath := req.URL.Path
|
rPath := req.URL.Path
|
||||||
|
@ -119,32 +109,19 @@ func (r *RegexpRule) Rewrite(req *http.Request) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// include trailing slash in regexp if present
|
||||||
|
start := len(r.Base)
|
||||||
|
if strings.HasSuffix(r.Base, "/") {
|
||||||
|
start -= 1
|
||||||
|
}
|
||||||
|
|
||||||
// validate regexp
|
// validate regexp
|
||||||
if !r.MatchString(rPath[len(r.Base):]) {
|
if !r.MatchString(rPath[start:]) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
to := r.To
|
// replace variables
|
||||||
|
to := path.Clean(middleware.NewReplacer(req, nil, "").Replace(r.To))
|
||||||
// check variables
|
|
||||||
for _, v := range regexpVars {
|
|
||||||
if strings.Contains(r.To, v) {
|
|
||||||
switch v {
|
|
||||||
case "{path}":
|
|
||||||
to = strings.Replace(to, v, req.URL.Path[1:], -1)
|
|
||||||
case "{query}":
|
|
||||||
to = strings.Replace(to, v, req.URL.RawQuery, -1)
|
|
||||||
case "{frag}":
|
|
||||||
to = strings.Replace(to, v, req.URL.Fragment, -1)
|
|
||||||
case "{file}":
|
|
||||||
_, file := path.Split(req.URL.Path)
|
|
||||||
to = strings.Replace(to, v, file, -1)
|
|
||||||
case "{dir}":
|
|
||||||
dir, _ := path.Split(req.URL.Path)
|
|
||||||
to = path.Clean(strings.Replace(to, v, dir, -1))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// validate resulting path
|
// validate resulting path
|
||||||
url, err := url.Parse(to)
|
url, err := url.Parse(to)
|
||||||
|
|
|
@ -28,7 +28,7 @@ func TestRewrite(t *testing.T) {
|
||||||
[]string{"/ab/", "ab", "/ab?type=html&{query}", ".html|"},
|
[]string{"/ab/", "ab", "/ab?type=html&{query}", ".html|"},
|
||||||
[]string{"/abc/", "ab", "/abc/{file}", ".html|"},
|
[]string{"/abc/", "ab", "/abc/{file}", ".html|"},
|
||||||
[]string{"/abcd/", "ab", "/a/{dir}/{file}", ".html|"},
|
[]string{"/abcd/", "ab", "/a/{dir}/{file}", ".html|"},
|
||||||
[]string{"/abcde/", "ab", "/a#{frag}", ".html|"},
|
[]string{"/abcde/", "ab", "/a#{fragment}", ".html|"},
|
||||||
[]string{"/ab/", `.*\.jpg`, "/ajpg", ""},
|
[]string{"/ab/", `.*\.jpg`, "/ajpg", ""},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user