Skip to content

Commit e086e68

Browse files
author
Michał Kopacz
committed
separate request id provider from middleware
1 parent 8d53690 commit e086e68

8 files changed

+290
-217
lines changed

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
/vendor/
22
composer.lock
3-
tmp/
3+
tmp/
4+
phpunit-coverage-clover.xml
5+
.idea
6+

src/RequestIdMiddleware.php

Lines changed: 9 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,21 @@
22

33
namespace PhpMiddleware\RequestId;
44

5-
use PhpMiddleware\RequestId\Exception\InvalidRequestId;
6-
use PhpMiddleware\RequestId\Exception\MissingRequestId;
75
use PhpMiddleware\RequestId\Exception\NotGenerated;
86
use PhpMiddleware\RequestId\Generator\GeneratorInterface;
97
use PhpMiddleware\RequestId\OverridePolicy\OverridePolicyInterface;
10-
use PhpMiddleware\RequestId\RequestIdProviderInterface;
118
use Psr\Http\Message\ResponseInterface;
129
use Psr\Http\Message\ServerRequestInterface;
1310

1411
class RequestIdMiddleware implements RequestIdProviderInterface
1512
{
16-
const DEFAULT_HEADER_REQUEST_ID = 'X-Request-Id';
1713
const ATTRIBUTE_NAME = 'request-id';
1814

1915
/**
20-
* @var GeneratorInterface
16+
* @var RequestIdProviderFactoryInterface
2117
*/
22-
protected $generator;
18+
protected $requestIdProviderFactory;
2319

24-
/**
25-
* @var bool|OverridePolicyInterface
26-
*/
27-
protected $allowOverride;
2820

2921
/**
3022
* @var mixed
@@ -36,28 +28,16 @@ class RequestIdMiddleware implements RequestIdProviderInterface
3628
*/
3729
protected $responseHeader;
3830

39-
/**
40-
*
41-
* @var string
42-
*/
43-
protected $requestHeader;
4431

4532
/**
4633
* @param GeneratorInterface $generator
4734
* @param bool|OverridePolicyInterface $allowOverride
4835
* @param string $responseHeader
4936
* @param string $requestHeader
5037
*/
51-
public function __construct(
52-
GeneratorInterface $generator,
53-
$allowOverride = true,
54-
$responseHeader = self::DEFAULT_HEADER_REQUEST_ID,
55-
$requestHeader = self::DEFAULT_HEADER_REQUEST_ID
56-
) {
57-
$this->generator = $generator;
58-
$this->allowOverride = $allowOverride;
38+
public function __construct(RequestIdProviderFactoryInterface $requestIdProviderFactory, $responseHeader = RequestIdProviderInterface::DEFAULT_HEADER_REQUEST_ID) {
39+
$this->requestIdProviderFactory = $requestIdProviderFactory;
5940
$this->responseHeader = $responseHeader;
60-
$this->requestHeader = $requestHeader;
6141
}
6242

6343
/**
@@ -69,7 +49,11 @@ public function __construct(
6949
*/
7050
public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next)
7151
{
72-
$this->requestId = $this->getRequestIdFromRequest($request);
52+
/** @var RequestIdProviderInterface $requestIdProvider */
53+
$requestIdProvider = $this->requestIdProviderFactory->create($request);
54+
55+
$this->requestId = $requestIdProvider->getRequestId();
56+
7357
$requestWithAttribute = $request->withAttribute(self::ATTRIBUTE_NAME, $this->requestId);
7458

7559
$nextResponse = $next($requestWithAttribute, $response);
@@ -92,49 +76,4 @@ public function getRequestId()
9276
}
9377
return $this->requestId;
9478
}
95-
96-
/**
97-
* @param ServerRequestInterface $request
98-
*
99-
* @return mixed
100-
*
101-
* @throws MissingRequestId
102-
* @throws NotGenerated
103-
*/
104-
protected function getRequestIdFromRequest(ServerRequestInterface $request)
105-
{
106-
if ($this->isPossibleToGetFromRequest($request)) {
107-
$requestId = $request->getHeaderLine($this->requestHeader);
108-
109-
if (empty($requestId)) {
110-
throw new MissingRequestId(sprintf('Missing request id in "%s" request header', $this->requestHeader));
111-
}
112-
} else {
113-
$requestId = $this->generator->generateRequestId();
114-
115-
if (empty($requestId)) {
116-
throw new InvalidRequestId('Generator return empty value');
117-
}
118-
if (!is_string($requestId)) {
119-
throw new InvalidRequestId('Request id is not a string');
120-
}
121-
}
122-
return $requestId;
123-
}
124-
125-
/**
126-
* @param ServerRequestInterface $request
127-
*
128-
* @return bool
129-
*/
130-
protected function isPossibleToGetFromRequest(ServerRequestInterface $request)
131-
{
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);
139-
}
14079
}

src/RequestIdProvider.php

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
<?php
2+
namespace PhpMiddleware\RequestId;
3+
4+
use PhpMiddleware\RequestId\Exception\InvalidRequestId;
5+
use PhpMiddleware\RequestId\Exception\MissingRequestId;
6+
use PhpMiddleware\RequestId\Generator\GeneratorInterface;
7+
use PhpMiddleware\RequestId\OverridePolicy\OverridePolicyInterface;
8+
use Psr\Http\Message\ServerRequestInterface;
9+
10+
class RequestIdProvider implements RequestIdProviderInterface
11+
{
12+
/**
13+
* @var ServerRequestInterface
14+
*/
15+
protected $request;
16+
17+
/**
18+
* @var GeneratorInterface
19+
*/
20+
protected $generator;
21+
22+
/**
23+
* @var bool|OverridePolicyInterface
24+
*/
25+
protected $allowOverride;
26+
27+
/**
28+
* @var mixed
29+
*/
30+
protected $requestId;
31+
32+
/**
33+
*
34+
* @var string
35+
*/
36+
protected $requestHeader;
37+
38+
public function __construct(
39+
ServerRequestInterface $request,
40+
GeneratorInterface $generator,
41+
$allowOverride = true,
42+
$requestHeader = RequestIdProviderInterface::DEFAULT_HEADER_REQUEST_ID
43+
)
44+
{
45+
$this->request = $request;
46+
$this->generator = $generator;
47+
$this->allowOverride = $allowOverride;
48+
$this->requestHeader = $requestHeader;
49+
}
50+
51+
52+
public function getRequestId()
53+
{
54+
if ($this->isPossibleToGetFromRequest($this->request)) {
55+
$requestId = $this->request->getHeaderLine($this->requestHeader);
56+
57+
if (empty($requestId)) {
58+
throw new MissingRequestId(sprintf('Missing request id in "%s" request header', $this->requestHeader));
59+
}
60+
} else {
61+
$requestId = $this->generator->generateRequestId();
62+
63+
if (empty($requestId)) {
64+
throw new InvalidRequestId('Generator return empty value');
65+
}
66+
if (!is_string($requestId)) {
67+
throw new InvalidRequestId('Request id is not a string');
68+
}
69+
}
70+
return $requestId;
71+
}
72+
73+
/**
74+
* @param ServerRequestInterface $request
75+
*
76+
* @return bool
77+
*/
78+
protected function isPossibleToGetFromRequest(ServerRequestInterface $request)
79+
{
80+
if ($this->allowOverride instanceof OverridePolicyInterface) {
81+
$allowOverride = $this->allowOverride->isAllowToOverride($request);
82+
} else {
83+
$allowOverride = $this->allowOverride;
84+
}
85+
86+
return $allowOverride === true && $request->hasHeader($this->requestHeader);
87+
}
88+
}

src/RequestIdProviderFactory.php

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
namespace PhpMiddleware\RequestId;
4+
5+
use PhpMiddleware\RequestId\Generator\GeneratorInterface;
6+
use Psr\Http\Message\ServerRequestInterface;
7+
8+
class RequestIdProviderFactory implements RequestIdProviderFactoryInterface
9+
{
10+
11+
/**
12+
* @var GeneratorInterface
13+
*/
14+
protected $generator;
15+
16+
/**
17+
* @var bool|OverridePolicyInterface
18+
*/
19+
protected $allowOverride;
20+
21+
/**
22+
*
23+
* @var string
24+
*/
25+
protected $requestHeader;
26+
27+
public function __construct(
28+
GeneratorInterface $generator,
29+
$allowOverride = true,
30+
$requestHeader = RequestIdProviderInterface::DEFAULT_HEADER_REQUEST_ID
31+
)
32+
{
33+
$this->generator = $generator;
34+
$this->allowOverride = $allowOverride;
35+
$this->requestHeader = $requestHeader;
36+
}
37+
38+
public function create(ServerRequestInterface $request)
39+
{
40+
return new RequestIdProvider($request, $this->generator, $this->allowOverride, $this->requestHeader);
41+
}
42+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace PhpMiddleware\RequestId;
4+
5+
use Psr\Http\Message\ServerRequestInterface;
6+
7+
interface RequestIdProviderFactoryInterface
8+
{
9+
/**
10+
* @return RequestIdProviderInterface
11+
*/
12+
public function create(ServerRequestInterface $request);
13+
}

src/RequestIdProviderInterface.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,7 @@
44

55
interface RequestIdProviderInterface
66
{
7+
const DEFAULT_HEADER_REQUEST_ID = 'X-Request-Id';
8+
79
public function getRequestId();
810
}

0 commit comments

Comments
 (0)