From d5f79a66277e6fa5aadb17f325c785a26b5e47fa Mon Sep 17 00:00:00 2001 From: luke Date: Fri, 4 Jun 2021 16:09:58 +0100 Subject: [PATCH 1/2] BeforeSendingCallbacks receive the instance of the active PendingRequest object, allowing them to work with cloned PendingRequests. --- src/Illuminate/Http/Client/PendingRequest.php | 23 ++++++++++++------- tests/Http/HttpClientTest.php | 17 ++++++++++++++ 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/Illuminate/Http/Client/PendingRequest.php b/src/Illuminate/Http/Client/PendingRequest.php index c83fb95202ab..8edbcee179e9 100644 --- a/src/Illuminate/Http/Client/PendingRequest.php +++ b/src/Illuminate/Http/Client/PendingRequest.php @@ -137,7 +137,7 @@ class PendingRequest * * @var \Illuminate\Http\Client\Request|null */ - protected $request; + protected $request = null; /** * Create a new HTTP Client instance. @@ -156,11 +156,11 @@ public function __construct(Factory $factory = null) 'http_errors' => false, ]; - $this->beforeSendingCallbacks = collect([function (Request $request, array $options) { - $this->request = $request; - $this->cookies = $options['cookies']; + $this->beforeSendingCallbacks = collect([function (Request $request, array $options, PendingRequest $instance) { + $instance->request = $request; + $instance->cookies = $options['cookies']; - $this->dispatchRequestSendingEvent(); + $instance->dispatchRequestSendingEvent(); }]); } @@ -913,7 +913,8 @@ public function runBeforeSendingCallbacks($request, array $options) return tap($request, function ($request) use ($options) { $this->beforeSendingCallbacks->each->__invoke( (new Request($request))->withData($options['laravel_data']), - $options + $options, + $this ); }); } @@ -985,9 +986,15 @@ protected function dispatchRequestSendingEvent() */ protected function dispatchResponseReceivedEvent(Response $response) { - if ($dispatcher = optional($this->factory)->getDispatcher()) { - $dispatcher->dispatch(new ResponseReceived($this->request, $response)); + if (! $dispatcher = optional($this->factory)->getDispatcher()) { + return; + } + + if (! $this->request) { + return; } + + $dispatcher->dispatch(new ResponseReceived($this->request, $response)); } /** diff --git a/tests/Http/HttpClientTest.php b/tests/Http/HttpClientTest.php index 746e5ece7f68..9f1acdc1004f 100644 --- a/tests/Http/HttpClientTest.php +++ b/tests/Http/HttpClientTest.php @@ -15,6 +15,7 @@ use Illuminate\Http\Client\Response; use Illuminate\Http\Client\ResponseSequence; use Illuminate\Support\Collection; +use Illuminate\Support\Facades\Http; use Illuminate\Support\Str; use Mockery as m; use OutOfBoundsException; @@ -939,4 +940,20 @@ public function testTheRequestSendingAndResponseReceivedEventsAreFiredWhenAReque m::close(); } + + public function testClonedClientsWorkSuccessfullyWithTheRequestObject() + { + $events = m::mock(Dispatcher::class); + $events->shouldReceive('dispatch')->once()->with(m::type(RequestSending::class)); + $events->shouldReceive('dispatch')->once()->with(m::type(ResponseReceived::class)); + + $factory = new Factory($events); + + $client = $factory->timeout(10); + $clonedClient = clone $client; + + $clonedClient->get('https://example.com'); + + m::close(); + } } From 571d70587a59fa26554ffcbe042cf5cd3bc048b1 Mon Sep 17 00:00:00 2001 From: luke Date: Fri, 4 Jun 2021 16:13:00 +0100 Subject: [PATCH 2/2] CS fix --- tests/Http/HttpClientTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/Http/HttpClientTest.php b/tests/Http/HttpClientTest.php index 9f1acdc1004f..85050c9b8184 100644 --- a/tests/Http/HttpClientTest.php +++ b/tests/Http/HttpClientTest.php @@ -15,7 +15,6 @@ use Illuminate\Http\Client\Response; use Illuminate\Http\Client\ResponseSequence; use Illuminate\Support\Collection; -use Illuminate\Support\Facades\Http; use Illuminate\Support\Str; use Mockery as m; use OutOfBoundsException;