Skip to content

Commit 38bc5e5

Browse files
author
Antoine Aflalo
committed
feat(middleware): Interceptor of Request
It's possible now to set a request interceptor to modify the existing request.
1 parent 72b27a6 commit 38bc5e5

4 files changed

Lines changed: 115 additions & 12 deletions

File tree

src/Client/IOAuthClient.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
use League\OAuth2\Client\Token\AccessToken;
1212
use ZEROSPAM\Framework\SDK\Client\Middleware\IMiddleware;
13+
use ZEROSPAM\Framework\SDK\Client\Middleware\IPreRequestMiddleware;
1314
use ZEROSPAM\Framework\SDK\Request\Api\IRequest;
1415
use ZEROSPAM\Framework\SDK\Response\Api\IResponse;
1516

@@ -62,4 +63,22 @@ public function getToken(): AccessToken;
6263
* @return IResponse
6364
*/
6465
public function processRequest(IRequest $request): IResponse;
66+
67+
/**
68+
* Register a pre request middleware
69+
*
70+
* @param IPreRequestMiddleware $middleware
71+
*
72+
* @return IOAuthClient
73+
*/
74+
public function registerPreRequestMiddleware(IPreRequestMiddleware $middleware): IOAuthClient;
75+
76+
/**
77+
* UnRegister a pre request middleware
78+
*
79+
* @param IPreRequestMiddleware $middleware
80+
*
81+
* @return IOAuthClient
82+
*/
83+
public function unregisterPreRequestMiddleware(IPreRequestMiddleware $middleware): IOAuthClient;
6584
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
/**
3+
* Created by PhpStorm.
4+
* User: aaflalo
5+
* Date: 18-06-11
6+
* Time: 15:42
7+
*/
8+
9+
namespace ZEROSPAM\Framework\SDK\Client\Middleware;
10+
11+
use ZEROSPAM\Framework\SDK\Request\Api\IRequest;
12+
13+
/**
14+
* Interface IPreRequestMiddleware
15+
*
16+
* Change the request before processing it
17+
*
18+
* @package ZEROSPAM\Framework\SDK\Client\Middleware
19+
*/
20+
interface IPreRequestMiddleware
21+
{
22+
23+
/**
24+
* Handle the request before processing
25+
*
26+
* @param IRequest $request
27+
*
28+
*/
29+
public function handle(IRequest $request): void;
30+
}

src/Client/OAuthClient.php

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use ZEROSPAM\Framework\SDK\Client\Exception\SDKException;
1919
use ZEROSPAM\Framework\SDK\Client\Exception\TooManyRetriesException;
2020
use ZEROSPAM\Framework\SDK\Client\Middleware\IMiddleware;
21+
use ZEROSPAM\Framework\SDK\Client\Middleware\IPreRequestMiddleware;
2122
use ZEROSPAM\Framework\SDK\Config\IOAuthConfiguration;
2223
use ZEROSPAM\Framework\SDK\Request\Api\IRequest;
2324
use ZEROSPAM\Framework\SDK\Request\Type\RequestType;
@@ -56,7 +57,11 @@ class OAuthClient implements IOAuthClient
5657
/**
5758
* @var \ZEROSPAM\Framework\SDK\Client\Middleware\IMiddleware[][]
5859
*/
59-
private $middlewares;
60+
private $postRequestMiddlewares = [];
61+
/**
62+
* @var IPreRequestMiddleware[]
63+
*/
64+
private $preRequestMiddlewares = [];
6065

6166
/**
6267
* OauthClient constructor.
@@ -87,12 +92,26 @@ public function registerMiddleware(IMiddleware $middleware): IOAuthClient
8792
{
8893
$middleware->setClient($this);
8994
foreach ($middleware::statusCode() as $statusCode) {
90-
$this->middlewares[$statusCode][] = $middleware;
95+
$this->postRequestMiddlewares[$statusCode][] = $middleware;
9196
}
9297

9398
return $this;
9499
}
95100

101+
/**
102+
* Register a pre request middleware
103+
*
104+
* @param IPreRequestMiddleware $middleware
105+
*
106+
* @return IOAuthClient
107+
*/
108+
public function registerPreRequestMiddleware(IPreRequestMiddleware $middleware): IOAuthClient
109+
{
110+
$this->preRequestMiddlewares[get_class($middleware)] = $middleware;
111+
112+
return $this;
113+
}
114+
96115
/**
97116
* Unregister the middleware.
98117
*
@@ -106,26 +125,40 @@ public function unregisterMiddleware(IMiddleware $middleware): IOAuthClient
106125
{
107126
$middlewareClass = get_class($middleware);
108127
foreach ($middleware::statusCode() as $statusCode) {
109-
if (!isset($this->middlewares[$statusCode])) {
128+
if (!isset($this->postRequestMiddlewares[$statusCode])) {
110129
continue;
111130
}
112131
$result = array_filter(
113-
$this->middlewares[$statusCode],
132+
$this->postRequestMiddlewares[$statusCode],
114133
function (IMiddleware $currMiddleware) use ($middlewareClass) {
115134
return get_class($currMiddleware) != $middlewareClass;
116135
}
117136
);
118137

119138
if (empty($result)) {
120-
unset($this->middlewares[$statusCode]);
139+
unset($this->postRequestMiddlewares[$statusCode]);
121140
} else {
122-
$this->middlewares[$statusCode] = $result;
141+
$this->postRequestMiddlewares[$statusCode] = $result;
123142
}
124143
}
125144

126145
return $this;
127146
}
128147

148+
/**
149+
* UnRegister a pre request middleware
150+
*
151+
* @param IPreRequestMiddleware $middleware
152+
*
153+
* @return IOAuthClient
154+
*/
155+
public function unregisterPreRequestMiddleware(IPreRequestMiddleware $middleware): IOAuthClient
156+
{
157+
unset($this->preRequestMiddlewares[get_class($middleware)]);
158+
159+
return $this;
160+
}
161+
129162
/**
130163
* Refresh token.
131164
*/
@@ -153,6 +186,9 @@ public function getToken(): AccessToken
153186
*/
154187
public function processRequest(IRequest $request): IResponse
155188
{
189+
foreach ($this->preRequestMiddlewares as $middleware) {
190+
$middleware->handle($request);
191+
}
156192
$request->incrementTries();
157193

158194
$headers = $this->configuration->getProvider()->getHeaders($this->token);
@@ -168,8 +204,8 @@ public function processRequest(IRequest $request): IResponse
168204
$response = $this->guzzleClient->request($request->httpType()->getValue(), $request->toUri(), $options);
169205
$parsedData = JSONParsing::responseToJson($response);
170206

171-
if (isset($this->middlewares[$response->getStatusCode()])) {
172-
foreach ($this->middlewares[$response->getStatusCode()] as $middleware) {
207+
if (isset($this->postRequestMiddlewares[$response->getStatusCode()])) {
208+
foreach ($this->postRequestMiddlewares[$response->getStatusCode()] as $middleware) {
173209
$parsedData = $middleware->handle($request, $response, $parsedData);
174210
}
175211
}
@@ -180,12 +216,12 @@ public function processRequest(IRequest $request): IResponse
180216
$response = $e->getResponse();
181217
$this->processThrottleData($response);
182218

183-
if (!isset($this->middlewares[$response->getStatusCode()])) {
219+
if (!isset($this->postRequestMiddlewares[$response->getStatusCode()])) {
184220
throw new SDKException($e->getMessage(), $e->getCode(), $e);
185221
}
186222
$parsedData = JSONParsing::responseToJson($response);
187223

188-
foreach ($this->middlewares[$response->getStatusCode()] as $middleware) {
224+
foreach ($this->postRequestMiddlewares[$response->getStatusCode()] as $middleware) {
189225
$parsedData = $middleware->handle($request, $response, $parsedData);
190226
}
191227
} catch (RequestException $e) {
@@ -200,7 +236,7 @@ public function processRequest(IRequest $request): IResponse
200236
}
201237

202238
/**
203-
* @var BaseResponse
239+
* @var $data BaseResponse
204240
*/
205241
$data = $request->processResponse($parsedData);
206242

tests/src/Tests/Middleware/AuthMiddlewareTest.php renamed to tests/src/Tests/Middleware/MiddlewareTests.php

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,13 @@
1111
use GuzzleHttp\Psr7\Response;
1212
use ZEROSPAM\Framework\SDK\Client\IOAuthClient;
1313
use ZEROSPAM\Framework\SDK\Client\Middleware\Error\AuthenticationMiddleware;
14+
use ZEROSPAM\Framework\SDK\Client\Middleware\IPreRequestMiddleware;
1415
use ZEROSPAM\Framework\SDK\Test\Base\Data\TestRequest;
1516
use ZEROSPAM\Framework\SDK\Test\Base\Data\TestResponse;
1617
use ZEROSPAM\Framework\SDK\Test\Base\TestCase;
1718
use ZEROSPAM\Framework\SDK\Test\Base\Util\AccessTokenGenerator;
1819

19-
class AuthMiddlewareTest extends TestCase
20+
class MiddlewareTests extends TestCase
2021
{
2122
public function testAuthMiddlewareRefreshToken(): void
2223
{
@@ -65,4 +66,21 @@ public function testAuthMiddlewareGiveUpAfterTooManyRetries(): void
6566
->registerMiddleware(new AuthenticationMiddleware())
6667
->processRequest(new TestRequest());
6768
}
69+
70+
public function testPreRequestMiddleware(): void
71+
{
72+
$client = $this->preSuccess([]);
73+
$request = new TestRequest();
74+
75+
$mock = \Mockery::mock(IPreRequestMiddleware::class)
76+
->shouldReceive('handle')
77+
->once()
78+
->andReturnUndefined();
79+
80+
$client->getOAuthTestClient()
81+
->registerPreRequestMiddleware($mock->getMock())
82+
->processRequest($request);
83+
84+
$this->assertInstanceOf(TestRequest::class, $request);
85+
}
6886
}

0 commit comments

Comments
 (0)