Intercepter des redirections avec le client Http Symfony

Publié le 06/03/2020 • Mis à jour le 06/03/2020


English language detected! 🇬🇧

  We noticed that your browser is using English. Do you want to read this post in this language?

Read the english version 🇬🇧

Dans ce bout de code nous allons voir comment intercepter des redirections avec le client Http Symfony. J'utilise cette astuce dans certains de mes tests vérifiant si les versions non-https de mes pages sont bien redirigées vers les versions canoniques (www avec https). Si aucune exception n'est levée par la fonction request() alors le test échoue. Sinon, on vérifie que l'entête location de la réponse est bien égale à l'URL que nous attendons.


<?php declare(strict_types=1);

namespace App\Tests\External;

use App\Tests\WebTestCase;
use Symfony\Component\HttpClient\Exception\RedirectionException;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Contracts\HttpClient\HttpClientInterface;

/**
 * Test the SSL redirections.
 */
final class SslTest extends WebTestCase
{
    /**
     * @var HttpClientInterface
     */
    private $httpClient;

    protected function setUp(): void
    {
        self::bootKernel();
        $this->httpClient = self::$container->get('http_client');
    }

    public function urlProvider(): iterable
    {
        // http with www
        yield ['http://www.strangebuzz.com', 'https://www.strangebuzz.com/'];
        yield ['http://www.strangebuzz.com/', 'https://www.strangebuzz.com/'];
        yield ['http://www.strangebuzz.com/en/snippets/freezing-the-vue-js-version-to-a-minor-version', 'https://www.strangebuzz.com/en/snippets/freezing-the-vue-js-version-to-a-minor-version'];

        // http with www
        yield ['http://strangebuzz.com', 'https://www.strangebuzz.com/'];
        yield ['http://strangebuzz.com/', 'https://www.strangebuzz.com/'];
        yield ['http://strangebuzz.com/en/snippets/freezing-the-vue-js-version-to-a-minor-version', 'https://www.strangebuzz.com/'];

        // https with www
        yield ['https://strangebuzz.com', 'https://www.strangebuzz.com/'];
        yield ['https://strangebuzz.com/', 'https://www.strangebuzz.com/'];
        yield ['https://strangebuzz.com/en/snippets/freezing-the-vue-js-version-to-a-minor-version', 'https://www.strangebuzz.com/en/snippets/freezing-the-vue-js-version-to-a-minor-version'];
    }

    /**
     * @dataProvider urlProvider
     */
    public function testSsl(string $url, string $location): void
    {
        try {
            $this->httpClient->request('GET', $url, ['max_redirects' => 0])->getContent();
            $this->fail(sprintf('URL "%s" non redirigée.', $url));
        } catch (RedirectionException $e) {
            $this->assertSame(Response::HTTP_MOVED_PERMANENTLY, $e->getResponse()->getStatusCode());
            $this->assertSame($location, $e->getResponse()->getInfo()['redirect_url'] ?? '');
        }
    }
}