2018-11-14 12:18:03 +03:00
package buffering
import (
"context"
"net/http"
"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"
2022-12-05 13:30:05 +03:00
oxybuffer "github.com/vulcand/oxy/v2/buffer"
2018-11-14 12:18:03 +03:00
)
const (
typeName = "Buffer"
)
type buffer struct {
name string
buffer * oxybuffer . Buffer
}
// New creates a buffering middleware.
2019-07-10 10:26:04 +03:00
func New ( ctx context . Context , next http . Handler , config dynamic . Buffering , name string ) ( http . Handler , error ) {
2019-09-13 20:28:04 +03:00
logger := log . FromContext ( middlewares . GetLoggerCtx ( ctx , name , typeName ) )
2018-11-14 12:18:03 +03:00
logger . Debug ( "Creating middleware" )
2019-09-05 14:42:04 +03:00
logger . Debugf ( "Setting up buffering: request limits: %d (mem), %d (max), response limits: %d (mem), %d (max) with retry: '%s'" ,
2018-11-14 12:18:03 +03:00
config . MemRequestBodyBytes , config . MaxRequestBodyBytes , config . MemResponseBodyBytes , config . MaxResponseBodyBytes , config . RetryExpression )
oxyBuffer , err := oxybuffer . New (
next ,
oxybuffer . MemRequestBodyBytes ( config . MemRequestBodyBytes ) ,
oxybuffer . MaxRequestBodyBytes ( config . MaxRequestBodyBytes ) ,
oxybuffer . MemResponseBodyBytes ( config . MemResponseBodyBytes ) ,
oxybuffer . MaxResponseBodyBytes ( config . MaxResponseBodyBytes ) ,
2022-12-05 13:30:05 +03:00
oxybuffer . Cond ( len ( config . RetryExpression ) > 0 , oxybuffer . Retry ( config . RetryExpression ) ) ,
2018-11-14 12:18:03 +03:00
)
if err != nil {
return nil , err
}
return & buffer {
name : name ,
buffer : oxyBuffer ,
} , nil
}
func ( b * buffer ) GetTracingInformation ( ) ( string , ext . SpanKindEnum ) {
return b . name , tracing . SpanKindNoneEnum
}
func ( b * buffer ) ServeHTTP ( rw http . ResponseWriter , req * http . Request ) {
b . buffer . ServeHTTP ( rw , req )
}