3 namespace Drupal\Tests\Core\StackMiddleware;
5 use Drupal\Core\Site\Settings;
6 use Drupal\Core\StackMiddleware\ReverseProxyMiddleware;
7 use Drupal\Tests\UnitTestCase;
8 use Symfony\Component\HttpFoundation\Request;
11 * Unit test the reverse proxy stack middleware.
13 * @group StackMiddleware
15 class ReverseProxyMiddlewareTest extends UnitTestCase {
18 * @var \Symfony\Component\HttpKernel\HttpKernelInterface|\PHPUnit_Framework_MockObject_MockObject
20 protected $mockHttpKernel;
25 protected function setUp() {
26 $this->mockHttpKernel = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');
30 * Tests that subscriber does not act when reverse proxy is not set.
32 public function testNoProxy() {
33 $settings = new Settings([]);
34 $this->assertEquals(0, $settings->get('reverse_proxy'));
36 $middleware = new ReverseProxyMiddleware($this->mockHttpKernel, $settings);
37 // Mock a request object.
38 $request = $this->getMock('Symfony\Component\HttpFoundation\Request', ['setTrustedHeaderName', 'setTrustedProxies']);
39 // setTrustedHeaderName() should never fire.
40 $request->expects($this->never())
41 ->method('setTrustedHeaderName');
42 // Actually call the check method.
43 $middleware->handle($request);
47 * Tests that subscriber sets trusted headers when reverse proxy is set.
49 * @dataProvider reverseProxyEnabledProvider
53 * @expectedDeprecation The "Symfony\Component\HttpFoundation\Request::setTrustedHeaderName()" method is deprecated since Symfony 3.3 and will be removed in 4.0. Use the $trustedHeaderSet argument of the Request::setTrustedProxies() method instead.
55 public function testReverseProxyEnabled($provided_settings) {
56 // Enable reverse proxy and add test values.
57 $settings = new Settings(['reverse_proxy' => 1] + $provided_settings);
58 $this->trustedHeadersAreSet($settings);
62 * Data provider for testReverseProxyEnabled.
64 public function reverseProxyEnabledProvider() {
68 'reverse_proxy_header' => 'X_FORWARDED_FOR_CUSTOMIZED',
69 'reverse_proxy_proto_header' => 'X_FORWARDED_PROTO_CUSTOMIZED',
70 'reverse_proxy_host_header' => 'X_FORWARDED_HOST_CUSTOMIZED',
71 'reverse_proxy_port_header' => 'X_FORWARDED_PORT_CUSTOMIZED',
72 'reverse_proxy_forwarded_header' => 'FORWARDED_CUSTOMIZED',
73 'reverse_proxy_addresses' => ['127.0.0.2', '127.0.0.3'],
80 * Tests that trusted header methods are called.
82 * \Symfony\Component\HttpFoundation\Request::setTrustedHeaderName() and
83 * \Symfony\Component\HttpFoundation\Request::setTrustedProxies() should
84 * always be called when reverse proxy settings are enabled.
86 * @param \Drupal\Core\Site\Settings $settings
87 * The settings object that holds reverse proxy configuration.
89 protected function trustedHeadersAreSet(Settings $settings) {
90 $middleware = new ReverseProxyMiddleware($this->mockHttpKernel, $settings);
91 $request = new Request();
93 $middleware->handle($request);
94 $this->assertSame($settings->get('reverse_proxy_header'), $request->getTrustedHeaderName($request::HEADER_X_FORWARDED_FOR));
95 $this->assertSame($settings->get('reverse_proxy_proto_header'), $request->getTrustedHeaderName($request::HEADER_X_FORWARDED_PROTO));
96 $this->assertSame($settings->get('reverse_proxy_host_header'), $request->getTrustedHeaderName($request::HEADER_X_FORWARDED_HOST));
97 $this->assertSame($settings->get('reverse_proxy_port_header'), $request->getTrustedHeaderName($request::HEADER_X_FORWARDED_PORT));
98 $this->assertSame($settings->get('reverse_proxy_forwarded_header'), $request->getTrustedHeaderName($request::HEADER_FORWARDED));
99 $this->assertSame($settings->get('reverse_proxy_addresses'), $request->getTrustedProxies());