2018-11-14 12:18:03 +03:00
package replacepath
import (
"context"
"net/http"
2020-03-03 18:20:05 +03:00
"net/url"
2018-11-14 12:18:03 +03:00
"github.com/opentracing/opentracing-go/ext"
2020-09-16 16:46:04 +03:00
"github.com/traefik/traefik/v2/pkg/config/dynamic"
"github.com/traefik/traefik/v2/pkg/log"
"github.com/traefik/traefik/v2/pkg/middlewares"
"github.com/traefik/traefik/v2/pkg/tracing"
2018-11-14 12:18:03 +03:00
)
const (
// ReplacedPathHeader is the default header to set the old path to.
ReplacedPathHeader = "X-Replaced-Path"
typeName = "ReplacePath"
)
// ReplacePath is a middleware used to replace the path of a URL request.
type replacePath struct {
next http . Handler
path string
name string
}
// New creates a new replace path middleware.
2019-07-10 10:26:04 +03:00
func New ( ctx context . Context , next http . Handler , config dynamic . ReplacePath , name string ) ( http . Handler , error ) {
2019-09-13 20:28:04 +03:00
log . FromContext ( middlewares . GetLoggerCtx ( ctx , name , typeName ) ) . Debug ( "Creating middleware" )
2018-11-14 12:18:03 +03:00
return & replacePath {
next : next ,
path : config . Path ,
name : name ,
} , nil
}
func ( r * replacePath ) GetTracingInformation ( ) ( string , ext . SpanKindEnum ) {
return r . name , tracing . SpanKindNoneEnum
}
func ( r * replacePath ) ServeHTTP ( rw http . ResponseWriter , req * http . Request ) {
2021-10-08 12:32:08 +03:00
currentPath := req . URL . RawPath
if currentPath == "" {
currentPath = req . URL . EscapedPath ( )
2020-03-03 18:20:05 +03:00
}
2021-10-08 12:32:08 +03:00
req . Header . Add ( ReplacedPathHeader , currentPath )
2020-03-03 18:20:05 +03:00
req . URL . RawPath = r . path
var err error
req . URL . Path , err = url . PathUnescape ( req . URL . RawPath )
if err != nil {
log . FromContext ( middlewares . GetLoggerCtx ( context . Background ( ) , r . name , typeName ) ) . Error ( err )
http . Error ( rw , err . Error ( ) , http . StatusInternalServerError )
return
}
2018-11-14 12:18:03 +03:00
req . RequestURI = req . URL . RequestURI ( )
2019-09-13 20:28:04 +03:00
2018-11-14 12:18:03 +03:00
r . next . ServeHTTP ( rw , req )
}