Skip to content

Commit b01a46b

Browse files
authored
Merge pull request #3 from php-middleware/refactor
Add psr-15, psr-17, drop psr-7 implementation dependendy, drop php 5.…
2 parents bac6b67 + 3b5784b commit b01a46b

File tree

7 files changed

+84
-106
lines changed

7 files changed

+84
-106
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
/vendor/
2-
composer.lock
2+
composer.lock
3+
.idea

.travis.yml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
language: php
22

33
php:
4-
- 5.6
5-
- 7.0
64
- 7.1
7-
- hhvm
5+
- 7.2
6+
- 7.3
87

98
env:
109
- DEPS=lowest

README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ Create instance of middleware as you want (we use [named constructors](http://ve
88
```php
99
$date = DateTime::createFromFormat('Y-m-d H:i:s', '2025-11-30 11:12:13');
1010

11-
$middleware = MaintenanceMiddleware::createWithRetryAsDateTime($date);
11+
$middleware = MaintenanceMiddleware::createWithRetryAsDateTime($date, $psr17ResponseFactory);
1212

1313
$middlewareRunner->add(middleware);
1414
$middlewareRunner->run();
@@ -28,4 +28,6 @@ Use composer!
2828

2929
```bash
3030
composer require php-middleware/maintenance
31-
```
31+
```
32+
33+
This package require [PSR-17 message factory](https://packagist.org/providers/psr/http-factory-implementation) implementation to return SEO friendly response.

composer.json

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,21 @@
77
"middleware",
88
"psr",
99
"psr-7",
10-
"maintenance"
10+
"maintenance",
11+
"psr-15",
12+
"psr-17"
1113
],
1214
"require": {
13-
"php": ">=5.6",
15+
"php": ">=7.1",
16+
"psr/http-factory": "^1.0",
17+
"psr/http-factory-implementation": "^1.0",
1418
"psr/http-message": "^1.0",
15-
"php-middleware/double-pass-compatibility": "^1.0",
16-
"http-interop/http-middleware": "^0.4.1"
19+
"psr/http-server-middleware": "^1.0",
20+
"psr/http-server-handler": "^1.0"
1721
},
1822
"require-dev": {
19-
"phpunit/phpunit": "^5.6 || ^6.1",
20-
"zendframework/zend-diactoros": "^1.1.3"
23+
"phpunit/phpunit": "^7.3",
24+
"zendframework/zend-diactoros": "^2.0"
2125
},
2226
"autoload": {
2327
"psr-4": {

phpunit.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<phpunit bootstrap="./vendor/autoload.php" colors="true">
44
<testsuites>
5-
<testsuite>
5+
<testsuite name="Unit">
66
<directory>./test</directory>
77
</testsuite>
88
</testsuites>

src/MaintenanceMiddleware.php

Lines changed: 27 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,14 @@
44

55
use DateTime;
66
use DateTimeInterface;
7-
use Interop\Http\ServerMiddleware\DelegateInterface;
8-
use Interop\Http\ServerMiddleware\MiddlewareInterface;
9-
use InvalidArgumentException;
10-
use PhpMiddleware\DoublePassCompatibilityTrait;
7+
use Psr\Http\Message\ResponseFactoryInterface;
8+
use Psr\Http\Message\ResponseInterface;
119
use Psr\Http\Message\ServerRequestInterface;
12-
use Zend\Diactoros\Response;
10+
use Psr\Http\Server\MiddlewareInterface;
11+
use Psr\Http\Server\RequestHandlerInterface;
1312

14-
final class MaintenanceMiddleware implements MiddlewareInterface
13+
final class MaintenanceMiddleware implements RequestHandlerInterface, MiddlewareInterface
1514
{
16-
use DoublePassCompatibilityTrait;
17-
1815
/**
1916
* @var string
2017
*/
@@ -24,89 +21,68 @@ final class MaintenanceMiddleware implements MiddlewareInterface
2421
* @var int
2522
*/
2623
private $refresh = 0;
24+
private $responseFactory;
2725

28-
private function __construct()
26+
private function __construct(ResponseFactoryInterface $responseFactory)
2927
{
28+
$this->responseFactory = $responseFactory;
3029
}
3130

32-
/**
33-
* @return self
34-
*/
35-
public static function create()
31+
public static function create(ResponseFactoryInterface $responseFactory): self
3632
{
37-
return new self();
33+
return new self($responseFactory);
3834
}
3935

40-
/**
41-
* @param int $seconds
42-
*
43-
* @return self
44-
*/
45-
public static function createWithRetryAsSeconds($seconds)
36+
public static function createWithRetryAsSeconds(int $seconds, ResponseFactoryInterface $responseFactory): self
4637
{
47-
if (!is_int($seconds)) {
48-
throw new InvalidArgumentException('Seconds must be integer');
49-
}
50-
$instance = new self();
38+
$instance = new self($responseFactory);
5139
$instance->retryAfter = (string) $seconds;
5240

5341
return $instance;
5442
}
5543

56-
/**
57-
* @param int $seconds
58-
*
59-
* @return self
60-
*/
61-
public static function createWithRetryAsSecondsAndRefresh($seconds)
44+
public static function createWithRetryAsSecondsAndRefresh(int $seconds, ResponseFactoryInterface $responseFactory): self
6245
{
63-
$instance = self::createWithRetryAsSeconds($seconds);
46+
$instance = self::createWithRetryAsSeconds($seconds, $responseFactory);
6447
$instance->refresh = $seconds;
6548

6649
return $instance;
6750
}
6851

69-
/**
70-
* @param DateTimeInterface $datetime
71-
*
72-
* @return self
73-
*/
74-
public static function createWithRetryAsDateTime(DateTimeInterface $datetime)
52+
public static function createWithRetryAsDateTime(DateTimeInterface $datetime, ResponseFactoryInterface $responseFactory): self
7553
{
76-
$instance = new self();
77-
54+
$instance = new self($responseFactory);
7855
$instance->retryAfter = $datetime->format(DateTime::RFC2822);
7956

8057
return $instance;
8158
}
8259

83-
/**
84-
* @param DateTimeInterface $datetime
85-
*
86-
* @return self
87-
*/
88-
public static function createWithRetryAsDateTimeAndRefresh(DateTimeInterface $datetime)
60+
public static function createWithRetryAsDateTimeAndRefresh(DateTimeInterface $datetime, ResponseFactoryInterface $responseFactory)
8961
{
90-
$instance = self::createWithRetryAsDateTime($datetime);
62+
$instance = self::createWithRetryAsDateTime($datetime, $responseFactory);
9163
$diff = time() - $datetime->getTimestamp();
9264
$instance->refresh = $diff;
9365

9466
return $instance;
9567
}
9668

97-
public function process(ServerRequestInterface $request, DelegateInterface $delegate)
69+
public function handle(ServerRequestInterface $request): ResponseInterface
9870
{
99-
$headers = [];
71+
$response = $this->responseFactory->createResponse(503);
10072

10173
if ($this->retryAfter !== '') {
102-
$headers['Retry-After'] = $this->retryAfter;
74+
$response = $response->withHeader('Retry-After', $this->retryAfter);
10375

10476
if ($this->refresh > 0) {
105-
$headers['Refresh'] = (string) $this->refresh;
77+
$response = $response->withHeader('Refresh', (string) $this->refresh);
10678
}
10779
}
10880

109-
return new Response('php://memory', 503, $headers);
81+
return $response;
11082
}
11183

84+
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
85+
{
86+
return $this->handle($request);
87+
}
11288
}

test/MaintenanceMiddlewareTest.php

Lines changed: 38 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -6,40 +6,57 @@
66
use Exception;
77
use PhpMiddleware\Maintenance\MaintenanceMiddleware;
88
use PHPUnit\Framework\TestCase;
9+
use Psr\Http\Message\ResponseInterface;
10+
use Psr\Http\Message\ServerRequestInterface;
11+
use Psr\Http\Server\RequestHandlerInterface;
912
use Zend\Diactoros\Response;
13+
use Zend\Diactoros\ResponseFactory;
1014
use Zend\Diactoros\ServerRequest;
15+
use Zend\Diactoros\ServerRequestFactory;
1116

1217
class MaintenanceMiddlewareTest extends TestCase
1318
{
19+
private $request;
20+
private $responseFactory;
21+
22+
protected function setUp()
23+
{
24+
$this->request = new ServerRequest();
25+
$this->responseFactory = new ResponseFactory();
26+
}
27+
1428
public function testWithoutRetry()
1529
{
16-
$request = new ServerRequest();
17-
$response = new Response();
30+
$middleware = MaintenanceMiddleware::create($this->responseFactory);
1831

19-
$middleware = MaintenanceMiddleware::create();
32+
$response = $middleware->handle($this->request);
2033

21-
$next = function() {
22-
throw new Exception('Next should not be called');
34+
$this->assertSame(503, $response->getStatusCode());
35+
$this->assertSame('', $response->getHeaderLine('Retry-After'));
36+
}
37+
38+
public function testWithoutRetryAsMiddleware()
39+
{
40+
$middleware = MaintenanceMiddleware::create($this->responseFactory);
41+
42+
$requestHandler = new class implements RequestHandlerInterface {
43+
public function handle(ServerRequestInterface $request): ResponseInterface
44+
{
45+
return new Response();
46+
}
2347
};
2448

25-
$response = $middleware->__invoke($request, $response, $next);
49+
$response = $middleware->process($this->request, $requestHandler);
2650

2751
$this->assertSame(503, $response->getStatusCode());
2852
$this->assertSame('', $response->getHeaderLine('Retry-After'));
2953
}
3054

3155
public function testWithRetryAsSeconds()
3256
{
33-
$request = new ServerRequest();
34-
$response = new Response();
35-
36-
$middleware = MaintenanceMiddleware::createWithRetryAsSeconds(3600);
57+
$middleware = MaintenanceMiddleware::createWithRetryAsSeconds(3600, $this->responseFactory);
3758

38-
$next = function() {
39-
throw new Exception('Next should not be called');
40-
};
41-
42-
$response = $middleware->__invoke($request, $response, $next);
59+
$response = $middleware->handle($this->request);
4360

4461
$this->assertSame(503, $response->getStatusCode());
4562
$this->assertSame('3600', $response->getHeaderLine('Retry-After'));
@@ -48,16 +65,9 @@ public function testWithRetryAsSeconds()
4865

4966
public function testWithRetryAsSecondsWithRefresh()
5067
{
51-
$request = new ServerRequest();
52-
$response = new Response();
53-
54-
$middleware = MaintenanceMiddleware::createWithRetryAsSecondsAndRefresh(3600);
68+
$middleware = MaintenanceMiddleware::createWithRetryAsSecondsAndRefresh(3600, $this->responseFactory);
5569

56-
$next = function() {
57-
throw new Exception('Next should not be called');
58-
};
59-
60-
$response = $middleware->__invoke($request, $response, $next);
70+
$response = $middleware->handle($this->request);
6171

6272
$this->assertSame(503, $response->getStatusCode());
6373
$this->assertSame('3600', $response->getHeaderLine('Retry-After'));
@@ -66,18 +76,11 @@ public function testWithRetryAsSecondsWithRefresh()
6676

6777
public function testWithRetryAsDatetime()
6878
{
69-
$request = new ServerRequest();
70-
$response = new Response();
71-
7279
$date = DateTime::createFromFormat('Y-m-d H:i:s', '2015-11-30 11:12:13');
7380

74-
$middleware = MaintenanceMiddleware::createWithRetryAsDateTime($date);
81+
$middleware = MaintenanceMiddleware::createWithRetryAsDateTime($date, $this->responseFactory);
7582

76-
$next = function() {
77-
throw new Exception('Next should not be called');
78-
};
79-
80-
$response = $middleware->__invoke($request, $response, $next);
83+
$response = $middleware->handle($this->request);
8184

8285
$this->assertSame(503, $response->getStatusCode());
8386
$this->assertSame('Mon, 30 Nov 2015 11:12:13 +0000', $response->getHeaderLine('Retry-After'));
@@ -86,18 +89,11 @@ public function testWithRetryAsDatetime()
8689

8790
public function testWithRetryAsDatetimeWithRefresh()
8891
{
89-
$request = new ServerRequest();
90-
$response = new Response();
91-
9292
$date = DateTime::createFromFormat('Y-m-d H:i:s', '2015-11-30 11:12:13');
9393

94-
$middleware = MaintenanceMiddleware::createWithRetryAsDateTimeAndRefresh($date);
95-
96-
$next = function() {
97-
throw new Exception('Next should not be called');
98-
};
94+
$middleware = MaintenanceMiddleware::createWithRetryAsDateTimeAndRefresh($date, $this->responseFactory);
9995

100-
$response = $middleware->__invoke($request, $response, $next);
96+
$response = $middleware->handle($this->request);
10197

10298
$this->assertSame(503, $response->getStatusCode());
10399
$this->assertSame('Mon, 30 Nov 2015 11:12:13 +0000', $response->getHeaderLine('Retry-After'));

0 commit comments

Comments
 (0)