|
6 | 6 | use React\EventLoop\Factory;
|
7 | 7 | use React\Http\Io\StreamingServer;
|
8 | 8 | use React\Http\Message\Response;
|
| 9 | +use React\Http\Message\ServerRequest; |
9 | 10 | use React\Promise\Promise;
|
10 | 11 | use React\Stream\ThroughStream;
|
11 | 12 | use React\Tests\Http\SocketServerStub;
|
@@ -957,7 +958,7 @@ function ($data) use (&$buffer) {
|
957 | 958 | $data = "GET / HTTP/1.1\r\n\r\n";
|
958 | 959 | $this->connection->emit('data', array($data));
|
959 | 960 |
|
960 |
| - $this->assertEquals("HTTP/1.1 200 OK\r\nUpgrade: demo\r\nContent-Length: 3\r\nConnection: close\r\n\r\nfoo", $buffer); |
| 961 | + $this->assertEquals("HTTP/1.1 200 OK\r\nUpgrade: demo\r\nContent-Length: 3\r\n\r\nfoo", $buffer); |
961 | 962 | }
|
962 | 963 |
|
963 | 964 | public function testResponseUpgradeWishInRequestCanBeIgnoredByReturningNormalResponse()
|
@@ -992,7 +993,7 @@ function ($data) use (&$buffer) {
|
992 | 993 | $data = "GET / HTTP/1.1\r\nUpgrade: demo\r\n\r\n";
|
993 | 994 | $this->connection->emit('data', array($data));
|
994 | 995 |
|
995 |
| - $this->assertEquals("HTTP/1.1 200 OK\r\nContent-Length: 3\r\nConnection: close\r\n\r\nfoo", $buffer); |
| 996 | + $this->assertEquals("HTTP/1.1 200 OK\r\nContent-Length: 3\r\n\r\nfoo", $buffer); |
996 | 997 | }
|
997 | 998 |
|
998 | 999 | public function testResponseUpgradeSwitchingProtocolIncludesConnectionUpgradeHeaderWithoutContentLength()
|
@@ -2813,6 +2814,198 @@ public function testRequestCookieWithCommaValueWillBeAddedToServerRequest() {
|
2813 | 2814 | $this->assertEquals(array('test' => 'abc,def', 'hello' => 'world'), $requestValidation->getCookieParams());
|
2814 | 2815 | }
|
2815 | 2816 |
|
| 2817 | + public function testNewConnectionWillInvokeParserOnce() |
| 2818 | + { |
| 2819 | + $server = new StreamingServer(Factory::create(), $this->expectCallableNever()); |
| 2820 | + |
| 2821 | + $parser = $this->getMockBuilder('React\Http\Io\RequestHeaderParser')->getMock(); |
| 2822 | + $parser->expects($this->once())->method('handle'); |
| 2823 | + |
| 2824 | + $ref = new \ReflectionProperty($server, 'parser'); |
| 2825 | + $ref->setAccessible(true); |
| 2826 | + $ref->setValue($server, $parser); |
| 2827 | + |
| 2828 | + $server->listen($this->socket); |
| 2829 | + $this->socket->emit('connection', array($this->connection)); |
| 2830 | + } |
| 2831 | + |
| 2832 | + public function testNewConnectionWillInvokeParserOnceAndInvokeRequestHandlerWhenParserIsDoneForHttp10() |
| 2833 | + { |
| 2834 | + $request = new ServerRequest('GET', 'http://localhost/', array(), '', '1.0'); |
| 2835 | + |
| 2836 | + $server = new StreamingServer(Factory::create(), $this->expectCallableOnceWith($request)); |
| 2837 | + |
| 2838 | + $parser = $this->getMockBuilder('React\Http\Io\RequestHeaderParser')->getMock(); |
| 2839 | + $parser->expects($this->once())->method('handle'); |
| 2840 | + |
| 2841 | + $ref = new \ReflectionProperty($server, 'parser'); |
| 2842 | + $ref->setAccessible(true); |
| 2843 | + $ref->setValue($server, $parser); |
| 2844 | + |
| 2845 | + $server->listen($this->socket); |
| 2846 | + $this->socket->emit('connection', array($this->connection)); |
| 2847 | + |
| 2848 | + $this->connection->expects($this->once())->method('write'); |
| 2849 | + $this->connection->expects($this->once())->method('end'); |
| 2850 | + |
| 2851 | + // pretend parser just finished parsing |
| 2852 | + $server->handleRequest($this->connection, $request); |
| 2853 | + } |
| 2854 | + |
| 2855 | + public function testNewConnectionWillInvokeParserOnceAndInvokeRequestHandlerWhenParserIsDoneForHttp11ConnectionClose() |
| 2856 | + { |
| 2857 | + $request = new ServerRequest('GET', 'http://localhost/', array('Connection' => 'close')); |
| 2858 | + |
| 2859 | + $server = new StreamingServer(Factory::create(), $this->expectCallableOnceWith($request)); |
| 2860 | + |
| 2861 | + $parser = $this->getMockBuilder('React\Http\Io\RequestHeaderParser')->getMock(); |
| 2862 | + $parser->expects($this->once())->method('handle'); |
| 2863 | + |
| 2864 | + $ref = new \ReflectionProperty($server, 'parser'); |
| 2865 | + $ref->setAccessible(true); |
| 2866 | + $ref->setValue($server, $parser); |
| 2867 | + |
| 2868 | + $server->listen($this->socket); |
| 2869 | + $this->socket->emit('connection', array($this->connection)); |
| 2870 | + |
| 2871 | + $this->connection->expects($this->once())->method('write'); |
| 2872 | + $this->connection->expects($this->once())->method('end'); |
| 2873 | + |
| 2874 | + // pretend parser just finished parsing |
| 2875 | + $server->handleRequest($this->connection, $request); |
| 2876 | + } |
| 2877 | + |
| 2878 | + public function testNewConnectionWillInvokeParserOnceAndInvokeRequestHandlerWhenParserIsDoneAndRequestHandlerReturnsConnectionClose() |
| 2879 | + { |
| 2880 | + $request = new ServerRequest('GET', 'http://localhost/'); |
| 2881 | + |
| 2882 | + $server = new StreamingServer(Factory::create(), function () { |
| 2883 | + return new Response(200, array('Connection' => 'close')); |
| 2884 | + }); |
| 2885 | + |
| 2886 | + $parser = $this->getMockBuilder('React\Http\Io\RequestHeaderParser')->getMock(); |
| 2887 | + $parser->expects($this->once())->method('handle'); |
| 2888 | + |
| 2889 | + $ref = new \ReflectionProperty($server, 'parser'); |
| 2890 | + $ref->setAccessible(true); |
| 2891 | + $ref->setValue($server, $parser); |
| 2892 | + |
| 2893 | + $server->listen($this->socket); |
| 2894 | + $this->socket->emit('connection', array($this->connection)); |
| 2895 | + |
| 2896 | + $this->connection->expects($this->once())->method('write'); |
| 2897 | + $this->connection->expects($this->once())->method('end'); |
| 2898 | + |
| 2899 | + // pretend parser just finished parsing |
| 2900 | + $server->handleRequest($this->connection, $request); |
| 2901 | + } |
| 2902 | + |
| 2903 | + public function testNewConnectionWillInvokeParserTwiceAfterInvokingRequestHandlerWhenConnectionCanBeKeptAliveForHttp11Default() |
| 2904 | + { |
| 2905 | + $request = new ServerRequest('GET', 'http://localhost/'); |
| 2906 | + |
| 2907 | + $server = new StreamingServer(Factory::create(), function () { |
| 2908 | + return new Response(); |
| 2909 | + }); |
| 2910 | + |
| 2911 | + $parser = $this->getMockBuilder('React\Http\Io\RequestHeaderParser')->getMock(); |
| 2912 | + $parser->expects($this->exactly(2))->method('handle'); |
| 2913 | + |
| 2914 | + $ref = new \ReflectionProperty($server, 'parser'); |
| 2915 | + $ref->setAccessible(true); |
| 2916 | + $ref->setValue($server, $parser); |
| 2917 | + |
| 2918 | + $server->listen($this->socket); |
| 2919 | + $this->socket->emit('connection', array($this->connection)); |
| 2920 | + |
| 2921 | + $this->connection->expects($this->once())->method('write'); |
| 2922 | + $this->connection->expects($this->never())->method('end'); |
| 2923 | + |
| 2924 | + // pretend parser just finished parsing |
| 2925 | + $server->handleRequest($this->connection, $request); |
| 2926 | + } |
| 2927 | + |
| 2928 | + public function testNewConnectionWillInvokeParserTwiceAfterInvokingRequestHandlerWhenConnectionCanBeKeptAliveForHttp10ConnectionKeepAlive() |
| 2929 | + { |
| 2930 | + $request = new ServerRequest('GET', 'http://localhost/', array('Connection' => 'keep-alive'), '', '1.0'); |
| 2931 | + |
| 2932 | + $server = new StreamingServer(Factory::create(), function () { |
| 2933 | + return new Response(); |
| 2934 | + }); |
| 2935 | + |
| 2936 | + $parser = $this->getMockBuilder('React\Http\Io\RequestHeaderParser')->getMock(); |
| 2937 | + $parser->expects($this->exactly(2))->method('handle'); |
| 2938 | + |
| 2939 | + $ref = new \ReflectionProperty($server, 'parser'); |
| 2940 | + $ref->setAccessible(true); |
| 2941 | + $ref->setValue($server, $parser); |
| 2942 | + |
| 2943 | + $server->listen($this->socket); |
| 2944 | + $this->socket->emit('connection', array($this->connection)); |
| 2945 | + |
| 2946 | + $this->connection->expects($this->once())->method('write'); |
| 2947 | + $this->connection->expects($this->never())->method('end'); |
| 2948 | + |
| 2949 | + // pretend parser just finished parsing |
| 2950 | + $server->handleRequest($this->connection, $request); |
| 2951 | + } |
| 2952 | + |
| 2953 | + public function testNewConnectionWillInvokeParserOnceAfterInvokingRequestHandlerWhenStreamingResponseBodyKeepsStreaming() |
| 2954 | + { |
| 2955 | + $request = new ServerRequest('GET', 'http://localhost/'); |
| 2956 | + |
| 2957 | + $body = new ThroughStream(); |
| 2958 | + $server = new StreamingServer(Factory::create(), function () use ($body) { |
| 2959 | + return new Response(200, array(), $body); |
| 2960 | + }); |
| 2961 | + |
| 2962 | + $parser = $this->getMockBuilder('React\Http\Io\RequestHeaderParser')->getMock(); |
| 2963 | + $parser->expects($this->once())->method('handle'); |
| 2964 | + |
| 2965 | + $ref = new \ReflectionProperty($server, 'parser'); |
| 2966 | + $ref->setAccessible(true); |
| 2967 | + $ref->setValue($server, $parser); |
| 2968 | + |
| 2969 | + $server->listen($this->socket); |
| 2970 | + $this->socket->emit('connection', array($this->connection)); |
| 2971 | + |
| 2972 | + $this->connection->expects($this->once())->method('write'); |
| 2973 | + $this->connection->expects($this->never())->method('end'); |
| 2974 | + |
| 2975 | + // pretend parser just finished parsing |
| 2976 | + $server->handleRequest($this->connection, $request); |
| 2977 | + } |
| 2978 | + |
| 2979 | + public function testNewConnectionWillInvokeParserTwiceAfterInvokingRequestHandlerWhenStreamingResponseBodyEnds() |
| 2980 | + { |
| 2981 | + $request = new ServerRequest('GET', 'http://localhost/'); |
| 2982 | + |
| 2983 | + $body = new ThroughStream(); |
| 2984 | + $server = new StreamingServer(Factory::create(), function () use ($body) { |
| 2985 | + return new Response(200, array(), $body); |
| 2986 | + }); |
| 2987 | + |
| 2988 | + $parser = $this->getMockBuilder('React\Http\Io\RequestHeaderParser')->getMock(); |
| 2989 | + $parser->expects($this->exactly(2))->method('handle'); |
| 2990 | + |
| 2991 | + $ref = new \ReflectionProperty($server, 'parser'); |
| 2992 | + $ref->setAccessible(true); |
| 2993 | + $ref->setValue($server, $parser); |
| 2994 | + |
| 2995 | + $server->listen($this->socket); |
| 2996 | + $this->socket->emit('connection', array($this->connection)); |
| 2997 | + |
| 2998 | + $this->connection->expects($this->exactly(2))->method('write'); |
| 2999 | + $this->connection->expects($this->never())->method('end'); |
| 3000 | + |
| 3001 | + // pretend parser just finished parsing |
| 3002 | + $server->handleRequest($this->connection, $request); |
| 3003 | + |
| 3004 | + $this->assertCount(2, $this->connection->listeners('close')); |
| 3005 | + $body->end(); |
| 3006 | + $this->assertCount(1, $this->connection->listeners('close')); |
| 3007 | + } |
| 3008 | + |
2816 | 3009 | private function createGetRequest()
|
2817 | 3010 | {
|
2818 | 3011 | $data = "GET / HTTP/1.1\r\n";
|
|
0 commit comments