Merge pull request #931 from Juliens/addprefix

Add Rule AddPrefix
This commit is contained in:
Vincent Demeester 2016-12-21 21:45:09 +01:00 committed by GitHub
commit e1ed8b71f6
4 changed files with 44 additions and 4 deletions

View file

@ -85,6 +85,7 @@ Frontends can be defined using the following rules:
- `PathStrip`: Same as `Path` but strip the given prefix from the request URL's Path. - `PathStrip`: Same as `Path` but strip the given prefix from the request URL's Path.
- `PathPrefix`: PathPrefix adds a matcher for the URL path prefixes. This matches if the given template is a prefix of the full URL path. - `PathPrefix`: PathPrefix adds a matcher for the URL path prefixes. This matches if the given template is a prefix of the full URL path.
- `PathPrefixStrip`: Same as `PathPrefix` but strip the given prefix from the request URL's Path. - `PathPrefixStrip`: Same as `PathPrefix` but strip the given prefix from the request URL's Path.
- `AddPrefix` : Add prefix from the request URL's Path.
You can use multiple rules by separating them by `;` You can use multiple rules by separating them by `;`

22
middlewares/addPrefix.go Normal file
View file

@ -0,0 +1,22 @@
package middlewares
import (
"net/http"
)
// AddPrefix is a middleware used to add prefix to an URL request
type AddPrefix struct {
Handler http.Handler
Prefix string
}
func (s *AddPrefix) ServeHTTP(w http.ResponseWriter, r *http.Request) {
r.URL.Path = s.Prefix + r.URL.Path
r.RequestURI = r.URL.RequestURI()
s.Handler.ServeHTTP(w, r)
}
// SetHandler sets handler
func (s *AddPrefix) SetHandler(Handler http.Handler) {
s.Handler = Handler
}

View file

@ -74,6 +74,13 @@ func (r *Rules) pathStrip(paths ...string) *mux.Route {
return r.route.route return r.route.route
} }
func (r *Rules) addPrefix(paths ...string) *mux.Route {
for _, path := range paths {
r.route.addPrefix = path
}
return r.route.route
}
func (r *Rules) pathPrefixStrip(paths ...string) *mux.Route { func (r *Rules) pathPrefixStrip(paths ...string) *mux.Route {
sort.Sort(bySize(paths)) sort.Sort(bySize(paths))
r.route.stripPrefixes = paths r.route.stripPrefixes = paths
@ -107,6 +114,7 @@ func (r *Rules) parseRules(expression string, onRule func(functionName string, f
"Method": r.methods, "Method": r.methods,
"Headers": r.headers, "Headers": r.headers,
"HeadersRegexp": r.headersRegexp, "HeadersRegexp": r.headersRegexp,
"AddPrefix": r.addPrefix,
} }
if len(expression) == 0 { if len(expression) == 0 {

View file

@ -64,6 +64,7 @@ type serverEntryPoint struct {
type serverRoute struct { type serverRoute struct {
route *mux.Route route *mux.Route
stripPrefixes []string stripPrefixes []string
addPrefix string
} }
// NewServer returns an initialized Server. // NewServer returns an initialized Server.
@ -716,15 +717,23 @@ func (server *Server) loadConfig(configurations configs, globalConfiguration Glo
} }
func (server *Server) wireFrontendBackend(serverRoute *serverRoute, handler http.Handler) { func (server *Server) wireFrontendBackend(serverRoute *serverRoute, handler http.Handler) {
// add prefix
if len(serverRoute.addPrefix) > 0 {
handler = &middlewares.AddPrefix{
Prefix: serverRoute.addPrefix,
Handler: handler,
}
}
// strip prefix // strip prefix
if len(serverRoute.stripPrefixes) > 0 { if len(serverRoute.stripPrefixes) > 0 {
serverRoute.route.Handler(&middlewares.StripPrefix{ handler = &middlewares.StripPrefix{
Prefixes: serverRoute.stripPrefixes, Prefixes: serverRoute.stripPrefixes,
Handler: handler, Handler: handler,
}) }
} else {
serverRoute.route.Handler(handler)
} }
serverRoute.route.Handler(handler)
} }
func (server *Server) loadEntryPointConfig(entryPointName string, entryPoint *EntryPoint) (http.Handler, error) { func (server *Server) loadEntryPointConfig(entryPointName string, entryPoint *EntryPoint) (http.Handler, error) {