Skip to content

Commit 505dd30

Browse files
committed
Avoid promise wrapping for middleware next request handlers
1 parent 800ca51 commit 505dd30

2 files changed

Lines changed: 34 additions & 30 deletions

File tree

src/Io/MiddlewareRunner.php

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
use Psr\Http\Message\ResponseInterface;
66
use Psr\Http\Message\ServerRequestInterface;
7-
use React\Promise;
87
use React\Promise\PromiseInterface;
98

109
/**
@@ -29,12 +28,13 @@ public function __construct(array $middleware)
2928

3029
/**
3130
* @param ServerRequestInterface $request
32-
* @return PromiseInterface<ResponseInterface>
31+
* @return ResponseInterface|PromiseInterface<ResponseInterface>
32+
* @throws Exception
3333
*/
3434
public function __invoke(ServerRequestInterface $request)
3535
{
3636
if (count($this->middleware) === 0) {
37-
return Promise\reject(new \RuntimeException('No middleware to run'));
37+
throw new \RuntimeException('No middleware to run');
3838
}
3939

4040
return $this->call($request, 0);
@@ -49,14 +49,6 @@ public function call(ServerRequestInterface $request, $position)
4949
};
5050

5151
$handler = $this->middleware[$position];
52-
try {
53-
return Promise\resolve($handler($request, $next));
54-
} catch (\Exception $error) {
55-
// request handler callback throws an Exception
56-
return Promise\reject($error);
57-
} catch (\Throwable $error) { // @codeCoverageIgnoreStart
58-
// request handler callback throws a PHP7+ Error
59-
return Promise\reject($error); // @codeCoverageIgnoreEnd
60-
}
52+
return $handler($request, $next);
6153
}
6254
}

tests/Io/MiddlewareRunnerTest.php

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,28 @@
1414
use RingCentral\Psr7\Response;
1515
use Psr\Http\Message\RequestInterface;
1616
use React\Promise\CancellablePromiseInterface;
17+
use React\Promise\PromiseInterface;
1718

1819
final class MiddlewareRunnerTest extends TestCase
1920
{
2021
/**
2122
* @expectedException RuntimeException
2223
* @expectedExceptionMessage No middleware to run
2324
*/
24-
public function testDefaultResponse()
25+
public function testEmptyMiddlewareStackThrowsException()
2526
{
2627
$request = new ServerRequest('GET', 'https://example.com/');
2728
$middlewares = array();
2829
$middlewareStack = new MiddlewareRunner($middlewares);
2930

30-
Block\await($middlewareStack($request), Factory::create());
31+
$middlewareStack($request);
3132
}
3233

33-
public function testReturnsRejectedPromiseIfHandlerThrowsException()
34+
/**
35+
* @expectedException RuntimeException
36+
* @expectedExceptionMessage hello
37+
*/
38+
public function testThrowsIfHandlerThrowsException()
3439
{
3540
$middleware = new MiddlewareRunner(array(
3641
function (ServerRequestInterface $request) {
@@ -40,15 +45,15 @@ function (ServerRequestInterface $request) {
4045

4146
$request = new ServerRequest('GET', 'http://example.com/');
4247

43-
$promise = $middleware($request);
44-
45-
$promise->then(null, $this->expectCallableOnceWith($this->isInstanceOf('RuntimeException')));
48+
$middleware($request);
4649
}
4750

4851
/**
4952
* @requires PHP 7
53+
* @expectedException Throwable
54+
* @expectedExceptionMessage hello
5055
*/
51-
public function testReturnsRejectedPromiseIfHandlerThrowsThrowable()
56+
public function testThrowsIfHandlerThrowsThrowable()
5257
{
5358
$middleware = new MiddlewareRunner(array(
5459
function (ServerRequestInterface $request) {
@@ -58,9 +63,7 @@ function (ServerRequestInterface $request) {
5863

5964
$request = new ServerRequest('GET', 'http://example.com/');
6065

61-
$promise = $middleware($request);
62-
63-
$promise->then(null, $this->expectCallableOnceWith($this->isInstanceOf('Throwable')));
66+
$middleware($request);
6467
}
6568

6669
public function provideProcessStackMiddlewares()
@@ -126,9 +129,14 @@ public function testProcessStack(array $middlewares, $expectedCallCount)
126129
$request = new ServerRequest('GET', 'https://example.com/');
127130
$middlewareStack = new MiddlewareRunner($middlewares);
128131

129-
/** @var ResponseInterface $result */
130-
$result = Block\await($middlewareStack($request), Factory::create());
131-
$this->assertSame(200, $result->getStatusCode());
132+
$response = $middlewareStack($request);
133+
134+
$this->assertTrue($response instanceof PromiseInterface);
135+
$response = Block\await($response, Factory::create());
136+
137+
$this->assertTrue($response instanceof ResponseInterface);
138+
$this->assertSame(200, $response->getStatusCode());
139+
132140
foreach ($middlewares as $middleware) {
133141
if (!($middleware instanceof ProcessStack)) {
134142
continue;
@@ -163,7 +171,11 @@ public function testNextCanBeRunMoreThanOnceWithoutCorruptingTheMiddlewareStack(
163171
$retryCalled = 0;
164172
$error = null;
165173
$retry = function ($request, $next) use (&$error, &$retryCalled) {
166-
return $next($request)->then(null, function ($et) use (&$error, $request, $next, &$retryCalled) {
174+
$promise = new \React\Promise\Promise(function ($resolve) use ($request, $next) {
175+
$resolve($next($request));
176+
});
177+
178+
return $promise->then(null, function ($et) use (&$error, $request, $next, &$retryCalled) {
167179
$retryCalled++;
168180
$error = $et;
169181
// the $next failed. discard $error and retry once again:
@@ -214,7 +226,7 @@ function (ServerRequestInterface $request, $next) use (&$receivedRequests) {
214226
},
215227
function (ServerRequestInterface $request, $next) use (&$receivedRequests) {
216228
$receivedRequests[] = 'middleware3: ' . $request->getUri();
217-
return $next($request);
229+
return new \React\Promise\Promise(function () { });
218230
}
219231
));
220232

@@ -372,9 +384,9 @@ public function testUncommonMiddlewareArrayFormats($middlewareFactory, $expected
372384
$request = new ServerRequest('GET', 'https://example.com/');
373385
$middlewareStack = new MiddlewareRunner($middlewareFactory());
374386

375-
/** @var ResponseInterface $response */
376-
$response = Block\await($middlewareStack($request), Factory::create());
387+
$response = $middlewareStack($request);
377388

389+
$this->assertTrue($response instanceof ResponseInterface);
378390
$this->assertSame($expectedSequence, (string) $response->getBody());
379391
}
380392

@@ -397,7 +409,7 @@ function (RequestInterface $request) use (&$called) {
397409

398410
$request = new ServerRequest('GET', 'http://example.com/');
399411

400-
$response = Block\await($middleware($request), Factory::create());
412+
$response = $middleware($request);
401413

402414
$this->assertTrue($response instanceof ResponseInterface);
403415
$this->assertEquals(2, $called);

0 commit comments

Comments
 (0)