diff --git a/pkg/protocols/http/httpclientpool/clientpool.go b/pkg/protocols/http/httpclientpool/clientpool.go index 2c244556a..da7d5467e 100644 --- a/pkg/protocols/http/httpclientpool/clientpool.go +++ b/pkg/protocols/http/httpclientpool/clientpool.go @@ -32,6 +32,7 @@ var ( forceMaxRedirects int normalClient *retryablehttp.Client clientPool *mapsutil.SyncLockMap[string, *retryablehttp.Client] + rawHttpClientMu sync.Mutex ) // Init initializes the clientpool implementation @@ -102,6 +103,22 @@ type Configuration struct { ResponseHeaderTimeout time.Duration } +func (c *Configuration) Clone() *Configuration { + clone := *c + if c.Connection != nil { + cloneConnection := &ConnectionConfiguration{ + DisableKeepAlive: c.Connection.DisableKeepAlive, + } + if c.Connection.HasCookieJar() { + cookiejar := *c.Connection.GetCookieJar() + cloneConnection.SetCookieJar(&cookiejar) + } + clone.Connection = cloneConnection + } + + return &clone +} + // Hash returns the hash of the configuration to allow client pooling func (c *Configuration) Hash() string { builder := &strings.Builder{} @@ -131,6 +148,9 @@ func (c *Configuration) HasStandardOptions() bool { // GetRawHTTP returns the rawhttp request client func GetRawHTTP(options *protocols.ExecutorOptions) *rawhttp.Client { + rawHttpClientMu.Lock() + defer rawHttpClientMu.Unlock() + if rawHttpClient == nil { rawHttpOptions := rawhttp.DefaultOptions if types.ProxyURL != "" { diff --git a/pkg/protocols/http/request.go b/pkg/protocols/http/request.go index 98e193247..395532559 100644 --- a/pkg/protocols/http/request.go +++ b/pkg/protocols/http/request.go @@ -770,7 +770,7 @@ func (request *Request) executeRequest(input *contextargs.Context, generatedRequ // check for cookie related configuration if input.CookieJar != nil { - connConfiguration := request.connConfiguration + connConfiguration := request.connConfiguration.Clone() connConfiguration.Connection.SetCookieJar(input.CookieJar) modifiedConfig = connConfiguration } @@ -778,7 +778,8 @@ func (request *Request) executeRequest(input *contextargs.Context, generatedRequ updatedTimeout, ok := generatedRequest.request.Context().Value(httpclientpool.WithCustomTimeout{}).(httpclientpool.WithCustomTimeout) if ok { if modifiedConfig == nil { - modifiedConfig = request.connConfiguration + connConfiguration := request.connConfiguration.Clone() + modifiedConfig = connConfiguration } modifiedConfig.ResponseHeaderTimeout = updatedTimeout.Timeout }