[FrameworkBundle] Add support to 307/308 HTTP status codes in RedirectController
This commit is contained in:
parent
b0facfec01
commit
64fb5a5663
@ -10,6 +10,7 @@ CHANGELOG
|
||||
* Added option in workflow dump command to label graph with a custom label
|
||||
* Using a `RouterInterface` that does not implement the `WarmableInterface` is deprecated and will not be supported in Symfony 5.0.
|
||||
* The `RequestDataCollector` class has been deprecated and will be removed in Symfony 5.0. Use the `Symfony\Component\HttpKernel\DataCollector\RequestDataCollector` class instead.
|
||||
* The `RedirectController` class allows for 307/308 HTTP status codes
|
||||
|
||||
4.0.0
|
||||
-----
|
||||
|
@ -46,14 +46,15 @@ class RedirectController
|
||||
* In case the route name is empty, the status code will be 404 when permanent is false
|
||||
* and 410 otherwise.
|
||||
*
|
||||
* @param Request $request The request instance
|
||||
* @param string $route The route name to redirect to
|
||||
* @param bool $permanent Whether the redirection is permanent
|
||||
* @param bool|array $ignoreAttributes Whether to ignore attributes or an array of attributes to ignore
|
||||
* @param Request $request The request instance
|
||||
* @param string $route The route name to redirect to
|
||||
* @param bool $permanent Whether the redirection is permanent
|
||||
* @param bool|array $ignoreAttributes Whether to ignore attributes or an array of attributes to ignore
|
||||
* @param bool $keepRequestMethod Wheter redirect action should keep HTTP request method
|
||||
*
|
||||
* @throws HttpException In case the route name is empty
|
||||
*/
|
||||
public function redirectAction(Request $request, string $route, bool $permanent = false, $ignoreAttributes = false): Response
|
||||
public function redirectAction(Request $request, string $route, bool $permanent = false, $ignoreAttributes = false, bool $keepRequestMethod = false): Response
|
||||
{
|
||||
if ('' == $route) {
|
||||
throw new HttpException($permanent ? 410 : 404);
|
||||
@ -62,13 +63,19 @@ class RedirectController
|
||||
$attributes = array();
|
||||
if (false === $ignoreAttributes || is_array($ignoreAttributes)) {
|
||||
$attributes = $request->attributes->get('_route_params');
|
||||
unset($attributes['route'], $attributes['permanent'], $attributes['ignoreAttributes']);
|
||||
unset($attributes['route'], $attributes['permanent'], $attributes['ignoreAttributes'], $attributes['keepRequestMethod']);
|
||||
if ($ignoreAttributes) {
|
||||
$attributes = array_diff_key($attributes, array_flip($ignoreAttributes));
|
||||
}
|
||||
}
|
||||
|
||||
return new RedirectResponse($this->router->generate($route, $attributes, UrlGeneratorInterface::ABSOLUTE_URL), $permanent ? 301 : 302);
|
||||
if ($keepRequestMethod) {
|
||||
$statusCode = $permanent ? 308 : 307;
|
||||
} else {
|
||||
$statusCode = $permanent ? 301 : 302;
|
||||
}
|
||||
|
||||
return new RedirectResponse($this->router->generate($route, $attributes, UrlGeneratorInterface::ABSOLUTE_URL), $statusCode);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -80,22 +87,27 @@ class RedirectController
|
||||
* In case the path is empty, the status code will be 404 when permanent is false
|
||||
* and 410 otherwise.
|
||||
*
|
||||
* @param Request $request The request instance
|
||||
* @param string $path The absolute path or URL to redirect to
|
||||
* @param bool $permanent Whether the redirect is permanent or not
|
||||
* @param string|null $scheme The URL scheme (null to keep the current one)
|
||||
* @param int|null $httpPort The HTTP port (null to keep the current one for the same scheme or the default configured port)
|
||||
* @param int|null $httpsPort The HTTPS port (null to keep the current one for the same scheme or the default configured port)
|
||||
* @param Request $request The request instance
|
||||
* @param string $path The absolute path or URL to redirect to
|
||||
* @param bool $permanent Whether the redirect is permanent or not
|
||||
* @param string|null $scheme The URL scheme (null to keep the current one)
|
||||
* @param int|null $httpPort The HTTP port (null to keep the current one for the same scheme or the default configured port)
|
||||
* @param int|null $httpsPort The HTTPS port (null to keep the current one for the same scheme or the default configured port)
|
||||
* @param bool $keepRequestMethod Wheter redirect action should keep HTTP request method
|
||||
*
|
||||
* @throws HttpException In case the path is empty
|
||||
*/
|
||||
public function urlRedirectAction(Request $request, string $path, bool $permanent = false, string $scheme = null, int $httpPort = null, int $httpsPort = null): Response
|
||||
public function urlRedirectAction(Request $request, string $path, bool $permanent = false, string $scheme = null, int $httpPort = null, int $httpsPort = null, bool $keepRequestMethod = false): Response
|
||||
{
|
||||
if ('' == $path) {
|
||||
throw new HttpException($permanent ? 410 : 404);
|
||||
}
|
||||
|
||||
$statusCode = $permanent ? 301 : 302;
|
||||
if ($keepRequestMethod) {
|
||||
$statusCode = $permanent ? 308 : 307;
|
||||
} else {
|
||||
$statusCode = $permanent ? 301 : 302;
|
||||
}
|
||||
|
||||
// redirect if the path is a full URL
|
||||
if (parse_url($path, PHP_URL_SCHEME)) {
|
||||
|
@ -47,7 +47,7 @@ class RedirectControllerTest extends TestCase
|
||||
/**
|
||||
* @dataProvider provider
|
||||
*/
|
||||
public function testRoute($permanent, $ignoreAttributes, $expectedCode, $expectedAttributes)
|
||||
public function testRoute($permanent, $keepRequestMethod, $ignoreAttributes, $expectedCode, $expectedAttributes)
|
||||
{
|
||||
$request = new Request();
|
||||
|
||||
@ -62,6 +62,7 @@ class RedirectControllerTest extends TestCase
|
||||
'permanent' => $permanent,
|
||||
'additional-parameter' => 'value',
|
||||
'ignoreAttributes' => $ignoreAttributes,
|
||||
'keepRequestMethod' => $keepRequestMethod,
|
||||
),
|
||||
);
|
||||
|
||||
@ -76,7 +77,7 @@ class RedirectControllerTest extends TestCase
|
||||
|
||||
$controller = new RedirectController($router);
|
||||
|
||||
$returnResponse = $controller->redirectAction($request, $route, $permanent, $ignoreAttributes);
|
||||
$returnResponse = $controller->redirectAction($request, $route, $permanent, $ignoreAttributes, $keepRequestMethod);
|
||||
|
||||
$this->assertRedirectUrl($returnResponse, $url);
|
||||
$this->assertEquals($expectedCode, $returnResponse->getStatusCode());
|
||||
@ -85,10 +86,14 @@ class RedirectControllerTest extends TestCase
|
||||
public function provider()
|
||||
{
|
||||
return array(
|
||||
array(true, false, 301, array('additional-parameter' => 'value')),
|
||||
array(false, false, 302, array('additional-parameter' => 'value')),
|
||||
array(false, true, 302, array()),
|
||||
array(false, array('additional-parameter'), 302, array()),
|
||||
array(true, false, false, 301, array('additional-parameter' => 'value')),
|
||||
array(false, false, false, 302, array('additional-parameter' => 'value')),
|
||||
array(false, false, true, 302, array()),
|
||||
array(false, false, array('additional-parameter'), 302, array()),
|
||||
array(true, true, false, 308, array('additional-parameter' => 'value')),
|
||||
array(false, true, false, 307, array('additional-parameter' => 'value')),
|
||||
array(false, true, true, 307, array()),
|
||||
array(false, true, array('additional-parameter'), 307, array()),
|
||||
);
|
||||
}
|
||||
|
||||
@ -122,6 +127,16 @@ class RedirectControllerTest extends TestCase
|
||||
$this->assertEquals(302, $returnResponse->getStatusCode());
|
||||
}
|
||||
|
||||
public function testFullURLWithMethodKeep()
|
||||
{
|
||||
$request = new Request();
|
||||
$controller = new RedirectController();
|
||||
$returnResponse = $controller->urlRedirectAction($request, 'http://foo.bar/', false, null, null, null, true);
|
||||
|
||||
$this->assertRedirectUrl($returnResponse, 'http://foo.bar/');
|
||||
$this->assertEquals(307, $returnResponse->getStatusCode());
|
||||
}
|
||||
|
||||
public function testUrlRedirectDefaultPorts()
|
||||
{
|
||||
$host = 'www.example.com';
|
||||
|
Reference in New Issue
Block a user