Pull merge.
[yaffs-website] / web / core / tests / Drupal / Tests / Core / StackMiddleware / ReverseProxyMiddlewareTest.php
1 <?php
2
3 namespace Drupal\Tests\Core\StackMiddleware;
4
5 use Drupal\Core\Site\Settings;
6 use Drupal\Core\StackMiddleware\ReverseProxyMiddleware;
7 use Drupal\Tests\UnitTestCase;
8 use Symfony\Component\HttpFoundation\Request;
9
10 /**
11  * Unit test the reverse proxy stack middleware.
12  *
13  * @group StackMiddleware
14  */
15 class ReverseProxyMiddlewareTest extends UnitTestCase {
16
17   /**
18    * @var \Symfony\Component\HttpKernel\HttpKernelInterface|\PHPUnit_Framework_MockObject_MockObject
19    */
20   protected $mockHttpKernel;
21
22   /**
23    * {@inheritdoc}
24    */
25   protected function setUp() {
26     $this->mockHttpKernel = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');
27   }
28
29   /**
30    * Tests that subscriber does not act when reverse proxy is not set.
31    */
32   public function testNoProxy() {
33     $settings = new Settings([]);
34     $this->assertEquals(0, $settings->get('reverse_proxy'));
35
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);
44   }
45
46   /**
47    * Tests that subscriber sets trusted headers when reverse proxy is set.
48    *
49    * @dataProvider reverseProxyEnabledProvider
50    *
51    * @group legacy
52    *
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.
54    */
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);
59   }
60
61   /**
62    * Data provider for testReverseProxyEnabled.
63    */
64   public function reverseProxyEnabledProvider() {
65     return [
66       [
67         [
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'],
74         ],
75       ],
76     ];
77   }
78
79   /**
80    * Tests that trusted header methods are called.
81    *
82    * \Symfony\Component\HttpFoundation\Request::setTrustedHeaderName() and
83    * \Symfony\Component\HttpFoundation\Request::setTrustedProxies() should
84    * always be called when reverse proxy settings are enabled.
85    *
86    * @param \Drupal\Core\Site\Settings $settings
87    *   The settings object that holds reverse proxy configuration.
88    */
89   protected function trustedHeadersAreSet(Settings $settings) {
90     $middleware = new ReverseProxyMiddleware($this->mockHttpKernel, $settings);
91     $request = new Request();
92
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());
100   }
101
102 }