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
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);
58 * Data provider for testReverseProxyEnabled.
60 public function reverseProxyEnabledProvider() {
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'],
76 * Tests that trusted header methods are called.
78 * \Symfony\Component\HttpFoundation\Request::setTrustedHeaderName() and
79 * \Symfony\Component\HttpFoundation\Request::setTrustedProxies() should
80 * always be called when reverse proxy settings are enabled.
82 * @param \Drupal\Core\Site\Settings $settings
83 * The settings object that holds reverse proxy configuration.
85 protected function trustedHeadersAreSet(Settings $settings) {
86 $middleware = new ReverseProxyMiddleware($this->mockHttpKernel, $settings);
87 $request = new Request();
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());