Skip to content

Commit 6e5e599

Browse files
authored
[8.x] Enable to modify HTTP Client request headers when using beforeSending() callback (#42244)
* Fix return docblock definition * Adding reference on $request parameter and retrieve the latest value from the given callback * Create unit test to assert if http factory can add authorization header using before sending callback
1 parent d85c341 commit 6e5e599

File tree

2 files changed

+33
-4
lines changed

2 files changed

+33
-4
lines changed

src/Illuminate/Http/Client/PendingRequest.php

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use Illuminate\Support\Traits\Conditionable;
1818
use Illuminate\Support\Traits\Macroable;
1919
use Psr\Http\Message\MessageInterface;
20+
use Psr\Http\Message\RequestInterface;
2021
use Symfony\Component\VarDumper\VarDumper;
2122

2223
class PendingRequest
@@ -984,15 +985,21 @@ protected function sinkStubHandler($sink)
984985
*
985986
* @param \GuzzleHttp\Psr7\RequestInterface $request
986987
* @param array $options
987-
* @return \Closure
988+
* @return \GuzzleHttp\Psr7\RequestInterface
988989
*/
989990
public function runBeforeSendingCallbacks($request, array $options)
990991
{
991-
return tap($request, function ($request) use ($options) {
992-
$this->beforeSendingCallbacks->each(function ($callback) use ($request, $options) {
993-
call_user_func(
992+
return tap($request, function (&$request) use ($options) {
993+
$this->beforeSendingCallbacks->each(function ($callback) use (&$request, $options) {
994+
$callbackResult = call_user_func(
994995
$callback, (new Request($request))->withData($options['laravel_data']), $options, $this
995996
);
997+
998+
if ($callbackResult instanceof RequestInterface) {
999+
$request = $callbackResult;
1000+
} elseif ($callbackResult instanceof Request) {
1001+
$request = $callbackResult->toPsrRequest();
1002+
}
9961003
});
9971004
});
9981005
}

tests/Http/HttpClientTest.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1080,4 +1080,26 @@ public function testRequestIsMacroable()
10801080

10811081
$this->factory->get('https://example.com');
10821082
}
1083+
1084+
public function testItCanAddAuthorizationHeaderIntoRequestUsingBeforeSendingCallback()
1085+
{
1086+
$this->factory->fake();
1087+
1088+
$this->factory->beforeSending(function (Request $request) {
1089+
$requestLine = sprintf(
1090+
'%s %s HTTP/%s',
1091+
$request->toPsrRequest()->getMethod(),
1092+
$request->toPsrRequest()->getUri()->withScheme('')->withHost(''),
1093+
$request->toPsrRequest()->getProtocolVersion()
1094+
);
1095+
1096+
return $request->toPsrRequest()->withHeader('Authorization', 'Bearer '.$requestLine);
1097+
})->get('http://foo.com/json');
1098+
1099+
$this->factory->assertSent(function (Request $request) {
1100+
return
1101+
$request->url() === 'http://foo.com/json' &&
1102+
$request->hasHeader('Authorization', 'Bearer GET /json HTTP/1.1');
1103+
});
1104+
}
10831105
}

0 commit comments

Comments
 (0)