From f004b05c9cab5bc6ca5eb394f4e23ca3aab35ae2 Mon Sep 17 00:00:00 2001 From: peterdeme Date: Thu, 26 May 2022 13:38:18 +0000 Subject: [PATCH] feat(guzzle): add custom http middleware possibility --- README.md | 8 ++++++++ lib/GetStream/Stream/BaseFeed.php | 6 +++++- lib/GetStream/Stream/Client.php | 23 +++++++++++++++++++++++ lib/GetStream/Stream/ClientInterface.php | 7 +++++++ lib/GetStream/Stream/Collections.php | 2 +- lib/GetStream/Stream/Personalization.php | 2 +- lib/GetStream/Stream/Reactions.php | 2 +- lib/GetStream/Stream/Users.php | 2 +- lib/GetStream/Stream/Util.php | 13 +++++++++++-- 9 files changed, 58 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index eb5113e..500859c 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,14 @@ $client = new GetStream\Stream\Client('YOUR_API_KEY', 'YOUR_API_SECRET'); // Instantiate a feed object $userFeed = $client->feed('user', '1'); + +// If you want, you can set a custom http handler +$handler = new \GuzzleHttp\HandlerStack(); +$stack->push(Middleware::mapRequest(function (RequestInterface $r) { + echo 'Sending request to Stream Feeds API: ' . $r->getUri() . PHP_EOL; + return $r; +})); +$client->setCustomHttpHandler($handler); ``` By default, the Client will target the GetStream REST API at `stream-io-api.com/api`. diff --git a/lib/GetStream/Stream/BaseFeed.php b/lib/GetStream/Stream/BaseFeed.php index a2220bb..d9ec16c 100644 --- a/lib/GetStream/Stream/BaseFeed.php +++ b/lib/GetStream/Stream/BaseFeed.php @@ -380,7 +380,11 @@ public function getHandlerStack() */ public function getHttpClient() { - $handler = $this->getHandlerStack(); + $handler = $this->client->getCustomHttpHandlerStack(); + if (!$handler) { + $handler = $this->getHandlerStack(); + } + return new GuzzleClient([ 'base_uri' => $this->client->getBaseUrl(), 'timeout' => $this->client->timeout, diff --git a/lib/GetStream/Stream/Client.php b/lib/GetStream/Stream/Client.php index 98605b4..f2bcddd 100644 --- a/lib/GetStream/Stream/Client.php +++ b/lib/GetStream/Stream/Client.php @@ -3,6 +3,7 @@ use DateTime; use Exception; +use GuzzleHttp\HandlerStack; class Client implements ClientInterface { @@ -43,6 +44,11 @@ class Client implements ClientInterface */ public $timeout; + /** + * @var HandlerStack|null + */ + public $customHttpHandler; + /** * @param string $api_key * @param string $api_secret @@ -61,6 +67,23 @@ public function __construct($api_key, $api_secret, $api_version='v1.0', $locatio $this->protocol = 'https'; } + /** + * @param HandlerStack $handler + * @return void + */ + public function setCustomHttpHandler($handler) + { + $this->customHttpHandler = $handler; + } + + /** + * @return HandlerStack|null + */ + public function getCustomHttpHandlerStack() + { + return $this->customHttpHandler; + } + /** * @param string|null $url * @return Client diff --git a/lib/GetStream/Stream/ClientInterface.php b/lib/GetStream/Stream/ClientInterface.php index 3491fb3..2cfa05f 100644 --- a/lib/GetStream/Stream/ClientInterface.php +++ b/lib/GetStream/Stream/ClientInterface.php @@ -2,6 +2,8 @@ namespace GetStream\Stream; +use GuzzleHttp\HandlerStack; + /** * @property string $timeout * @property string $api_version @@ -18,6 +20,11 @@ public function setProtocol($protocol); */ public function setLocation($location); + /** + * @return HandlerStack|null + */ + public function getCustomHttpHandlerStack(); + /** * @param string $user_id * @param ?array $extra_data diff --git a/lib/GetStream/Stream/Collections.php b/lib/GetStream/Stream/Collections.php index bb5600b..46c4b4d 100644 --- a/lib/GetStream/Stream/Collections.php +++ b/lib/GetStream/Stream/Collections.php @@ -34,7 +34,7 @@ public function __construct(ClientInterface $streamClient, $apiKey, $apiSecret) $this->client = new GuzzleClient([ 'base_uri' => $streamClient->getBaseUrl().'/'.$streamClient->api_version.'/', 'timeout' => $streamClient->timeout, - 'handler' => Util::handlerStack($apiKey, $apiSecret, 'collections'), + 'handler' => Util::handlerStack($streamClient, $apiKey, $apiSecret, 'collections'), ]); } diff --git a/lib/GetStream/Stream/Personalization.php b/lib/GetStream/Stream/Personalization.php index a0eb25c..d289bbf 100644 --- a/lib/GetStream/Stream/Personalization.php +++ b/lib/GetStream/Stream/Personalization.php @@ -36,7 +36,7 @@ public function __construct(ClientInterface $streamClient, $apiKey, $apiSecret) $this->client = new GuzzleClient([ 'base_uri' => self::API_ENDPOINT, 'timeout' => $streamClient->timeout, - 'handler' => Util::handlerStack($apiKey, $apiSecret, 'personalization'), + 'handler' => Util::handlerStack($streamClient, $apiKey, $apiSecret, 'personalization'), ]); } diff --git a/lib/GetStream/Stream/Reactions.php b/lib/GetStream/Stream/Reactions.php index 0cdea9d..abde8a8 100644 --- a/lib/GetStream/Stream/Reactions.php +++ b/lib/GetStream/Stream/Reactions.php @@ -34,7 +34,7 @@ public function __construct(ClientInterface $streamClient, $apiKey, $apiSecret) $this->client = new GuzzleClient([ 'base_uri' => $streamClient->getBaseUrl().'/'.$streamClient->api_version.'/', 'timeout' => $streamClient->timeout, - 'handler' => Util::handlerStack($apiKey, $apiSecret, 'reactions'), + 'handler' => Util::handlerStack($streamClient, $apiKey, $apiSecret, 'reactions'), ]); } diff --git a/lib/GetStream/Stream/Users.php b/lib/GetStream/Stream/Users.php index b7c3240..e04df20 100644 --- a/lib/GetStream/Stream/Users.php +++ b/lib/GetStream/Stream/Users.php @@ -34,7 +34,7 @@ public function __construct(ClientInterface $streamClient, $apiKey, $apiSecret) $this->client = new GuzzleClient([ 'base_uri' => $streamClient->getBaseUrl().'/'.$streamClient->api_version.'/', 'timeout' => $streamClient->timeout, - 'handler' => Util::handlerStack($apiKey, $apiSecret, 'users'), + 'handler' => Util::handlerStack($streamClient, $apiKey, $apiSecret, 'users'), ]); } diff --git a/lib/GetStream/Stream/Util.php b/lib/GetStream/Stream/Util.php index 43ab894..7daeb7c 100644 --- a/lib/GetStream/Stream/Util.php +++ b/lib/GetStream/Stream/Util.php @@ -9,9 +9,13 @@ class Util { /** + * @param ClientInterface $streamClient + * @param string $apiKey + * @param string $apiSecret + * @param string $resource * @return HandlerStack */ - public static function handlerStack($apiKey, $apiSecret, $resource) + public static function handlerStack($streamClient, $apiKey, $apiSecret, $resource) { $token = JWT::encode([ 'action' => '*', @@ -19,7 +23,12 @@ public static function handlerStack($apiKey, $apiSecret, $resource) 'feed_id' => '*', 'resource' => $resource, ], $apiSecret, 'HS256'); - $stack = HandlerStack::create(); + + + $stack = $streamClient->getCustomHttpHandlerStack(); + if (!$stack) { + $stack = HandlerStack::create(); + } $stack->push(function (callable $handler) use ($token, $apiKey) { return function (RequestInterface $request, array $options) use ($handler, $token, $apiKey) { // Add authentication headers.