Commit 104a5998 authored by Matt Holt's avatar Matt Holt

Merge pull request #251 from abiosoft/master

rewrite: Use middleware.Replacer
parents 6cbd3ab0 7f9fa573
...@@ -3,6 +3,7 @@ package middleware ...@@ -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 ...@@ -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 @@ ...@@ -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) ...@@ -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 { ...@@ -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) { ...@@ -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", ""},
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment