22
33namespace React \Tests \Http \Middleware ;
44
5+ use Clue \React \Block ;
56use Psr \Http \Message \ServerRequestInterface ;
67use React \EventLoop \Factory ;
78use React \Http \Io \HttpBodyStream ;
89use React \Http \Io \ServerRequest ;
910use React \Http \Middleware \RequestBodyBufferMiddleware ;
11+ use React \Http \Response ;
1012use React \Stream \ThroughStream ;
1113use React \Tests \Http \TestCase ;
1214use RingCentral \Psr7 \BufferStream ;
13- use Clue \React \Block ;
1415
1516final class RequestBodyBufferMiddlewareTest extends TestCase
1617{
@@ -37,6 +38,7 @@ function (ServerRequestInterface $request) use (&$exposedRequest) {
3738 $ stream ->write ('world ' );
3839 $ stream ->end ('! ' );
3940
41+ $ this ->assertSame (11 , $ exposedRequest ->getBody ()->getSize ());
4042 $ this ->assertSame ('helloworld! ' , $ exposedRequest ->getBody ()->getContents ());
4143 }
4244
@@ -62,13 +64,14 @@ function (ServerRequestInterface $request) use (&$exposedRequest) {
6264 }
6365 );
6466
67+ $ this ->assertSame ($ size , $ exposedRequest ->getBody ()->getSize ());
6568 $ this ->assertSame ($ body , $ exposedRequest ->getBody ()->getContents ());
6669 }
6770
68- public function testExcessiveSizeImmediatelyReturnsError413ForKnownSize ()
71+ public function testKnownExcessiveSizedBodyIsDisgardedTheRequestIsPassedDownToTheNextMiddleware ()
6972 {
7073 $ loop = Factory::create ();
71-
74+
7275 $ stream = new ThroughStream ();
7376 $ stream ->end ('aa ' );
7477 $ serverRequest = new ServerRequest (
@@ -79,17 +82,40 @@ public function testExcessiveSizeImmediatelyReturnsError413ForKnownSize()
7982 );
8083
8184 $ buffer = new RequestBodyBufferMiddleware (1 );
82- $ response = $ buffer (
85+ $ response = Block \await ( $ buffer (
8386 $ serverRequest ,
8487 function (ServerRequestInterface $ request ) {
85- return $ request ;
88+ return new Response ( 200 , array (), $ request-> getBody ()-> getContents ()) ;
8689 }
90+ ), $ loop );
91+
92+ $ this ->assertSame (200 , $ response ->getStatusCode ());
93+ $ this ->assertSame ('' , $ response ->getBody ()->getContents ());
94+ }
95+
96+ public function testAlreadyBufferedExceedingSizeResolvesImmediatelyWithEmptyBody ()
97+ {
98+ $ serverRequest = new ServerRequest (
99+ 'GET ' ,
100+ 'https://example.com/ ' ,
101+ array (),
102+ 'hello '
87103 );
88104
89- $ this ->assertSame (413 , $ response ->getStatusCode ());
105+ $ exposedRequest = null ;
106+ $ buffer = new RequestBodyBufferMiddleware (1 );
107+ $ buffer (
108+ $ serverRequest ,
109+ function (ServerRequestInterface $ request ) use (&$ exposedRequest ) {
110+ $ exposedRequest = $ request ;
111+ }
112+ );
113+
114+ $ this ->assertSame (0 , $ exposedRequest ->getBody ()->getSize ());
115+ $ this ->assertSame ('' , $ exposedRequest ->getBody ()->getContents ());
90116 }
91117
92- public function testExcessiveSizeReturnsError413 ()
118+ public function testExcessiveSizeBodyIsDiscardedAndTheRequestIsPassedDownToTheNextMiddleware ()
93119 {
94120 $ loop = Factory::create ();
95121
@@ -105,23 +131,19 @@ public function testExcessiveSizeReturnsError413()
105131 $ promise = $ buffer (
106132 $ serverRequest ,
107133 function (ServerRequestInterface $ request ) {
108- return $ request ;
134+ return new Response ( 200 , array (), $ request-> getBody ()-> getContents ()) ;
109135 }
110136 );
111137
112138 $ stream ->end ('aa ' );
113139
114- $ exposedResponse = null ;
115- $ promise ->then (
116- function ($ response ) use (&$ exposedResponse ) {
117- $ exposedResponse = $ response ;
118- },
140+ $ exposedResponse = Block \await ($ promise ->then (
141+ null ,
119142 $ this ->expectCallableNever ()
120- );
121-
122- $ this ->assertSame (413 , $ exposedResponse ->getStatusCode ());
143+ ), $ loop );
123144
124- Block \await ($ promise , $ loop );
145+ $ this ->assertSame (200 , $ exposedResponse ->getStatusCode ());
146+ $ this ->assertSame ('' , $ exposedResponse ->getBody ()->getContents ());
125147 }
126148
127149 /**
@@ -130,7 +152,7 @@ function($response) use (&$exposedResponse) {
130152 public function testBufferingErrorThrows ()
131153 {
132154 $ loop = Factory::create ();
133-
155+
134156 $ stream = new ThroughStream ();
135157 $ serverRequest = new ServerRequest (
136158 'GET ' ,
@@ -151,4 +173,30 @@ function (ServerRequestInterface $request) {
151173
152174 Block \await ($ promise , $ loop );
153175 }
176+
177+ public function testFullBodyStreamedBeforeCallingNextMiddleware ()
178+ {
179+ $ promiseResolved = false ;
180+ $ middleware = new RequestBodyBufferMiddleware (3 );
181+ $ stream = new ThroughStream ();
182+ $ serverRequest = new ServerRequest (
183+ 'GET ' ,
184+ 'https://example.com/ ' ,
185+ array (),
186+ new HttpBodyStream ($ stream , null )
187+ );
188+
189+ $ middleware ($ serverRequest , function () {
190+ return new Response ();
191+ })->then (function () use (&$ promiseResolved ) {
192+ $ promiseResolved = true ;
193+ });
194+
195+ $ stream ->write ('aaa ' );
196+ $ this ->assertFalse ($ promiseResolved );
197+ $ stream ->write ('aaa ' );
198+ $ this ->assertFalse ($ promiseResolved );
199+ $ stream ->end ('aaa ' );
200+ $ this ->assertTrue ($ promiseResolved );
201+ }
154202}
0 commit comments