Skip to content

Commit 478b3ea

Browse files
authored
Update RequestBodyBufferMiddleware.php
1 parent 212382c commit 478b3ea

File tree

1 file changed

+10
-6
lines changed

1 file changed

+10
-6
lines changed

src/Middleware/RequestBodyBufferMiddleware.php

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use React\Http\Io\IniUtil;
99
use React\Promise\Promise;
1010
use React\Stream\ReadableStreamInterface;
11+
use React\Promise\PromiseInterface;
1112

1213
final class RequestBodyBufferMiddleware
1314
{
@@ -52,8 +53,9 @@ public function __invoke(ServerRequestInterface $request, $next)
5253

5354
/** @var ?\Closure $closer */
5455
$closer = null;
55-
56-
return new Promise(function ($resolve, $reject) use ($body, &$closer, $sizeLimit, $request, $next) {
56+
$response = null;
57+
58+
return new Promise(function ($resolve, $reject) use ($body, &$closer, $sizeLimit, $request, $next, &$response) {
5759
// buffer request body data in memory, discard but keep buffering if limit is reached
5860
$buffer = '';
5961
$bufferer = null;
@@ -72,10 +74,10 @@ public function __invoke(ServerRequestInterface $request, $next)
7274
});
7375

7476
// call $next with current buffer and resolve or reject with its results
75-
$body->on('close', $closer = function () use (&$buffer, $request, $resolve, $reject, $next) {
77+
$body->on('close', $closer = function () use (&$buffer, $request, $resolve, $reject, $next, &$response) {
7678
try {
7779
// resolve with result of next handler
78-
$resolve($next($request->withBody(new BufferedBody($buffer))));
80+
$resolve($next($response = $request->withBody(new BufferedBody($buffer))));
7981
} catch (\Throwable $e) {
8082
$reject($e);
8183
}
@@ -94,12 +96,14 @@ public function __invoke(ServerRequestInterface $request, $next)
9496
$e
9597
));
9698
});
97-
}, function () use ($body, &$closer) {
99+
}, function () use ($body, &$closer, &$response) {
98100
// cancelled buffering: remove close handler to avoid resolving, then close and reject
99101
assert($closer instanceof \Closure);
100102
$body->removeListener('close', $closer);
101103
$body->close();
102-
104+
if ($response instanceof PromiseInterface) {
105+
$response->cancel();
106+
}
103107
throw new \RuntimeException('Cancelled buffering request body');
104108
});
105109
}

0 commit comments

Comments
 (0)