2017-03-24 12:07:59 +01:00
package middlewares
import (
2018-07-31 03:28:03 -06:00
"context"
2017-03-24 12:07:59 +01:00
"net/http"
"github.com/containous/mux"
"github.com/containous/traefik/log"
)
// StripPrefixRegex is a middleware used to strip prefix from an URL request
type StripPrefixRegex struct {
Handler http . Handler
router * mux . Router
}
// NewStripPrefixRegex builds a new StripPrefixRegex given a handler and prefixes
func NewStripPrefixRegex ( handler http . Handler , prefixes [ ] string ) * StripPrefixRegex {
stripPrefix := StripPrefixRegex { Handler : handler , router : mux . NewRouter ( ) }
for _ , prefix := range prefixes {
stripPrefix . router . PathPrefix ( prefix )
}
return & stripPrefix
}
func ( s * StripPrefixRegex ) ServeHTTP ( w http . ResponseWriter , r * http . Request ) {
var match mux . RouteMatch
if s . router . Match ( r , & match ) {
params := make ( [ ] string , 0 , len ( match . Vars ) * 2 )
for key , val := range match . Vars {
params = append ( params , key )
params = append ( params , val )
}
prefix , err := match . Route . URL ( params ... )
if err != nil || len ( prefix . Path ) > len ( r . URL . Path ) {
log . Error ( "Error in stripPrefix middleware" , err )
return
}
2018-08-14 10:38:04 -06:00
rawReqPath := r . URL . Path
2017-03-24 12:07:59 +01:00
r . URL . Path = r . URL . Path [ len ( prefix . Path ) : ]
2017-11-21 14:28:03 +01:00
if r . URL . RawPath != "" {
r . URL . RawPath = r . URL . RawPath [ len ( prefix . Path ) : ]
}
2018-08-14 10:38:04 -06:00
r = r . WithContext ( context . WithValue ( r . Context ( ) , StripPrefixKey , rawReqPath ) )
2017-05-28 05:50:03 +02:00
r . Header . Add ( ForwardedPrefixHeader , prefix . Path )
2018-08-14 10:38:04 -06:00
r . RequestURI = ensureLeadingSlash ( r . URL . RequestURI ( ) )
2017-03-24 12:07:59 +01:00
s . Handler . ServeHTTP ( w , r )
return
}
http . NotFound ( w , r )
}
// SetHandler sets handler
func ( s * StripPrefixRegex ) SetHandler ( Handler http . Handler ) {
s . Handler = Handler
}