diff --git a/src/Io/Clock.php b/src/Io/Clock.php new file mode 100644 index 00000000..92c1cb09 --- /dev/null +++ b/src/Io/Clock.php @@ -0,0 +1,54 @@ +loop = $loop; + } + + /** @return float */ + public function now() + { + if ($this->now === null) { + $this->now = \microtime(true); + + // remember clock for current loop tick only and update on next tick + $now =& $this->now; + $this->loop->futureTick(function () use (&$now) { + assert($now !== null); + $now = null; + }); + } + + return $this->now; + } +} diff --git a/src/Io/RequestHeaderParser.php b/src/Io/RequestHeaderParser.php index e5554c46..6930afaf 100644 --- a/src/Io/RequestHeaderParser.php +++ b/src/Io/RequestHeaderParser.php @@ -24,6 +24,14 @@ class RequestHeaderParser extends EventEmitter { private $maxSize = 8192; + /** @var Clock */ + private $clock; + + public function __construct(Clock $clock) + { + $this->clock = $clock; + } + public function handle(ConnectionInterface $conn) { $buffer = ''; @@ -155,8 +163,8 @@ public function parseRequest($headers, $remoteSocketUri, $localSocketUri) // create new obj implementing ServerRequestInterface by preserving all // previous properties and restoring original request-target $serverParams = array( - 'REQUEST_TIME' => \time(), - 'REQUEST_TIME_FLOAT' => \microtime(true) + 'REQUEST_TIME' => (int) ($now = $this->clock->now()), + 'REQUEST_TIME_FLOAT' => $now ); // scheme is `http` unless TLS is used diff --git a/src/Io/StreamingServer.php b/src/Io/StreamingServer.php index d73d527d..a054be3d 100644 --- a/src/Io/StreamingServer.php +++ b/src/Io/StreamingServer.php @@ -84,7 +84,9 @@ final class StreamingServer extends EventEmitter { private $callback; private $parser; - private $loop; + + /** @var Clock */ + private $clock; /** * Creates an HTTP server that invokes the given callback for each incoming HTTP request @@ -104,10 +106,9 @@ public function __construct(LoopInterface $loop, $requestHandler) throw new \InvalidArgumentException('Invalid request handler given'); } - $this->loop = $loop; - $this->callback = $requestHandler; - $this->parser = new RequestHeaderParser(); + $this->clock = new Clock($loop); + $this->parser = new RequestHeaderParser($this->clock); $that = $this; $this->parser->on('headers', function (ServerRequestInterface $request, ConnectionInterface $conn) use ($that) { @@ -255,7 +256,7 @@ public function handleResponse(ConnectionInterface $connection, ServerRequestInt // assign default "Date" header from current time automatically if (!$response->hasHeader('Date')) { // IMF-fixdate = day-name "," SP date1 SP time-of-day SP GMT - $response = $response->withHeader('Date', gmdate('D, d M Y H:i:s') . ' GMT'); + $response = $response->withHeader('Date', gmdate('D, d M Y H:i:s', (int) $this->clock->now()) . ' GMT'); } elseif ($response->getHeaderLine('Date') === ''){ $response = $response->withoutHeader('Date'); } diff --git a/tests/HttpServerTest.php b/tests/HttpServerTest.php index a6d8057b..4d00fcef 100644 --- a/tests/HttpServerTest.php +++ b/tests/HttpServerTest.php @@ -54,9 +54,13 @@ public function testConstructWithoutLoopAssignsLoopAutomatically() $ref->setAccessible(true); $streamingServer = $ref->getValue($http); - $ref = new \ReflectionProperty($streamingServer, 'loop'); + $ref = new \ReflectionProperty($streamingServer, 'clock'); $ref->setAccessible(true); - $loop = $ref->getValue($streamingServer); + $clock = $ref->getValue($streamingServer); + + $ref = new \ReflectionProperty($clock, 'loop'); + $ref->setAccessible(true); + $loop = $ref->getValue($clock); $this->assertInstanceOf('React\EventLoop\LoopInterface', $loop); } diff --git a/tests/Io/ClockTest.php b/tests/Io/ClockTest.php new file mode 100644 index 00000000..8f4b90fa --- /dev/null +++ b/tests/Io/ClockTest.php @@ -0,0 +1,43 @@ +getMockBuilder('React\EventLoop\LoopInterface')->getMock(); + + $clock = new Clock($loop); + + $now = $clock->now(); + $this->assertTrue(is_float($now)); // assertIsFloat() on PHPUnit 8+ + $this->assertEquals($now, $clock->now()); + } + + public function testNowResetsMemoizedTimestampOnFutureTick() + { + $tick = null; + $loop = $this->getMockBuilder('React\EventLoop\LoopInterface')->getMock(); + $loop->expects($this->once())->method('futureTick')->with($this->callback(function ($cb) use (&$tick) { + $tick = $cb; + return true; + })); + + $clock = new Clock($loop); + + $now = $clock->now(); + + $ref = new \ReflectionProperty($clock, 'now'); + $ref->setAccessible(true); + $this->assertEquals($now, $ref->getValue($clock)); + + $this->assertNotNull($tick); + $tick(); + + $this->assertNull($ref->getValue($clock)); + } +} diff --git a/tests/Io/RequestHeaderParserTest.php b/tests/Io/RequestHeaderParserTest.php index 356443fb..7ba7fe01 100644 --- a/tests/Io/RequestHeaderParserTest.php +++ b/tests/Io/RequestHeaderParserTest.php @@ -10,7 +10,9 @@ class RequestHeaderParserTest extends TestCase { public function testSplitShouldHappenOnDoubleCrlf() { - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $parser->on('headers', $this->expectCallableNever()); $connection = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(null)->getMock(); @@ -29,7 +31,9 @@ public function testSplitShouldHappenOnDoubleCrlf() public function testFeedInOneGo() { - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $parser->on('headers', $this->expectCallableOnce()); $connection = $this->getMockBuilder('React\Socket\Connection')->disableOriginalConstructor()->setMethods(null)->getMock(); @@ -41,7 +45,9 @@ public function testFeedInOneGo() public function testFeedTwoRequestsOnSeparateConnections() { - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $called = 0; $parser->on('headers', function () use (&$called) { @@ -65,7 +71,9 @@ public function testHeadersEventShouldEmitRequestAndConnection() $request = null; $conn = null; - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $parser->on('headers', function ($parsedRequest, $connection) use (&$request, &$conn) { $request = $parsedRequest; $conn = $connection; @@ -88,7 +96,9 @@ public function testHeadersEventShouldEmitRequestAndConnection() public function testHeadersEventShouldEmitRequestWhichShouldEmitEndForStreamingBodyWithoutContentLengthFromInitialRequestBody() { - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $ended = false; $that = $this; @@ -112,7 +122,9 @@ public function testHeadersEventShouldEmitRequestWhichShouldEmitEndForStreamingB public function testHeadersEventShouldEmitRequestWhichShouldEmitStreamingBodyDataFromInitialRequestBody() { - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $buffer = ''; $that = $this; @@ -140,7 +152,9 @@ public function testHeadersEventShouldEmitRequestWhichShouldEmitStreamingBodyDat public function testHeadersEventShouldEmitRequestWhichShouldEmitStreamingBodyWithPlentyOfDataFromInitialRequestBody() { - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $buffer = ''; $that = $this; @@ -166,7 +180,9 @@ public function testHeadersEventShouldEmitRequestWhichShouldEmitStreamingBodyWit public function testHeadersEventShouldEmitRequestWhichShouldNotEmitStreamingBodyDataWithoutContentLengthFromInitialRequestBody() { - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $buffer = ''; $that = $this; @@ -191,7 +207,9 @@ public function testHeadersEventShouldEmitRequestWhichShouldNotEmitStreamingBody public function testHeadersEventShouldEmitRequestWhichShouldEmitStreamingBodyDataUntilContentLengthBoundaryFromInitialRequestBody() { - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $buffer = ''; $that = $this; @@ -218,7 +236,9 @@ public function testHeadersEventShouldParsePathAndQueryString() { $request = null; - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $parser->on('headers', function ($parsedRequest) use (&$request) { $request = $parsedRequest; }); @@ -245,7 +265,9 @@ public function testHeaderEventWithShouldApplyDefaultAddressFromLocalConnectionA { $request = null; - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $parser->on('headers', function ($parsedRequest) use (&$request) { $request = $parsedRequest; }); @@ -264,7 +286,9 @@ public function testHeaderEventViaHttpsShouldApplyHttpsSchemeFromLocalTlsConnect { $request = null; - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $parser->on('headers', function ($parsedRequest) use (&$request) { $request = $parsedRequest; }); @@ -284,7 +308,9 @@ public function testHeaderOverflowShouldEmitError() $error = null; $passedConnection = null; - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $parser->on('headers', $this->expectCallableNever()); $parser->on('error', function ($message, $connection) use (&$error, &$passedConnection) { $error = $message; @@ -306,7 +332,9 @@ public function testInvalidEmptyRequestHeadersParseException() { $error = null; - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $parser->on('headers', $this->expectCallableNever()); $parser->on('error', function ($message) use (&$error) { $error = $message; @@ -325,7 +353,9 @@ public function testInvalidMalformedRequestLineParseException() { $error = null; - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $parser->on('headers', $this->expectCallableNever()); $parser->on('error', function ($message) use (&$error) { $error = $message; @@ -344,7 +374,9 @@ public function testInvalidMalformedRequestHeadersThrowsParseException() { $error = null; - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $parser->on('headers', $this->expectCallableNever()); $parser->on('error', function ($message) use (&$error) { $error = $message; @@ -363,7 +395,9 @@ public function testInvalidMalformedRequestHeadersWhitespaceThrowsParseException { $error = null; - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $parser->on('headers', $this->expectCallableNever()); $parser->on('error', function ($message) use (&$error) { $error = $message; @@ -382,7 +416,9 @@ public function testInvalidAbsoluteFormSchemeEmitsError() { $error = null; - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $parser->on('headers', $this->expectCallableNever()); $parser->on('error', function ($message) use (&$error) { $error = $message; @@ -401,7 +437,9 @@ public function testOriginFormWithSchemeSeparatorInParam() { $request = null; - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $parser->on('error', $this->expectCallableNever()); $parser->on('headers', function ($parsedRequest, $parsedBodyBuffer) use (&$request) { $request = $parsedRequest; @@ -426,7 +464,9 @@ public function testUriStartingWithColonSlashSlashFails() { $error = null; - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $parser->on('headers', $this->expectCallableNever()); $parser->on('error', function ($message) use (&$error) { $error = $message; @@ -445,7 +485,9 @@ public function testInvalidAbsoluteFormWithFragmentEmitsError() { $error = null; - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $parser->on('headers', $this->expectCallableNever()); $parser->on('error', function ($message) use (&$error) { $error = $message; @@ -464,7 +506,9 @@ public function testInvalidHeaderContainsFullUri() { $error = null; - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $parser->on('headers', $this->expectCallableNever()); $parser->on('error', function ($message) use (&$error) { $error = $message; @@ -483,7 +527,9 @@ public function testInvalidAbsoluteFormWithHostHeaderEmpty() { $error = null; - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $parser->on('headers', $this->expectCallableNever()); $parser->on('error', function ($message) use (&$error) { $error = $message; @@ -502,7 +548,9 @@ public function testInvalidConnectRequestWithNonAuthorityForm() { $error = null; - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $parser->on('headers', $this->expectCallableNever()); $parser->on('error', function ($message) use (&$error) { $error = $message; @@ -521,7 +569,9 @@ public function testInvalidHttpVersion() { $error = null; - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $parser->on('headers', $this->expectCallableNever()); $parser->on('error', function ($message) use (&$error) { $error = $message; @@ -541,7 +591,9 @@ public function testInvalidContentLengthRequestHeaderWillEmitError() { $error = null; - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $parser->on('headers', $this->expectCallableNever()); $parser->on('error', function ($message) use (&$error) { $error = $message; @@ -561,7 +613,9 @@ public function testInvalidRequestWithMultipleContentLengthRequestHeadersWillEmi { $error = null; - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $parser->on('headers', $this->expectCallableNever()); $parser->on('error', function ($message) use (&$error) { $error = $message; @@ -581,7 +635,9 @@ public function testInvalidTransferEncodingRequestHeaderWillEmitError() { $error = null; - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $parser->on('headers', $this->expectCallableNever()); $parser->on('error', function ($message) use (&$error) { $error = $message; @@ -601,7 +657,9 @@ public function testInvalidRequestWithBothTransferEncodingAndContentLengthWillEm { $error = null; - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $parser->on('headers', $this->expectCallableNever()); $parser->on('error', function ($message) use (&$error) { $error = $message; @@ -621,7 +679,10 @@ public function testServerParamsWillBeSetOnHttpsRequest() { $request = null; - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + $clock->expects($this->once())->method('now')->willReturn(1652972091.3958); + + $parser = new RequestHeaderParser($clock); $parser->on('headers', function ($parsedRequest) use (&$request) { $request = $parsedRequest; @@ -637,8 +698,8 @@ public function testServerParamsWillBeSetOnHttpsRequest() $serverParams = $request->getServerParams(); $this->assertEquals('on', $serverParams['HTTPS']); - $this->assertNotEmpty($serverParams['REQUEST_TIME']); - $this->assertNotEmpty($serverParams['REQUEST_TIME_FLOAT']); + $this->assertEquals(1652972091, $serverParams['REQUEST_TIME']); + $this->assertEquals(1652972091.3958, $serverParams['REQUEST_TIME_FLOAT']); $this->assertEquals('127.1.1.1', $serverParams['SERVER_ADDR']); $this->assertEquals('8000', $serverParams['SERVER_PORT']); @@ -651,7 +712,10 @@ public function testServerParamsWillBeSetOnHttpRequest() { $request = null; - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + $clock->expects($this->once())->method('now')->willReturn(1652972091.3958); + + $parser = new RequestHeaderParser($clock); $parser->on('headers', function ($parsedRequest) use (&$request) { $request = $parsedRequest; @@ -667,8 +731,8 @@ public function testServerParamsWillBeSetOnHttpRequest() $serverParams = $request->getServerParams(); $this->assertArrayNotHasKey('HTTPS', $serverParams); - $this->assertNotEmpty($serverParams['REQUEST_TIME']); - $this->assertNotEmpty($serverParams['REQUEST_TIME_FLOAT']); + $this->assertEquals(1652972091, $serverParams['REQUEST_TIME']); + $this->assertEquals(1652972091.3958, $serverParams['REQUEST_TIME_FLOAT']); $this->assertEquals('127.1.1.1', $serverParams['SERVER_ADDR']); $this->assertEquals('8000', $serverParams['SERVER_PORT']); @@ -681,7 +745,10 @@ public function testServerParamsWillNotSetRemoteAddressForUnixDomainSockets() { $request = null; - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + $clock->expects($this->once())->method('now')->willReturn(1652972091.3958); + + $parser = new RequestHeaderParser($clock); $parser->on('headers', function ($parsedRequest) use (&$request) { $request = $parsedRequest; @@ -697,8 +764,8 @@ public function testServerParamsWillNotSetRemoteAddressForUnixDomainSockets() $serverParams = $request->getServerParams(); $this->assertArrayNotHasKey('HTTPS', $serverParams); - $this->assertNotEmpty($serverParams['REQUEST_TIME']); - $this->assertNotEmpty($serverParams['REQUEST_TIME_FLOAT']); + $this->assertEquals(1652972091, $serverParams['REQUEST_TIME']); + $this->assertEquals(1652972091.3958, $serverParams['REQUEST_TIME_FLOAT']); $this->assertArrayNotHasKey('SERVER_ADDR', $serverParams); $this->assertArrayNotHasKey('SERVER_PORT', $serverParams); @@ -715,7 +782,10 @@ public function testServerParamsWontBeSetOnMissingUrls() $request = null; - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + $clock->expects($this->once())->method('now')->willReturn(1652972091.3958); + + $parser = new RequestHeaderParser($clock); $parser->on('headers', function ($parsedRequest) use (&$request) { $request = $parsedRequest; @@ -728,8 +798,8 @@ public function testServerParamsWontBeSetOnMissingUrls() $serverParams = $request->getServerParams(); - $this->assertNotEmpty($serverParams['REQUEST_TIME']); - $this->assertNotEmpty($serverParams['REQUEST_TIME_FLOAT']); + $this->assertEquals(1652972091, $serverParams['REQUEST_TIME']); + $this->assertEquals(1652972091.3958, $serverParams['REQUEST_TIME_FLOAT']); $this->assertArrayNotHasKey('SERVER_ADDR', $serverParams); $this->assertArrayNotHasKey('SERVER_PORT', $serverParams); @@ -742,7 +812,9 @@ public function testQueryParmetersWillBeSet() { $request = null; - $parser = new RequestHeaderParser(); + $clock = $this->getMockBuilder('React\Http\Io\Clock')->disableOriginalConstructor()->getMock(); + + $parser = new RequestHeaderParser($clock); $parser->on('headers', function ($parsedRequest) use (&$request) { $request = $parsedRequest; diff --git a/tests/Io/StreamingServerTest.php b/tests/Io/StreamingServerTest.php index 45729f2b..2703362a 100644 --- a/tests/Io/StreamingServerTest.php +++ b/tests/Io/StreamingServerTest.php @@ -2292,12 +2292,20 @@ function ($data) use (&$buffer) { $this->assertContainsString("5\r\nhello\r\n", $buffer); } - public function testResponseWithoutExplicitDateHeaderWillAddCurrentDate() + public function testResponseWithoutExplicitDateHeaderWillAddCurrentDateFromClock() { $server = new StreamingServer(Loop::get(), function (ServerRequestInterface $request) { return new Response(); }); + $ref = new \ReflectionProperty($server, 'clock'); + $ref->setAccessible(true); + $clock = $ref->getValue($server); + + $ref = new \ReflectionProperty($clock, 'now'); + $ref->setAccessible(true); + $ref->setValue($clock, 1652972091.3958); + $buffer = ''; $this->connection ->expects($this->any()) @@ -2318,11 +2326,11 @@ function ($data) use (&$buffer) { $this->connection->emit('data', array($data)); $this->assertContainsString("HTTP/1.1 200 OK\r\n", $buffer); - $this->assertContainsString("Date:", $buffer); + $this->assertContainsString("Date: Thu, 19 May 2022 14:54:51 GMT\r\n", $buffer); $this->assertContainsString("\r\n\r\n", $buffer); } - public function testResponseWIthCustomDateHeaderOverwritesDefault() + public function testResponseWithCustomDateHeaderOverwritesDefault() { $server = new StreamingServer(Loop::get(), function (ServerRequestInterface $request) { return new Response( @@ -3022,7 +3030,8 @@ public function testRequestCookieWithSeparatorWillBeAddedToServerRequest() $this->assertEquals(array('hello' => 'world', 'test' => 'abc'), $requestValidation->getCookieParams()); } - public function testRequestCookieWithCommaValueWillBeAddedToServerRequest() { + public function testRequestCookieWithCommaValueWillBeAddedToServerRequest() + { $requestValidation = null; $server = new StreamingServer(Loop::get(), function (ServerRequestInterface $request) use (&$requestValidation) { $requestValidation = $request; @@ -3045,7 +3054,7 @@ public function testNewConnectionWillInvokeParserOnce() { $server = new StreamingServer(Loop::get(), $this->expectCallableNever()); - $parser = $this->getMockBuilder('React\Http\Io\RequestHeaderParser')->getMock(); + $parser = $this->getMockBuilder('React\Http\Io\RequestHeaderParser')->disableOriginalConstructor()->getMock(); $parser->expects($this->once())->method('handle'); $ref = new \ReflectionProperty($server, 'parser'); @@ -3062,7 +3071,7 @@ public function testNewConnectionWillInvokeParserOnceAndInvokeRequestHandlerWhen $server = new StreamingServer(Loop::get(), $this->expectCallableOnceWith($request)); - $parser = $this->getMockBuilder('React\Http\Io\RequestHeaderParser')->getMock(); + $parser = $this->getMockBuilder('React\Http\Io\RequestHeaderParser')->disableOriginalConstructor()->getMock(); $parser->expects($this->once())->method('handle'); $ref = new \ReflectionProperty($server, 'parser'); @@ -3085,7 +3094,7 @@ public function testNewConnectionWillInvokeParserOnceAndInvokeRequestHandlerWhen $server = new StreamingServer(Loop::get(), $this->expectCallableOnceWith($request)); - $parser = $this->getMockBuilder('React\Http\Io\RequestHeaderParser')->getMock(); + $parser = $this->getMockBuilder('React\Http\Io\RequestHeaderParser')->disableOriginalConstructor()->getMock(); $parser->expects($this->once())->method('handle'); $ref = new \ReflectionProperty($server, 'parser'); @@ -3110,7 +3119,7 @@ public function testNewConnectionWillInvokeParserOnceAndInvokeRequestHandlerWhen return new Response(200, array('Connection' => 'close')); }); - $parser = $this->getMockBuilder('React\Http\Io\RequestHeaderParser')->getMock(); + $parser = $this->getMockBuilder('React\Http\Io\RequestHeaderParser')->disableOriginalConstructor()->getMock(); $parser->expects($this->once())->method('handle'); $ref = new \ReflectionProperty($server, 'parser'); @@ -3135,7 +3144,7 @@ public function testNewConnectionWillInvokeParserTwiceAfterInvokingRequestHandle return new Response(); }); - $parser = $this->getMockBuilder('React\Http\Io\RequestHeaderParser')->getMock(); + $parser = $this->getMockBuilder('React\Http\Io\RequestHeaderParser')->disableOriginalConstructor()->getMock(); $parser->expects($this->exactly(2))->method('handle'); $ref = new \ReflectionProperty($server, 'parser'); @@ -3160,7 +3169,7 @@ public function testNewConnectionWillInvokeParserTwiceAfterInvokingRequestHandle return new Response(); }); - $parser = $this->getMockBuilder('React\Http\Io\RequestHeaderParser')->getMock(); + $parser = $this->getMockBuilder('React\Http\Io\RequestHeaderParser')->disableOriginalConstructor()->getMock(); $parser->expects($this->exactly(2))->method('handle'); $ref = new \ReflectionProperty($server, 'parser'); @@ -3186,7 +3195,7 @@ public function testNewConnectionWillInvokeParserOnceAfterInvokingRequestHandler return new Response(200, array(), $body); }); - $parser = $this->getMockBuilder('React\Http\Io\RequestHeaderParser')->getMock(); + $parser = $this->getMockBuilder('React\Http\Io\RequestHeaderParser')->disableOriginalConstructor()->getMock(); $parser->expects($this->once())->method('handle'); $ref = new \ReflectionProperty($server, 'parser'); @@ -3212,7 +3221,7 @@ public function testNewConnectionWillInvokeParserTwiceAfterInvokingRequestHandle return new Response(200, array(), $body); }); - $parser = $this->getMockBuilder('React\Http\Io\RequestHeaderParser')->getMock(); + $parser = $this->getMockBuilder('React\Http\Io\RequestHeaderParser')->disableOriginalConstructor()->getMock(); $parser->expects($this->exactly(2))->method('handle'); $ref = new \ReflectionProperty($server, 'parser');