88use React \Http \Io \IniUtil ;
99use React \Promise \Promise ;
1010use React \Stream \ReadableStreamInterface ;
11+ use React \Promise \PromiseInterface ;
1112
1213final 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