Skip to content

Commit 8d53690

Browse files
committed
Merge pull request #1 from php-middleware/feature/override-policy
Override policy
2 parents 99dad94 + 2ce1c2b commit 8d53690

File tree

4 files changed

+83
-22
lines changed

4 files changed

+83
-22
lines changed

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ $app->run($request, $response);
3434
All middleware constructor options:
3535

3636
* `PhpMiddleware\RequestId\Generator\GeneratorInterface` `$generator` - generator implementation (required)
37-
* `bool` `$allowOverride` (default `true`) - if `true` and request id header exists in incoming request, then value from request header will be used in middleware, using generator will be avoid
37+
* `bool|PhpMiddleware\RequestId\OverridePolicy\OverridePolicyInterface` `$allowOverride` (default `true`) - if `true` and request id header exists in incoming request, then value from request header will be used in middleware, using generator will be avoid
3838
* `string` `$responseHeader` (default `X-Request-Id`) - request id will be added to response as header with given name. If it's not string request id will be not added to response
3939
* `string` `$requestHeader` (default `X-Request-Id`) - request header name
4040

@@ -43,6 +43,10 @@ How to get request id in my application?
4343
* Middleware implements `RequestIdProviderInterface`, so you are able to use `getRequestId()` method,
4444
* from `request-id` attribute in `ServerRequest` object (`$request->getAttribute(RequestIdMiddleware::ATTRIBUTE_NAME)`).
4545

46+
### Override policy
47+
48+
You can add your own logic to decide when override incoming request id. You can implement `OverridePolicyInterface` and pass it as `$allowOverride` variable in constructor.
49+
4650
### Monolog processor
4751

4852
We provide simple [Monolog](https://github.com/Seldaek/monolog) [processor](src/MonologProcessor.php) to add request it to every log entry!
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
namespace PhpMiddleware\RequestId\OverridePolicy;
4+
5+
use Psr\Http\Message\ServerRequestInterface;
6+
7+
interface OverridePolicyInterface
8+
{
9+
public function isAllowToOverride(ServerRequestInterface $request);
10+
}

src/RequestIdMiddleware.php

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22

33
namespace PhpMiddleware\RequestId;
44

5+
use PhpMiddleware\RequestId\Exception\InvalidRequestId;
6+
use PhpMiddleware\RequestId\Exception\MissingRequestId;
7+
use PhpMiddleware\RequestId\Exception\NotGenerated;
58
use PhpMiddleware\RequestId\Generator\GeneratorInterface;
9+
use PhpMiddleware\RequestId\OverridePolicy\OverridePolicyInterface;
610
use PhpMiddleware\RequestId\RequestIdProviderInterface;
711
use Psr\Http\Message\ResponseInterface;
812
use Psr\Http\Message\ServerRequestInterface;
@@ -18,7 +22,7 @@ class RequestIdMiddleware implements RequestIdProviderInterface
1822
protected $generator;
1923

2024
/**
21-
* @var bool
25+
* @var bool|OverridePolicyInterface
2226
*/
2327
protected $allowOverride;
2428

@@ -40,7 +44,7 @@ class RequestIdMiddleware implements RequestIdProviderInterface
4044

4145
/**
4246
* @param GeneratorInterface $generator
43-
* @param bool $allowOverride
47+
* @param bool|OverridePolicyInterface $allowOverride
4448
* @param string $responseHeader
4549
* @param string $requestHeader
4650
*/
@@ -79,12 +83,12 @@ public function __invoke(ServerRequestInterface $request, ResponseInterface $res
7983
/**
8084
* @return mixed
8185
*
82-
* @throws Exception\NotGenerated
86+
* @throws NotGenerated
8387
*/
8488
public function getRequestId()
8589
{
8690
if ($this->requestId === null) {
87-
throw new Exception\NotGenerated('Request id is not generated yet');
91+
throw new NotGenerated('Request id is not generated yet');
8892
}
8993
return $this->requestId;
9094
}
@@ -94,25 +98,25 @@ public function getRequestId()
9498
*
9599
* @return mixed
96100
*
97-
* @throws Exception\MissingRequestId
98-
* @throws Exception\NotGenerated
101+
* @throws MissingRequestId
102+
* @throws NotGenerated
99103
*/
100104
protected function getRequestIdFromRequest(ServerRequestInterface $request)
101105
{
102106
if ($this->isPossibleToGetFromRequest($request)) {
103107
$requestId = $request->getHeaderLine($this->requestHeader);
104108

105109
if (empty($requestId)) {
106-
throw new Exception\MissingRequestId(sprintf('Missing request id in "%s" request header', $this->requestHeader));
110+
throw new MissingRequestId(sprintf('Missing request id in "%s" request header', $this->requestHeader));
107111
}
108112
} else {
109113
$requestId = $this->generator->generateRequestId();
110114

111115
if (empty($requestId)) {
112-
throw new Exception\InvalidRequestId('Generator return empty value');
116+
throw new InvalidRequestId('Generator return empty value');
113117
}
114118
if (!is_string($requestId)) {
115-
throw new Exception\InvalidRequestId('Request id is not a string');
119+
throw new InvalidRequestId('Request id is not a string');
116120
}
117121
}
118122
return $requestId;
@@ -125,6 +129,12 @@ protected function getRequestIdFromRequest(ServerRequestInterface $request)
125129
*/
126130
protected function isPossibleToGetFromRequest(ServerRequestInterface $request)
127131
{
128-
return $this->allowOverride === true && $request->hasHeader($this->requestHeader);
132+
if ($this->allowOverride instanceof OverridePolicyInterface) {
133+
$allowOverride = $this->allowOverride->isAllowToOverride($request);
134+
} else {
135+
$allowOverride = $this->allowOverride;
136+
}
137+
138+
return $allowOverride === true && $request->hasHeader($this->requestHeader);
129139
}
130140
}

test/RequestIdMiddlewareTest.php

Lines changed: 48 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,17 @@
22

33
namespace PhpMiddlewareTestTest\RequestId;
44

5+
use PhpMiddleware\RequestId\Exception\InvalidRequestId;
6+
use PhpMiddleware\RequestId\Exception\MissingRequestId;
57
use PhpMiddleware\RequestId\Generator\GeneratorInterface;
8+
use PhpMiddleware\RequestId\OverridePolicy\OverridePolicyInterface;
69
use PhpMiddleware\RequestId\RequestIdMiddleware;
10+
use PHPUnit_Framework_TestCase;
711
use Psr\Http\Message\ServerRequestInterface;
812
use Zend\Diactoros\Response;
913
use Zend\Diactoros\ServerRequest;
1014

11-
class RequestIdMiddlewareTest extends \PHPUnit_Framework_TestCase
15+
class RequestIdMiddlewareTest extends PHPUnit_Framework_TestCase
1216
{
1317
protected $generator;
1418

@@ -67,21 +71,21 @@ public function testGenerateIdAndNotEmmitToResponse()
6771
$this->assertSame('123456789', $middleware->getRequestId());
6872
}
6973

70-
/**
71-
* @expectedException PhpMiddleware\RequestId\Exception\MissingRequestId
72-
*/
7374
public function testTryToGetRequestIdBeforeRunMiddleware()
7475
{
76+
$this->setExpectedException(MissingRequestId::class);
77+
7578
$middleware = new RequestIdMiddleware($this->generator);
7679
$middleware->getRequestId();
7780
}
7881

7982
/**
8083
* @dataProvider dataproviderEmptyRequestIdValues
81-
* @expectedException PhpMiddleware\RequestId\Exception\InvalidRequestId
8284
*/
8385
public function testTryToGenerateEmptyRequestId($emptyValue)
8486
{
87+
$this->setExpectedException(InvalidRequestId::class);
88+
8589
$this->generator->expects($this->once())->method('generateRequestId')->willReturn($emptyValue);
8690

8791
$middleware = new RequestIdMiddleware($this->generator);
@@ -101,11 +105,10 @@ public function dataproviderEmptyRequestIdValues()
101105
];
102106
}
103107

104-
/**
105-
* @expectedException PhpMiddleware\RequestId\Exception\InvalidRequestId
106-
*/
107108
public function testTryToGenerateNotStringRequestId()
108109
{
110+
$this->setExpectedException(InvalidRequestId::class);
111+
109112
$this->generator->expects($this->once())->method('generateRequestId')->willReturn(1);
110113

111114
$middleware = new RequestIdMiddleware($this->generator);
@@ -165,11 +168,9 @@ public function testDontGenerateBecouseHeaderExists()
165168
$this->assertSame('987654321', $middleware->getRequestId());
166169
}
167170

168-
/**
169-
* @expectedException PhpMiddleware\RequestId\Exception\MissingRequestId
170-
*/
171171
public function testDontGenerateBecouseHeaderExistsButEmpty()
172172
{
173+
$this->setExpectedException(MissingRequestId::class);
173174
$this->generator->expects($this->never())->method('generateRequestId');
174175

175176
$middleware = new RequestIdMiddleware($this->generator);
@@ -178,4 +179,40 @@ public function testDontGenerateBecouseHeaderExistsButEmpty()
178179

179180
call_user_func($middleware, $request, $response, function(){});
180181
}
182+
183+
public function testOverridePolicyAllowOverride()
184+
{
185+
$this->generator->method('generateRequestId')->willReturn('123456789');
186+
187+
$request = new ServerRequest([], [], 'https://github.com/php-middleware/request-id', 'GET', 'php://input', [RequestIdMiddleware::DEFAULT_HEADER_REQUEST_ID => '987654321']);
188+
189+
$policy = $this->getMock(OverridePolicyInterface::class);
190+
$policy->method('isAllowToOverride')->with($request)->willReturn(true);
191+
$response = new Response();
192+
193+
$middleware = new RequestIdMiddleware($this->generator, $policy);
194+
$result = call_user_func($middleware, $request, $response, function ($request, $response) {
195+
return $response;
196+
});
197+
198+
$this->assertSame('987654321', $result->getHeaderLine(RequestIdMiddleware::DEFAULT_HEADER_REQUEST_ID));
199+
}
200+
201+
public function testOverridePolicyDisallowOverride()
202+
{
203+
$this->generator->method('generateRequestId')->willReturn('123456789');
204+
205+
$request = new ServerRequest([], [], 'https://github.com/php-middleware/request-id', 'GET', 'php://input', [RequestIdMiddleware::DEFAULT_HEADER_REQUEST_ID => '987654321']);
206+
207+
$policy = $this->getMock(OverridePolicyInterface::class);
208+
$policy->method('isAllowToOverride')->with($request)->willReturn(false);
209+
$response = new Response();
210+
211+
$middleware = new RequestIdMiddleware($this->generator, $policy);
212+
$result = call_user_func($middleware, $request, $response, function ($request, $response) {
213+
return $response;
214+
});
215+
216+
$this->assertSame('123456789', $result->getHeaderLine(RequestIdMiddleware::DEFAULT_HEADER_REQUEST_ID));
217+
}
181218
}

0 commit comments

Comments
 (0)