Skip to content

Commit ac1ec4d

Browse files
authored
Merge pull request #2 from pascalbaljet/saloon-events
Handle Saloon events
2 parents 0e1423d + 21edf2f commit ac1ec4d

File tree

7 files changed

+94
-13
lines changed

7 files changed

+94
-13
lines changed

CHANGELOG.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
# CHANGELOG
22

3-
## [v1.1.x (Unreleased)](https://github.com/onlime/laravel-http-client-global-logger/compare/v1.1.0...main)
3+
## [v1.1.x (Unreleased)](https://github.com/onlime/laravel-http-client-global-logger/compare/v1.1.1...main)
44

5+
6+
## [v1.1.1 (2023-11-13)](https://github.com/onlime/laravel-http-client-global-logger/compare/v1.1.0...v1.1.1)
7+
8+
- Feature | Handle Saloon events by @pascalbaljet in #2 – Can now also log Requests/Responses when using Saloon's `MockClient` by handling `SendingSaloonRequest` and `SentSaloonRequest` Saloon events.
59
- Added common OAuth2 keys `access_token,refresh_token,client_secret` to default body obfuscation configuration.
610

711
## [v1.1.0 (2023-11-09)](https://github.com/onlime/laravel-http-client-global-logger/compare/v1.0.2...v1.1.0)

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ So, my recommendation: If you need global logging without any extra configuratio
185185

186186
- No obfuscation of query params, e.g. on a POST request to an OAuth2 token endpoint.
187187

188-
- Obfuscation currently only works in variant 1 or 3 (global logging).
188+
- Obfuscation currently only works in variant 1 or 3 (global logging), and only on requests, not yet on response data.
189189

190190

191191
## Testing

composer.json

+6-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,12 @@
3838
"orchestra/testbench": "^8.8",
3939
"pestphp/pest": "^2.20",
4040
"pestphp/pest-plugin-arch": "^2.0",
41-
"pestphp/pest-plugin-laravel": "^2.0"
41+
"pestphp/pest-plugin-laravel": "^2.0",
42+
"saloonphp/laravel-http-sender": "^2.0",
43+
"saloonphp/laravel-plugin": "^3.0"
44+
},
45+
"suggest": {
46+
"saloonphp/laravel-plugin": "To support logging of Saloon events (^3.0)"
4247
},
4348
"autoload": {
4449
"psr-4": {

src/EventHelper.php

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?php
2+
3+
namespace Onlime\LaravelHttpClientGlobalLogger;
4+
5+
use Exception;
6+
use Illuminate\Http\Client\Events\RequestSending;
7+
use Illuminate\Http\Client\Events\ResponseReceived;
8+
use Psr\Http\Message\RequestInterface;
9+
use Psr\Http\Message\ResponseInterface;
10+
use Saloon\HttpSender\HttpSender;
11+
use Saloon\Laravel\Events\SendingSaloonRequest;
12+
use Saloon\Laravel\Events\SentSaloonRequest;
13+
14+
class EventHelper
15+
{
16+
public static function shouldBeLogged(object $event): bool
17+
{
18+
// Do not log Saloon requests if Saloon is configured to use Laravel's HTTP Client (HttpSender) unless the
19+
// Saloon request is mocked (has a MockClient). Like this, we prevent duplicate logging of Saloon requests,
20+
// as we're also listening to Laravel's HTTP Client events RequestSending and ResponseReceived.
21+
if ($event instanceof SendingSaloonRequest || $event instanceof SentSaloonRequest) {
22+
$saloonUsesHttpSender = config('saloon.default_sender') === HttpSender::class;
23+
return $event->pendingRequest->hasMockClient() || ! $saloonUsesHttpSender;
24+
}
25+
26+
return true;
27+
}
28+
29+
public static function getPsrRequest(object $event): RequestInterface
30+
{
31+
return match (true) {
32+
$event instanceof RequestSending || $event instanceof ResponseReceived => $event->request->toPsrRequest(),
33+
$event instanceof SendingSaloonRequest || $event instanceof SentSaloonRequest => $event->pendingRequest->createPsrRequest(),
34+
default => throw new Exception('Can not get PSR Request from Event: '.get_class($event)),
35+
};
36+
}
37+
38+
public static function getPsrResponse(object $event): ResponseInterface
39+
{
40+
return match (true) {
41+
$event instanceof ResponseReceived => $event->response->toPsrResponse(),
42+
$event instanceof SentSaloonRequest => $event->response->getPsrResponse(),
43+
default => throw new Exception('Can not get PSR Response from Event: '.get_class($event)),
44+
};
45+
}
46+
}

src/Listeners/LogRequestSending.php

+16-6
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,38 @@
55
use GuzzleHttp\MessageFormatter;
66
use Illuminate\Http\Client\Events\RequestSending;
77
use Illuminate\Support\Facades\Log;
8+
use Onlime\LaravelHttpClientGlobalLogger\EventHelper;
89
use Onlime\LaravelHttpClientGlobalLogger\HttpClientLogger;
910
use Psr\Http\Message\RequestInterface;
11+
use Saloon\Laravel\Events\SendingSaloonRequest;
1012

1113
class LogRequestSending
1214
{
1315
/**
14-
* Handle the event if the middleware was not added manually.
16+
* Handle the event if the HTTP Client global request middleware was not added manually
17+
* with HttpClientLogger::addRequestMiddleware(). Always handle it for Saloon requests.
1518
*/
16-
public function handle(RequestSending $event): void
19+
public function handle(RequestSending|SendingSaloonRequest $event): void
1720
{
18-
if (! HttpClientLogger::requestMiddlewareWasAdded()) {
19-
$this->handleEvent($event);
21+
if ($event instanceof RequestSending && HttpClientLogger::requestMiddlewareWasAdded()) {
22+
return;
2023
}
24+
25+
$this->handleEvent($event);
2126
}
2227

2328
/**
2429
* Handle the event.
2530
*/
26-
public function handleEvent(RequestSending $event): void
31+
public function handleEvent(RequestSending|SendingSaloonRequest $event): void
2732
{
33+
if (! EventHelper::shouldBeLogged($event)) {
34+
return;
35+
}
36+
37+
$psrRequest = EventHelper::getPsrRequest($event);
38+
2839
$obfuscate = config('http-client-global-logger.obfuscate.enabled');
29-
$psrRequest = $event->request->toPsrRequest();
3040

3141
if ($obfuscate) {
3242
$psrRequest = $this->obfuscateHeaders($psrRequest);

src/Listeners/LogResponseReceived.php

+9-4
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,24 @@
55
use GuzzleHttp\MessageFormatter;
66
use Illuminate\Http\Client\Events\ResponseReceived;
77
use Illuminate\Support\Facades\Log;
8+
use Onlime\LaravelHttpClientGlobalLogger\EventHelper;
9+
use Saloon\Laravel\Events\SentSaloonRequest;
810

911
class LogResponseReceived
1012
{
1113
/**
1214
* Handle the event.
13-
*
14-
* @return void
1515
*/
16-
public function handle(ResponseReceived $event)
16+
public function handle(ResponseReceived|SentSaloonRequest $event): void
1717
{
18+
if (! EventHelper::shouldBeLogged($event)) {
19+
return;
20+
}
21+
1822
$formatter = new MessageFormatter(config('http-client-global-logger.format.response'));
1923
Log::channel(config('http-client-global-logger.channel'))->info($formatter->format(
20-
$event->request->toPsrRequest(), $event->response->toPsrResponse()
24+
EventHelper::getPsrRequest($event),
25+
EventHelper::getPsrResponse($event),
2126
));
2227
}
2328
}

src/Providers/EventServiceProvider.php

+11
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
use Illuminate\Http\Client\Events\ResponseReceived;
88
use Onlime\LaravelHttpClientGlobalLogger\Listeners\LogRequestSending;
99
use Onlime\LaravelHttpClientGlobalLogger\Listeners\LogResponseReceived;
10+
use Saloon\Laravel\Events\SendingSaloonRequest;
11+
use Saloon\Laravel\Events\SentSaloonRequest;
1012

1113
class EventServiceProvider extends BaseEventServiceProvider
1214
{
@@ -16,12 +18,21 @@ class EventServiceProvider extends BaseEventServiceProvider
1618
* @var array
1719
*/
1820
protected $listen = [
21+
// Laravel HTTP Client
1922
RequestSending::class => [
2023
LogRequestSending::class,
2124
],
2225
ResponseReceived::class => [
2326
LogResponseReceived::class,
2427
],
28+
29+
// Saloon
30+
SendingSaloonRequest::class => [
31+
LogRequestSending::class,
32+
],
33+
SentSaloonRequest::class => [
34+
LogResponseReceived::class,
35+
],
2536
];
2637

2738
/**

0 commit comments

Comments
 (0)