4 * This file is part of the Symfony package.
6 * (c) Fabien Potencier <fabien@symfony.com>
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
12 namespace Symfony\Component\HttpKernel\Tests\HttpCache;
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;
20 class SubRequestHandlerTest extends TestCase
22 private static $globalState;
24 protected function setUp()
26 self::$globalState = $this->getGlobalState();
29 protected function tearDown()
31 Request::setTrustedProxies(self::$globalState[0], self::$globalState[1]);
34 public function testTrustedHeadersAreKept()
36 Request::setTrustedProxies(array('10.0.0.1'), -1);
37 $globalState = $this->getGlobalState();
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');
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'));
54 SubRequestHandler::handle($kernel, $request, HttpKernelInterface::MASTER_REQUEST, true);
56 $this->assertSame($globalState, $this->getGlobalState());
59 public function testUntrustedHeadersAreRemoved()
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');
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'));
78 SubRequestHandler::handle($kernel, $request, HttpKernelInterface::MASTER_REQUEST, true);
80 $this->assertSame(self::$globalState, $this->getGlobalState());
83 public function testTrustedForwardedHeader()
85 Request::setTrustedProxies(array('10.0.0.1'), -1);
86 $globalState = $this->getGlobalState();
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');
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());
100 SubRequestHandler::handle($kernel, $request, HttpKernelInterface::MASTER_REQUEST, true);
102 $this->assertSame($globalState, $this->getGlobalState());
105 public function testTrustedXForwardedForHeader()
107 Request::setTrustedProxies(array('10.0.0.1'), -1);
108 $globalState = $this->getGlobalState();
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');
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());
123 SubRequestHandler::handle($kernel, $request, HttpKernelInterface::MASTER_REQUEST, true);
125 $this->assertSame($globalState, $this->getGlobalState());
128 private function getGlobalState()
131 Request::getTrustedProxies(),
132 Request::getTrustedHeaderSet(),
137 class TestSubRequestHandlerKernel implements HttpKernelInterface
139 private $assertCallback;
141 public function __construct(\Closure $assertCallback)
143 $this->assertCallback = $assertCallback;
146 public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = true)
148 $assertCallback = $this->assertCallback;
149 $assertCallback($request, $type, $catch);
151 return new Response();