Skip to content

Commit f05ef0a

Browse files
committed
First implementation
1 parent e3ea782 commit f05ef0a

8 files changed

+172
-0
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
/vendor/
2+
composer.lock

.travis.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
language: php
2+
3+
php:
4+
- 5.6
5+
- 7.0
6+
- 7.1
7+
- hhvm
8+
9+
env:
10+
- DEPS=lowest
11+
- DEPS=latest
12+
13+
before_script:
14+
- if [[ $DEPS == 'lowest' ]]; then travis_retry composer update --prefer-stable --no-interaction --prefer-lowest ; fi
15+
- if [[ $DEPS == 'latest' ]]; then travis_retry composer update --prefer-stable --no-interaction ; fi
16+
17+
script:
18+
- ./vendor/bin/phpunit

composer.json

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
"name": "php-middleware/double-pass-compatibility",
3+
"description": "Tools for support double pass middewares in PSR-15",
4+
"type": "library",
5+
"keywords": [
6+
"middleware",
7+
"psr",
8+
"psr-7",
9+
"psr-15"
10+
],
11+
"require": {
12+
"php": ">=5.6",
13+
"psr/http-message": "^1.0",
14+
"http-interop/http-middleware": "^0.4.1"
15+
},
16+
"require-dev": {
17+
"phpunit/phpunit": "^5.6 || ^6.1"
18+
},
19+
"autoload": {
20+
"psr-4": {
21+
"PhpMiddleware\\": "src/"
22+
}
23+
},
24+
"autoload-dev": {
25+
"psr-4": {
26+
"PhpMiddlewareTest\\": "test/"
27+
}
28+
}
29+
}

phpunit.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
3+
<phpunit bootstrap="./vendor/autoload.php" colors="true">
4+
<testsuites>
5+
<testsuite>
6+
<directory>./test</directory>
7+
</testsuite>
8+
</testsuites>
9+
10+
<filter>
11+
<whitelist processUncoveredFilesFromWhitelist="true">
12+
<directory suffix=".php">./src</directory>
13+
</whitelist>
14+
</filter>
15+
</phpunit>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
namespace PhpMiddleware;
4+
5+
use Interop\Http\ServerMiddleware\MiddlewareInterface;
6+
7+
abstract class AbstractDoublePassCompatibilityMiddleware implements MiddlewareInterface
8+
{
9+
use DoublePassCompatibilityTrait;
10+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
namespace PhpMiddleware;
4+
5+
use Psr\Http\Message\ResponseInterface;
6+
use Psr\Http\Message\ServerRequestInterface;
7+
8+
trait DoublePassCompatibilityTrait
9+
{
10+
/**
11+
* @param ServerRequestInterface $request
12+
* @param ResponseInterface $response
13+
* @param callable $next
14+
*
15+
* @return ResponseInterface
16+
*/
17+
final public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next)
18+
{
19+
$delegate = new DoublePassDelegate($next, $response);
20+
21+
return $this->process($request, $delegate);
22+
}
23+
}

src/DoublePassDelegate.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
namespace PhpMiddleware;
4+
5+
use Interop\Http\ServerMiddleware\DelegateInterface;
6+
use Psr\Http\Message\ResponseInterface;
7+
use Psr\Http\Message\ServerRequestInterface;
8+
9+
final class DoublePassDelegate implements DelegateInterface
10+
{
11+
private $delegate;
12+
private $response;
13+
14+
public function __construct(callable $delegate, ResponseInterface $response)
15+
{
16+
$this->delegate = $delegate;
17+
$this->response = $response;
18+
}
19+
20+
public function process(ServerRequestInterface $request)
21+
{
22+
return call_user_func($this->delegate, $request, $this->response);
23+
}
24+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
3+
namespace PhpMiddleware\Test;
4+
5+
use Interop\Http\ServerMiddleware\DelegateInterface;
6+
use PhpMiddleware\AbstractDoublePassCompatibilityMiddleware;
7+
use PHPUnit\Framework\TestCase;
8+
use Psr\Http\Message\ResponseInterface;
9+
use Psr\Http\Message\ServerRequestInterface;
10+
11+
class AbstractDoublePassCompatibilityMiddlewareTest extends TestCase
12+
{
13+
public function testExecuteSinglePassOnDoublePassCall()
14+
{
15+
$request = $this->getMockBuilder(ServerRequestInterface::class)->getMock();
16+
$response = $this->getMockBuilder(ResponseInterface::class)->getMock();
17+
18+
$next = function ($request, $response) {
19+
return $response;
20+
};
21+
22+
$middleware = $this->getMockForAbstractClass(AbstractDoublePassCompatibilityMiddleware::class);
23+
$middleware->method('process')->willReturnCallback(function(ServerRequestInterface $request, DelegateInterface $delegate) {
24+
return $delegate->process($request);
25+
});
26+
27+
$result = $middleware($request, $response, $next);
28+
29+
$this->assertSame($response, $result);
30+
}
31+
32+
public function testExecuteSinglePassOnDoublePassCallAndReturnNewResponse()
33+
{
34+
$request = $this->getMockBuilder(ServerRequestInterface::class)->getMock();
35+
$response = $this->getMockBuilder(ResponseInterface::class)->getMock();
36+
$newResponse = $this->getMockBuilder(ResponseInterface::class)->getMock();
37+
38+
$next = function ($request, $response) {
39+
return $response;
40+
};
41+
42+
$middleware = $this->getMockForAbstractClass(AbstractDoublePassCompatibilityMiddleware::class);
43+
$middleware->method('process')->willReturnCallback(function(ServerRequestInterface $request, DelegateInterface $delegate) use ($newResponse) {
44+
return $newResponse;
45+
});
46+
47+
$result = $middleware($request, $response, $next);
48+
49+
$this->assertSame($newResponse, $result);
50+
}
51+
}

0 commit comments

Comments
 (0)