diff --git a/core/lib/Drupal/Core/EventSubscriber/ReverseProxySubscriber.php b/core/lib/Drupal/Core/EventSubscriber/ReverseProxySubscriber.php index 926d36d..cf0003d 100644 --- a/core/lib/Drupal/Core/EventSubscriber/ReverseProxySubscriber.php +++ b/core/lib/Drupal/Core/EventSubscriber/ReverseProxySubscriber.php @@ -2,7 +2,7 @@ /** * @file - * Contains Drupal\Core\EventSubscriber\ReverseProxySubscriber. + * Contains \Drupal\Core\EventSubscriber\ReverseProxySubscriber. */ namespace Drupal\Core\EventSubscriber; @@ -44,9 +44,9 @@ public function onKernelRequestReverseProxyCheck(GetResponseEvent $event) { $request = $event->getRequest(); if ($this->settings->get('reverse_proxy', 0)) { $reverse_proxy_header = $this->settings->get('reverse_proxy_header', 'HTTP_X_FORWARDED_FOR'); - $request->setTrustedHeaderName($request::HEADER_CLIENT_IP, $reverse_proxy_header); + $request::setTrustedHeaderName($request::HEADER_CLIENT_IP, $reverse_proxy_header); $reverse_proxy_addresses = $this->settings->get('reverse_proxy_addresses', array()); - $request->setTrustedProxies($reverse_proxy_addresses); + $request::setTrustedProxies($reverse_proxy_addresses); } } diff --git a/core/tests/Drupal/Tests/Core/EventSubscriber/ReverseProxySubscriberUnitTest.php b/core/tests/Drupal/Tests/Core/EventSubscriber/ReverseProxySubscriberUnitTest.php new file mode 100644 index 0000000..31d11e6 --- /dev/null +++ b/core/tests/Drupal/Tests/Core/EventSubscriber/ReverseProxySubscriberUnitTest.php @@ -0,0 +1,104 @@ + 'Reverse proxy implementation', + 'description' => 'Unit test the reverse proxy event subscriber.', + 'group' => 'System' + ); + } + + /** + * Tests that subscriber does not act when reverse proxy is not set. + */ + public function testNoProxy() { + $settings = new Settings(array()); + $this->assertEquals(0, $settings->get('reverse_proxy')); + + $subscriber = new ReverseProxySubscriber($settings); + // Mock a request object. + $request = $this->getMock('Symfony\Component\HttpFoundation\Request', array('setTrustedHeaderName', 'setTrustedProxies')); + // setTrustedHeaderName() should never fire. + $request->expects($this->never()) + ->method('setTrustedHeaderName'); + // Mock a response event. + $event = $this->getMockedEvent($request); + // Actually call the check method. + $subscriber->onKernelRequestReverseProxyCheck($event); + } + + /** + * Tests that subscriber does not act when reverse proxy is not set. + */ + public function testReverseProxyEnabled() { + $cases = array( + array( + 'reverse_proxy_header' => 'HTTP_X_FORWARDED_FOR', + 'reverse_proxy_addresses' => array(), + ), + array( + 'reverse_proxy_header' => 'X_FORWARDED_HOST', + 'reverse_proxy_addresses' => array('127.0.0.2', '127.0.0.3'), + ), + ); + foreach ($cases as $case) { + // Enable reverse proxy and add test values. + $settings = new Settings(array('reverse_proxy' => 1) + $case); + $this->trustedHeadersAreSet($settings); + } + } + + /** + * Tests if \Symfony\Component\HttpFoundation\Request::setTrustedHeaderName() + * and \Symfony\Component\HttpFoundation\Request::setTrustedProxies() are + * called when reverse proxy settings are enabled. + * + * @param \Drupal\Component\Utility\Settings $settings + * The settings object that holds reverse proxy configuration. + */ + protected function trustedHeadersAreSet(Settings $settings) { + $subscriber = new ReverseProxySubscriber($settings); + $request = $this->getMock('Symfony\Component\HttpFoundation\Request', array('setTrustedHeaderName', 'setTrustedProxies')); + $request->staticExpects($this->at(0)) + ->method('setTrustedHeaderName') + ->with($this->equalTo($request::HEADER_CLIENT_IP), $this->equalTo($settings->get('reverse_proxy_header'))); + $request->staticExpects($this->at(1)) + ->method('setTrustedProxies') + ->with($this->equalTo($settings->get('reverse_proxy_addresses'))); + + $event = $this->getMockedEvent($request); + $subscriber->onKernelRequestReverseProxyCheck($event); + } + + /** + * Mocks a \Symfony\Component\HttpKernel\Event\GetResponseEvent object + * and stubs its getRequest() method to return a mocked request object. + */ + protected function getMockedEvent($request) { + $event = $this->getMockBuilder('Symfony\Component\HttpKernel\Event\GetResponseEvent') + ->disableOriginalConstructor() + ->getMock(); + $event->expects($this->once()) + ->method('getRequest') + ->will($this->returnValue($request)); + return $event; + } +}