2019-08-26 13:20:06 +03:00
package inflightreq
import (
"context"
"fmt"
"net/http"
"github.com/containous/traefik/v2/pkg/config/dynamic"
"github.com/containous/traefik/v2/pkg/log"
"github.com/containous/traefik/v2/pkg/middlewares"
"github.com/containous/traefik/v2/pkg/tracing"
"github.com/opentracing/opentracing-go/ext"
"github.com/vulcand/oxy/connlimit"
)
const (
typeName = "InFlightReq"
)
type inFlightReq struct {
handler http . Handler
name string
}
// New creates a max request middleware.
2020-04-29 19:32:05 +03:00
// If no source criterion is provided in the config, it defaults to RequestHost.
2019-08-26 13:20:06 +03:00
func New ( ctx context . Context , next http . Handler , config dynamic . InFlightReq , name string ) ( http . Handler , error ) {
ctxLog := log . With ( ctx , log . Str ( log . MiddlewareName , name ) , log . Str ( log . MiddlewareType , typeName ) )
log . FromContext ( ctxLog ) . Debug ( "Creating middleware" )
if config . SourceCriterion == nil ||
config . SourceCriterion . IPStrategy == nil &&
config . SourceCriterion . RequestHeaderName == "" && ! config . SourceCriterion . RequestHost {
config . SourceCriterion = & dynamic . SourceCriterion {
RequestHost : true ,
}
}
sourceMatcher , err := middlewares . GetSourceExtractor ( ctxLog , config . SourceCriterion )
if err != nil {
2020-05-11 13:06:07 +03:00
return nil , fmt . Errorf ( "error creating requests limiter: %w" , err )
2019-08-26 13:20:06 +03:00
}
handler , err := connlimit . New ( next , sourceMatcher , config . Amount )
if err != nil {
2020-05-11 13:06:07 +03:00
return nil , fmt . Errorf ( "error creating connection limit: %w" , err )
2019-08-26 13:20:06 +03:00
}
return & inFlightReq { handler : handler , name : name } , nil
}
func ( i * inFlightReq ) GetTracingInformation ( ) ( string , ext . SpanKindEnum ) {
return i . name , tracing . SpanKindNoneEnum
}
func ( i * inFlightReq ) ServeHTTP ( rw http . ResponseWriter , req * http . Request ) {
i . handler . ServeHTTP ( rw , req )
}