Skip to content

Instantly share code, notes, and snippets.

@barryvdh
Created August 23, 2021 07:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save barryvdh/4940a43268345c2bd9f3b4b58b01e374 to your computer and use it in GitHub Desktop.
Save barryvdh/4940a43268345c2bd9f3b4b58b01e374 to your computer and use it in GitHub Desktop.
<?php
namespace App\Services;
use Carbon\Carbon;
use Closure;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Promise;
use Illuminate\Http\Client\Events\ConnectionFailed;
use Illuminate\Http\Client\Events\RequestSending;
use Illuminate\Http\Client\Events\ResponseReceived;
use Illuminate\Http\Client\Request;
use Illuminate\Http\Client\Response;
use Psr\Http\Message\MessageInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
class OutgoingRequestLogger
{
public static function createHandler()
{
$stack = HandlerStack::create();
$stack->push(new static());
return $stack;
}
/**
* Returns a function which is handled when a request was successful.
*
* @param RequestInterface $request
*
* @return Closure
*/
protected function onSuccess(RequestInterface $request, $laravelRequest = null)
{
return function ($response) use ($request, $laravelRequest) {
event(new ResponseReceived($laravelRequest, new Response($response)));
return $response;
};
}
/**
* Returns a function which is handled when a request was rejected.
*
* @param RequestInterface $request
*
* @return Closure
*/
protected function onFailure(RequestInterface $request, $laravelRequest = null)
{
return function ($reason) use ($laravelRequest) {
event(new ConnectionFailed($laravelRequest));
return Promise\rejection_for($reason);
};
}
/**
* Called when the middleware is handled by the client.
*
* @param callable $handler
*
* @return Closure
*/
public function __invoke(callable $handler)
{
return function ($request, array $options) use ($handler) {
$laravelRequest = new Request($request);
event(new RequestSending($laravelRequest));
return $handler($request, $options)->then(
$this->onSuccess($request, $laravelRequest),
$this->onFailure($request, $laravelRequest)
);
};
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment