Further Drupal 8.6.4 changes. Some core files were not committed before a commit...
[yaffs-website] / vendor / symfony / http-kernel / Tests / HttpCache / SubRequestHandlerTest.php
1 <?php
2
3 /*
4  * This file is part of the Symfony package.
5  *
6  * (c) Fabien Potencier <fabien@symfony.com>
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11
12 namespace Symfony\Component\HttpKernel\Tests\HttpCache;
13
14 use PHPUnit\Framework\TestCase;
15 use Symfony\Component\HttpFoundation\Request;
16 use Symfony\Component\HttpFoundation\Response;
17 use Symfony\Component\HttpKernel\HttpCache\SubRequestHandler;
18 use Symfony\Component\HttpKernel\HttpKernelInterface;
19
20 class SubRequestHandlerTest extends TestCase
21 {
22     private static $globalState;
23
24     protected function setUp()
25     {
26         self::$globalState = $this->getGlobalState();
27     }
28
29     protected function tearDown()
30     {
31         Request::setTrustedProxies(self::$globalState[0], self::$globalState[1]);
32     }
33
34     public function testTrustedHeadersAreKept()
35     {
36         Request::setTrustedProxies(array('10.0.0.1'), -1);
37         $globalState = $this->getGlobalState();
38
39         $request = Request::create('/');
40         $request->server->set('REMOTE_ADDR', '10.0.0.1');
41         $request->headers->set('X-Forwarded-For', '10.0.0.2');
42         $request->headers->set('X-Forwarded-Host', 'Good');
43         $request->headers->set('X-Forwarded-Port', '1234');
44         $request->headers->set('X-Forwarded-Proto', 'https');
45
46         $kernel = new TestSubRequestHandlerKernel(function ($request, $type, $catch) {
47             $this->assertSame('127.0.0.1', $request->server->get('REMOTE_ADDR'));
48             $this->assertSame('10.0.0.2', $request->getClientIp());
49             $this->assertSame('Good', $request->headers->get('X-Forwarded-Host'));
50             $this->assertSame('1234', $request->headers->get('X-Forwarded-Port'));
51             $this->assertSame('https', $request->headers->get('X-Forwarded-Proto'));
52         });
53
54         SubRequestHandler::handle($kernel, $request, HttpKernelInterface::MASTER_REQUEST, true);
55
56         $this->assertSame($globalState, $this->getGlobalState());
57     }
58
59     public function testUntrustedHeadersAreRemoved()
60     {
61         $request = Request::create('/');
62         $request->server->set('REMOTE_ADDR', '10.0.0.1');
63         $request->headers->set('X-Forwarded-For', '10.0.0.2');
64         $request->headers->set('X-Forwarded-Host', 'Evil');
65         $request->headers->set('X-Forwarded-Port', '1234');
66         $request->headers->set('X-Forwarded-Proto', 'http');
67         $request->headers->set('Forwarded', 'Evil2');
68
69         $kernel = new TestSubRequestHandlerKernel(function ($request, $type, $catch) {
70             $this->assertSame('127.0.0.1', $request->server->get('REMOTE_ADDR'));
71             $this->assertSame('10.0.0.1', $request->getClientIp());
72             $this->assertFalse($request->headers->has('X-Forwarded-Host'));
73             $this->assertFalse($request->headers->has('X-Forwarded-Port'));
74             $this->assertFalse($request->headers->has('X-Forwarded-Proto'));
75             $this->assertSame('for="10.0.0.1";host="localhost";proto=http', $request->headers->get('Forwarded'));
76         });
77
78         SubRequestHandler::handle($kernel, $request, HttpKernelInterface::MASTER_REQUEST, true);
79
80         $this->assertSame(self::$globalState, $this->getGlobalState());
81     }
82
83     public function testTrustedForwardedHeader()
84     {
85         Request::setTrustedProxies(array('10.0.0.1'), -1);
86         $globalState = $this->getGlobalState();
87
88         $request = Request::create('/');
89         $request->server->set('REMOTE_ADDR', '10.0.0.1');
90         $request->headers->set('Forwarded', 'for="10.0.0.2";host="foo.bar:1234";proto=https');
91
92         $kernel = new TestSubRequestHandlerKernel(function ($request, $type, $catch) {
93             $this->assertSame('127.0.0.1', $request->server->get('REMOTE_ADDR'));
94             $this->assertSame('10.0.0.2', $request->getClientIp());
95             $this->assertSame('foo.bar:1234', $request->getHttpHost());
96             $this->assertSame('https', $request->getScheme());
97             $this->assertSame(1234, $request->getPort());
98         });
99
100         SubRequestHandler::handle($kernel, $request, HttpKernelInterface::MASTER_REQUEST, true);
101
102         $this->assertSame($globalState, $this->getGlobalState());
103     }
104
105     public function testTrustedXForwardedForHeader()
106     {
107         Request::setTrustedProxies(array('10.0.0.1'), -1);
108         $globalState = $this->getGlobalState();
109
110         $request = Request::create('/');
111         $request->server->set('REMOTE_ADDR', '10.0.0.1');
112         $request->headers->set('X-Forwarded-For', '10.0.0.2');
113         $request->headers->set('X-Forwarded-Host', 'foo.bar');
114         $request->headers->set('X-Forwarded-Proto', 'https');
115
116         $kernel = new TestSubRequestHandlerKernel(function ($request, $type, $catch) {
117             $this->assertSame('127.0.0.1', $request->server->get('REMOTE_ADDR'));
118             $this->assertSame('10.0.0.2', $request->getClientIp());
119             $this->assertSame('foo.bar', $request->getHttpHost());
120             $this->assertSame('https', $request->getScheme());
121         });
122
123         SubRequestHandler::handle($kernel, $request, HttpKernelInterface::MASTER_REQUEST, true);
124
125         $this->assertSame($globalState, $this->getGlobalState());
126     }
127
128     private function getGlobalState()
129     {
130         return array(
131             Request::getTrustedProxies(),
132             Request::getTrustedHeaderSet(),
133         );
134     }
135 }
136
137 class TestSubRequestHandlerKernel implements HttpKernelInterface
138 {
139     private $assertCallback;
140
141     public function __construct(\Closure $assertCallback)
142     {
143         $this->assertCallback = $assertCallback;
144     }
145
146     public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = true)
147     {
148         $assertCallback = $this->assertCallback;
149         $assertCallback($request, $type, $catch);
150
151         return new Response();
152     }
153 }