b7a784d48718ed24cf2b59be74d897ceab1c61bf
[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   public function testReverseProxyEnabled($provided_settings) {
52     // Enable reverse proxy and add test values.
53     $settings = new Settings(['reverse_proxy' => 1] + $provided_settings);
54     $this->trustedHeadersAreSet($settings);
55   }
56
57   /**
58    * Data provider for testReverseProxyEnabled.
59    */
60   public function reverseProxyEnabledProvider() {
61     return [
62       [
63         [
64           'reverse_proxy_header' => 'X_FORWARDED_FOR_CUSTOMIZED',
65           'reverse_proxy_proto_header' => 'X_FORWARDED_PROTO_CUSTOMIZED',
66           'reverse_proxy_host_header' => 'X_FORWARDED_HOST_CUSTOMIZED',
67           'reverse_proxy_port_header' => 'X_FORWARDED_PORT_CUSTOMIZED',
68           'reverse_proxy_forwarded_header' => 'FORWARDED_CUSTOMIZED',
69           'reverse_proxy_addresses' => ['127.0.0.2', '127.0.0.3'],
70         ],
71       ],
72     ];
73   }
74
75   /**
76    * Tests that trusted header methods are called.
77    *
78    * \Symfony\Component\HttpFoundation\Request::setTrustedHeaderName() and
79    * \Symfony\Component\HttpFoundation\Request::setTrustedProxies() should
80    * always be called when reverse proxy settings are enabled.
81    *
82    * @param \Drupal\Core\Site\Settings $settings
83    *   The settings object that holds reverse proxy configuration.
84    */
85   protected function trustedHeadersAreSet(Settings $settings) {
86     $middleware = new ReverseProxyMiddleware($this->mockHttpKernel, $settings);
87     $request = new Request();
88
89     $middleware->handle($request);
90     $this->assertSame($settings->get('reverse_proxy_header'), $request->getTrustedHeaderName($request::HEADER_CLIENT_IP));
91     $this->assertSame($settings->get('reverse_proxy_proto_header'), $request->getTrustedHeaderName($request::HEADER_CLIENT_PROTO));
92     $this->assertSame($settings->get('reverse_proxy_host_header'), $request->getTrustedHeaderName($request::HEADER_CLIENT_HOST));
93     $this->assertSame($settings->get('reverse_proxy_port_header'), $request->getTrustedHeaderName($request::HEADER_CLIENT_PORT));
94     $this->assertSame($settings->get('reverse_proxy_forwarded_header'), $request->getTrustedHeaderName($request::HEADER_FORWARDED));
95     $this->assertSame($settings->get('reverse_proxy_addresses'), $request->getTrustedProxies());
96   }
97
98 }