|  | 
| 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,196 @@ 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 | +        $body->end(); | 
|  | 3005 | +    } | 
|  | 3006 | + | 
| 2816 | 3007 |     private function createGetRequest() | 
| 2817 | 3008 |     { | 
| 2818 | 3009 |         $data = "GET / HTTP/1.1\r\n"; | 
|  | 
0 commit comments