From 3ed6b48440df5e3d0e8d4cbfa635080137c8beea Mon Sep 17 00:00:00 2001 From: Bartosz Blimke Date: Wed, 21 Feb 2024 04:06:33 +0100 Subject: [PATCH] Revert "Revert "Merge pull request #300 from tbeauvais/httpclient_thread_safe"" This reverts commit 20d49b0bed07c3a8ba36e0fd2cdbcb28600c4b85. --- .../http_lib_adapters/httpclient_adapter.rb | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/webmock/http_lib_adapters/httpclient_adapter.rb b/lib/webmock/http_lib_adapters/httpclient_adapter.rb index 590e51ba..26064991 100644 --- a/lib/webmock/http_lib_adapters/httpclient_adapter.rb +++ b/lib/webmock/http_lib_adapters/httpclient_adapter.rb @@ -45,6 +45,8 @@ def self.disable! end module WebMockHTTPClients + WEBMOCK_HTTPCLIENT_RESPONSES = :webmock_httpclient_responses + WEBMOCK_HTTPCLIENT_REQUEST_SIGNATURES = :webmock_httpclient_request_signatures REQUEST_RESPONSE_LOCK = Mutex.new @@ -57,6 +59,9 @@ def do_get_stream(req, proxy, conn, &block) end def do_get(req, proxy, conn, stream = false, &block) + + clear_thread_variables unless conn.async_thread + request_signature = build_request_signature(req, :reuse_existing) WebMock::RequestRegistry.instance.requested_signatures.put(request_signature) @@ -103,12 +108,16 @@ def do_get(req, proxy, conn, stream = false, &block) end def do_request_async(method, uri, query, body, extheader) + clear_thread_variables req = create_request(method, uri, query, body, extheader) request_signature = build_request_signature(req) synchronize_request_response { webmock_request_signatures << request_signature } if webmock_responses[request_signature] || WebMock.net_connect_allowed?(request_signature.uri) - super + conn = super + conn.async_thread[WEBMOCK_HTTPCLIENT_REQUEST_SIGNATURES] = Thread.current[WEBMOCK_HTTPCLIENT_REQUEST_SIGNATURES] + conn.async_thread[WEBMOCK_HTTPCLIENT_RESPONSES] = Thread.current[WEBMOCK_HTTPCLIENT_RESPONSES] + conn else raise WebMock::NetConnectNotAllowedError.new(request_signature) end @@ -188,7 +197,7 @@ def build_request_signature(req, reuse_existing = false) end def webmock_responses - @webmock_responses ||= Hash.new do |hash, request_signature| + Thread.current[WEBMOCK_HTTPCLIENT_RESPONSES] ||= Hash.new do |hash, request_signature| synchronize_request_response do hash[request_signature] = WebMock::StubRegistry.instance.response_for_request(request_signature) end @@ -196,7 +205,7 @@ def webmock_responses end def webmock_request_signatures - @webmock_request_signatures ||= [] + Thread.current[WEBMOCK_HTTPCLIENT_REQUEST_SIGNATURES] ||= [] end def previous_signature_for(signature) @@ -228,6 +237,11 @@ def synchronize_request_response end end end + + def clear_thread_variables + Thread.current[WEBMOCK_HTTPCLIENT_REQUEST_SIGNATURES] = nil + Thread.current[WEBMOCK_HTTPCLIENT_RESPONSES] = nil + end end class WebMockHTTPClient < HTTPClient