radarrplexorganizrnginxsonarrdashboardembycouchpotatonzbgetbookmarkapplication-dashboardmuximuxlandingpagestartpagelandinghtpcserverhomepagesabnzbdheimdall
		
		
		
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							403 lines
						
					
					
						
							15 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							403 lines
						
					
					
						
							15 KiB
						
					
					
				
								<?php
							 | 
						|
								
							 | 
						|
								/*
							 | 
						|
								 * This file is part of the Symfony package.
							 | 
						|
								 *
							 | 
						|
								 * (c) Fabien Potencier <fabien@symfony.com>
							 | 
						|
								 *
							 | 
						|
								 * For the full copyright and license information, please view the LICENSE
							 | 
						|
								 * file that was distributed with this source code.
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								namespace Symfony\Component\HttpKernel\Tests;
							 | 
						|
								
							 | 
						|
								use PHPUnit\Framework\TestCase;
							 | 
						|
								use Symfony\Component\EventDispatcher\EventDispatcherInterface;
							 | 
						|
								use Symfony\Component\HttpFoundation\RequestStack;
							 | 
						|
								use Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface;
							 | 
						|
								use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
							 | 
						|
								use Symfony\Component\HttpKernel\Event\FilterControllerArgumentsEvent;
							 | 
						|
								use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
							 | 
						|
								use Symfony\Component\HttpKernel\HttpKernel;
							 | 
						|
								use Symfony\Component\HttpKernel\HttpKernelInterface;
							 | 
						|
								use Symfony\Component\HttpKernel\KernelEvents;
							 | 
						|
								use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
							 | 
						|
								use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
							 | 
						|
								use Symfony\Component\HttpFoundation\Request;
							 | 
						|
								use Symfony\Component\HttpFoundation\Response;
							 | 
						|
								use Symfony\Component\HttpFoundation\RedirectResponse;
							 | 
						|
								use Symfony\Component\EventDispatcher\EventDispatcher;
							 | 
						|
								
							 | 
						|
								class HttpKernelTest extends TestCase
							 | 
						|
								{
							 | 
						|
								    /**
							 | 
						|
								     * @expectedException \RuntimeException
							 | 
						|
								     */
							 | 
						|
								    public function testHandleWhenControllerThrowsAnExceptionAndCatchIsTrue()
							 | 
						|
								    {
							 | 
						|
								        $kernel = $this->getHttpKernel(new EventDispatcher(), function () { throw new \RuntimeException(); });
							 | 
						|
								
							 | 
						|
								        $kernel->handle(new Request(), HttpKernelInterface::MASTER_REQUEST, true);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @expectedException \RuntimeException
							 | 
						|
								     */
							 | 
						|
								    public function testHandleWhenControllerThrowsAnExceptionAndCatchIsFalseAndNoListenerIsRegistered()
							 | 
						|
								    {
							 | 
						|
								        $kernel = $this->getHttpKernel(new EventDispatcher(), function () { throw new \RuntimeException(); });
							 | 
						|
								
							 | 
						|
								        $kernel->handle(new Request(), HttpKernelInterface::MASTER_REQUEST, false);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function testHandleWhenControllerThrowsAnExceptionAndCatchIsTrueWithAHandlingListener()
							 | 
						|
								    {
							 | 
						|
								        $dispatcher = new EventDispatcher();
							 | 
						|
								        $dispatcher->addListener(KernelEvents::EXCEPTION, function ($event) {
							 | 
						|
								            $event->setResponse(new Response($event->getException()->getMessage()));
							 | 
						|
								        });
							 | 
						|
								
							 | 
						|
								        $kernel = $this->getHttpKernel($dispatcher, function () { throw new \RuntimeException('foo'); });
							 | 
						|
								        $response = $kernel->handle(new Request(), HttpKernelInterface::MASTER_REQUEST, true);
							 | 
						|
								
							 | 
						|
								        $this->assertEquals('500', $response->getStatusCode());
							 | 
						|
								        $this->assertEquals('foo', $response->getContent());
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function testHandleWhenControllerThrowsAnExceptionAndCatchIsTrueWithANonHandlingListener()
							 | 
						|
								    {
							 | 
						|
								        $exception = new \RuntimeException();
							 | 
						|
								
							 | 
						|
								        $dispatcher = new EventDispatcher();
							 | 
						|
								        $dispatcher->addListener(KernelEvents::EXCEPTION, function ($event) {
							 | 
						|
								            // should set a response, but does not
							 | 
						|
								        });
							 | 
						|
								
							 | 
						|
								        $kernel = $this->getHttpKernel($dispatcher, function () use ($exception) { throw $exception; });
							 | 
						|
								
							 | 
						|
								        try {
							 | 
						|
								            $kernel->handle(new Request(), HttpKernelInterface::MASTER_REQUEST, true);
							 | 
						|
								            $this->fail('LogicException expected');
							 | 
						|
								        } catch (\RuntimeException $e) {
							 | 
						|
								            $this->assertSame($exception, $e);
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function testHandleExceptionWithARedirectionResponse()
							 | 
						|
								    {
							 | 
						|
								        $dispatcher = new EventDispatcher();
							 | 
						|
								        $dispatcher->addListener(KernelEvents::EXCEPTION, function ($event) {
							 | 
						|
								            $event->setResponse(new RedirectResponse('/login', 301));
							 | 
						|
								        });
							 | 
						|
								
							 | 
						|
								        $kernel = $this->getHttpKernel($dispatcher, function () { throw new AccessDeniedHttpException(); });
							 | 
						|
								        $response = $kernel->handle(new Request());
							 | 
						|
								
							 | 
						|
								        $this->assertEquals('301', $response->getStatusCode());
							 | 
						|
								        $this->assertEquals('/login', $response->headers->get('Location'));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function testHandleHttpException()
							 | 
						|
								    {
							 | 
						|
								        $dispatcher = new EventDispatcher();
							 | 
						|
								        $dispatcher->addListener(KernelEvents::EXCEPTION, function ($event) {
							 | 
						|
								            $event->setResponse(new Response($event->getException()->getMessage()));
							 | 
						|
								        });
							 | 
						|
								
							 | 
						|
								        $kernel = $this->getHttpKernel($dispatcher, function () { throw new MethodNotAllowedHttpException(array('POST')); });
							 | 
						|
								        $response = $kernel->handle(new Request());
							 | 
						|
								
							 | 
						|
								        $this->assertEquals('405', $response->getStatusCode());
							 | 
						|
								        $this->assertEquals('POST', $response->headers->get('Allow'));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @group legacy
							 | 
						|
								     * @dataProvider getStatusCodes
							 | 
						|
								     */
							 | 
						|
								    public function testLegacyHandleWhenAnExceptionIsHandledWithASpecificStatusCode($responseStatusCode, $expectedStatusCode)
							 | 
						|
								    {
							 | 
						|
								        $dispatcher = new EventDispatcher();
							 | 
						|
								        $dispatcher->addListener(KernelEvents::EXCEPTION, function ($event) use ($responseStatusCode, $expectedStatusCode) {
							 | 
						|
								            $event->setResponse(new Response('', $responseStatusCode, array('X-Status-Code' => $expectedStatusCode)));
							 | 
						|
								        });
							 | 
						|
								
							 | 
						|
								        $kernel = $this->getHttpKernel($dispatcher, function () { throw new \RuntimeException(); });
							 | 
						|
								        $response = $kernel->handle(new Request());
							 | 
						|
								
							 | 
						|
								        $this->assertEquals($expectedStatusCode, $response->getStatusCode());
							 | 
						|
								        $this->assertFalse($response->headers->has('X-Status-Code'));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function getStatusCodes()
							 | 
						|
								    {
							 | 
						|
								        return array(
							 | 
						|
								            array(200, 404),
							 | 
						|
								            array(404, 200),
							 | 
						|
								            array(301, 200),
							 | 
						|
								            array(500, 200),
							 | 
						|
								        );
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @dataProvider getSpecificStatusCodes
							 | 
						|
								     */
							 | 
						|
								    public function testHandleWhenAnExceptionIsHandledWithASpecificStatusCode($expectedStatusCode)
							 | 
						|
								    {
							 | 
						|
								        $dispatcher = new EventDispatcher();
							 | 
						|
								        $dispatcher->addListener(KernelEvents::EXCEPTION, function (GetResponseForExceptionEvent $event) use ($expectedStatusCode) {
							 | 
						|
								            $event->allowCustomResponseCode();
							 | 
						|
								            $event->setResponse(new Response('', $expectedStatusCode));
							 | 
						|
								        });
							 | 
						|
								
							 | 
						|
								        $kernel = $this->getHttpKernel($dispatcher, function () { throw new \RuntimeException(); });
							 | 
						|
								        $response = $kernel->handle(new Request());
							 | 
						|
								
							 | 
						|
								        $this->assertEquals($expectedStatusCode, $response->getStatusCode());
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function getSpecificStatusCodes()
							 | 
						|
								    {
							 | 
						|
								        return array(
							 | 
						|
								            array(200),
							 | 
						|
								            array(302),
							 | 
						|
								            array(403),
							 | 
						|
								        );
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function testHandleWhenAListenerReturnsAResponse()
							 | 
						|
								    {
							 | 
						|
								        $dispatcher = new EventDispatcher();
							 | 
						|
								        $dispatcher->addListener(KernelEvents::REQUEST, function ($event) {
							 | 
						|
								            $event->setResponse(new Response('hello'));
							 | 
						|
								        });
							 | 
						|
								
							 | 
						|
								        $kernel = $this->getHttpKernel($dispatcher);
							 | 
						|
								
							 | 
						|
								        $this->assertEquals('hello', $kernel->handle(new Request())->getContent());
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @expectedException \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
							 | 
						|
								     */
							 | 
						|
								    public function testHandleWhenNoControllerIsFound()
							 | 
						|
								    {
							 | 
						|
								        $dispatcher = new EventDispatcher();
							 | 
						|
								        $kernel = $this->getHttpKernel($dispatcher, false);
							 | 
						|
								
							 | 
						|
								        $kernel->handle(new Request());
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function testHandleWhenTheControllerIsAClosure()
							 | 
						|
								    {
							 | 
						|
								        $response = new Response('foo');
							 | 
						|
								        $dispatcher = new EventDispatcher();
							 | 
						|
								        $kernel = $this->getHttpKernel($dispatcher, function () use ($response) { return $response; });
							 | 
						|
								
							 | 
						|
								        $this->assertSame($response, $kernel->handle(new Request()));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function testHandleWhenTheControllerIsAnObjectWithInvoke()
							 | 
						|
								    {
							 | 
						|
								        $dispatcher = new EventDispatcher();
							 | 
						|
								        $kernel = $this->getHttpKernel($dispatcher, new Controller());
							 | 
						|
								
							 | 
						|
								        $this->assertResponseEquals(new Response('foo'), $kernel->handle(new Request()));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function testHandleWhenTheControllerIsAFunction()
							 | 
						|
								    {
							 | 
						|
								        $dispatcher = new EventDispatcher();
							 | 
						|
								        $kernel = $this->getHttpKernel($dispatcher, 'Symfony\Component\HttpKernel\Tests\controller_func');
							 | 
						|
								
							 | 
						|
								        $this->assertResponseEquals(new Response('foo'), $kernel->handle(new Request()));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function testHandleWhenTheControllerIsAnArray()
							 | 
						|
								    {
							 | 
						|
								        $dispatcher = new EventDispatcher();
							 | 
						|
								        $kernel = $this->getHttpKernel($dispatcher, array(new Controller(), 'controller'));
							 | 
						|
								
							 | 
						|
								        $this->assertResponseEquals(new Response('foo'), $kernel->handle(new Request()));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function testHandleWhenTheControllerIsAStaticArray()
							 | 
						|
								    {
							 | 
						|
								        $dispatcher = new EventDispatcher();
							 | 
						|
								        $kernel = $this->getHttpKernel($dispatcher, array('Symfony\Component\HttpKernel\Tests\Controller', 'staticcontroller'));
							 | 
						|
								
							 | 
						|
								        $this->assertResponseEquals(new Response('foo'), $kernel->handle(new Request()));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @expectedException \LogicException
							 | 
						|
								     */
							 | 
						|
								    public function testHandleWhenTheControllerDoesNotReturnAResponse()
							 | 
						|
								    {
							 | 
						|
								        $dispatcher = new EventDispatcher();
							 | 
						|
								        $kernel = $this->getHttpKernel($dispatcher, function () { return 'foo'; });
							 | 
						|
								
							 | 
						|
								        $kernel->handle(new Request());
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function testHandleWhenTheControllerDoesNotReturnAResponseButAViewIsRegistered()
							 | 
						|
								    {
							 | 
						|
								        $dispatcher = new EventDispatcher();
							 | 
						|
								        $dispatcher->addListener(KernelEvents::VIEW, function ($event) {
							 | 
						|
								            $event->setResponse(new Response($event->getControllerResult()));
							 | 
						|
								        });
							 | 
						|
								
							 | 
						|
								        $kernel = $this->getHttpKernel($dispatcher, function () { return 'foo'; });
							 | 
						|
								
							 | 
						|
								        $this->assertEquals('foo', $kernel->handle(new Request())->getContent());
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function testHandleWithAResponseListener()
							 | 
						|
								    {
							 | 
						|
								        $dispatcher = new EventDispatcher();
							 | 
						|
								        $dispatcher->addListener(KernelEvents::RESPONSE, function ($event) {
							 | 
						|
								            $event->setResponse(new Response('foo'));
							 | 
						|
								        });
							 | 
						|
								        $kernel = $this->getHttpKernel($dispatcher);
							 | 
						|
								
							 | 
						|
								        $this->assertEquals('foo', $kernel->handle(new Request())->getContent());
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function testHandleAllowChangingControllerArguments()
							 | 
						|
								    {
							 | 
						|
								        $dispatcher = new EventDispatcher();
							 | 
						|
								        $dispatcher->addListener(KernelEvents::CONTROLLER_ARGUMENTS, function (FilterControllerArgumentsEvent $event) {
							 | 
						|
								            $event->setArguments(array('foo'));
							 | 
						|
								        });
							 | 
						|
								
							 | 
						|
								        $kernel = $this->getHttpKernel($dispatcher, function ($content) { return new Response($content); });
							 | 
						|
								
							 | 
						|
								        $this->assertResponseEquals(new Response('foo'), $kernel->handle(new Request()));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function testHandleAllowChangingControllerAndArguments()
							 | 
						|
								    {
							 | 
						|
								        $dispatcher = new EventDispatcher();
							 | 
						|
								        $dispatcher->addListener(KernelEvents::CONTROLLER_ARGUMENTS, function (FilterControllerArgumentsEvent $event) {
							 | 
						|
								            $oldController = $event->getController();
							 | 
						|
								            $oldArguments = $event->getArguments();
							 | 
						|
								
							 | 
						|
								            $newController = function ($id) use ($oldController, $oldArguments) {
							 | 
						|
								                $response = call_user_func_array($oldController, $oldArguments);
							 | 
						|
								
							 | 
						|
								                $response->headers->set('X-Id', $id);
							 | 
						|
								
							 | 
						|
								                return $response;
							 | 
						|
								            };
							 | 
						|
								
							 | 
						|
								            $event->setController($newController);
							 | 
						|
								            $event->setArguments(array('bar'));
							 | 
						|
								        });
							 | 
						|
								
							 | 
						|
								        $kernel = $this->getHttpKernel($dispatcher, function ($content) { return new Response($content); }, null, array('foo'));
							 | 
						|
								
							 | 
						|
								        $this->assertResponseEquals(new Response('foo', 200, array('X-Id' => 'bar')), $kernel->handle(new Request()));
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function testTerminate()
							 | 
						|
								    {
							 | 
						|
								        $dispatcher = new EventDispatcher();
							 | 
						|
								        $kernel = $this->getHttpKernel($dispatcher);
							 | 
						|
								        $dispatcher->addListener(KernelEvents::TERMINATE, function ($event) use (&$called, &$capturedKernel, &$capturedRequest, &$capturedResponse) {
							 | 
						|
								            $called = true;
							 | 
						|
								            $capturedKernel = $event->getKernel();
							 | 
						|
								            $capturedRequest = $event->getRequest();
							 | 
						|
								            $capturedResponse = $event->getResponse();
							 | 
						|
								        });
							 | 
						|
								
							 | 
						|
								        $kernel->terminate($request = Request::create('/'), $response = new Response());
							 | 
						|
								        $this->assertTrue($called);
							 | 
						|
								        $this->assertEquals($kernel, $capturedKernel);
							 | 
						|
								        $this->assertEquals($request, $capturedRequest);
							 | 
						|
								        $this->assertEquals($response, $capturedResponse);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function testVerifyRequestStackPushPopDuringHandle()
							 | 
						|
								    {
							 | 
						|
								        $request = new Request();
							 | 
						|
								
							 | 
						|
								        $stack = $this->getMockBuilder('Symfony\Component\HttpFoundation\RequestStack')->setMethods(array('push', 'pop'))->getMock();
							 | 
						|
								        $stack->expects($this->at(0))->method('push')->with($this->equalTo($request));
							 | 
						|
								        $stack->expects($this->at(1))->method('pop');
							 | 
						|
								
							 | 
						|
								        $dispatcher = new EventDispatcher();
							 | 
						|
								        $kernel = $this->getHttpKernel($dispatcher, null, $stack);
							 | 
						|
								
							 | 
						|
								        $kernel->handle($request, HttpKernelInterface::MASTER_REQUEST);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @expectedException \Symfony\Component\HttpKernel\Exception\BadRequestHttpException
							 | 
						|
								     */
							 | 
						|
								    public function testInconsistentClientIpsOnMasterRequests()
							 | 
						|
								    {
							 | 
						|
								        $request = new Request();
							 | 
						|
								        $request->setTrustedProxies(array('1.1.1.1'), Request::HEADER_X_FORWARDED_FOR | Request::HEADER_FORWARDED);
							 | 
						|
								        $request->server->set('REMOTE_ADDR', '1.1.1.1');
							 | 
						|
								        $request->headers->set('FORWARDED', 'for=2.2.2.2');
							 | 
						|
								        $request->headers->set('X_FORWARDED_FOR', '3.3.3.3');
							 | 
						|
								
							 | 
						|
								        $dispatcher = new EventDispatcher();
							 | 
						|
								        $dispatcher->addListener(KernelEvents::REQUEST, function ($event) {
							 | 
						|
								            $event->getRequest()->getClientIp();
							 | 
						|
								        });
							 | 
						|
								
							 | 
						|
								        $kernel = $this->getHttpKernel($dispatcher);
							 | 
						|
								        $kernel->handle($request, $kernel::MASTER_REQUEST, false);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    private function getHttpKernel(EventDispatcherInterface $eventDispatcher, $controller = null, RequestStack $requestStack = null, array $arguments = array())
							 | 
						|
								    {
							 | 
						|
								        if (null === $controller) {
							 | 
						|
								            $controller = function () { return new Response('Hello'); };
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        $controllerResolver = $this->getMockBuilder(ControllerResolverInterface::class)->getMock();
							 | 
						|
								        $controllerResolver
							 | 
						|
								            ->expects($this->any())
							 | 
						|
								            ->method('getController')
							 | 
						|
								            ->will($this->returnValue($controller));
							 | 
						|
								
							 | 
						|
								        $argumentResolver = $this->getMockBuilder(ArgumentResolverInterface::class)->getMock();
							 | 
						|
								        $argumentResolver
							 | 
						|
								            ->expects($this->any())
							 | 
						|
								            ->method('getArguments')
							 | 
						|
								            ->will($this->returnValue($arguments));
							 | 
						|
								
							 | 
						|
								        return new HttpKernel($eventDispatcher, $controllerResolver, $requestStack, $argumentResolver);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    private function assertResponseEquals(Response $expected, Response $actual)
							 | 
						|
								    {
							 | 
						|
								        $expected->setDate($actual->getDate());
							 | 
						|
								        $this->assertEquals($expected, $actual);
							 | 
						|
								    }
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								class Controller
							 | 
						|
								{
							 | 
						|
								    public function __invoke()
							 | 
						|
								    {
							 | 
						|
								        return new Response('foo');
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function controller()
							 | 
						|
								    {
							 | 
						|
								        return new Response('foo');
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public static function staticController()
							 | 
						|
								    {
							 | 
						|
								        return new Response('foo');
							 | 
						|
								    }
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								function controller_func()
							 | 
						|
								{
							 | 
						|
								    return new Response('foo');
							 | 
						|
								}
							 | 
						|
								
							 |