Symfony 4.1: Melhorias nos Cabeçalhos HTTP

Adicionada a classe HeaderUtils

Andréia Bohner
2 min readApr 28, 2018

Realizar o parse de cabeçalhos HTTP não é tão trivial quanto alguns podem pensar. Requer o parse de strings entre aspas com barras invertidas como caracter de escape e ignorar espaço em branco em determinados locais. Isso foi feito em alguns métodos do componente HttpFoundation, mas a lógica repetida estava começando a dificultar a manutenção do código.

É por isso que no Symfony 4.1 foi introduzida uma nova classe HeaderUtils que fornece os utilitários comuns necessários ao fazer o parse dos cabeçalhos HTTP. Essa não é uma classe interna, então, você pode usá-la em seu próprio código também:

use Symfony\Component\HttpFoundation\HeaderUtils;

// Splits an HTTP header by one or more separators
HeaderUtils::split('da, en-gb;q=0.8', ',;')
// => array(array('da'), array('en-gb'), array('q', '0.8'))

// Combines an array of arrays into one associative array
HeaderUtils::combineParts(array(array('foo', 'abc'), array('bar')))
// => array('foo' => 'abc', 'bar' => true)

// Joins an associative array into a string for use in an HTTP header
HeaderUtils::joinAssoc(array('foo' => 'abc', 'bar' => true, 'baz' => 'a b c'), ',')
// => 'foo=abc, bar, baz="a b c"'

// Encodes a string as a quoted string, if necessary
HeaderUtils::quote('foo "bar"')
// => 'foo \"bar\"'

// Decodes a quoted string
HeaderUtils::unquote('foo \"bar\"')
// => 'foo "bar"'

Permitir ignorar cabeçalhos ao submeter formulários em testes

Um problema relatado pelo projeto Mink fez perceber que não pode-se ignorar as informações de cabeçalho HTTP ao submeter formulários em testes que usam o componente BrowserKit.

É por isso que no Symfony 4.1 o método submit() agora aceita um terceiro argumento opcional chamado $serverParameters que permite fazer coisas como esta:

$crawler = $client->request('GET', 'http://www.example.com/foo');
$form = $crawler->filter('input')->form();
$client->submit($form, [], ['HTTP_ACCEPT_LANGUAGE' => 'de']);
// => $client->getRequest()->getServer()['HTTP_ACCEPT_LANGUAGE'] = 'de'

Adicionado suporte para valores padrão nos cabeçalhos Accept

Ao usar o cabeçalho HTTP Accept, é comum usar expressões como .../*, */* e até * para definir os valores padrão:

Accept: text/plain;q=0.5, text/html, text/*;q=0.8, */*

No entanto, nas versões do Symfony anteriores a 4.1, esses valores padrão não eram suportados:

use Symfony\Component\HttpFoundation\AcceptHeader;

$acceptHeader = AcceptHeader::fromString('text/plain;q=0.5, text/html, text/*;q=0.8, */*');
$quality = $acceptHeader->get('text/xml')->getQuality();
// instead of returning '0.8', this code displays the following error message:
// Call to a member function getQuality() on null

No Symfony 4.1 todos esses valores padrão agora são suportados corretamente:

$acceptHeader = AcceptHeader::fromString('text/plain;q=0.5, text/html, text/*;q=0.8, */*');
$acceptHeader->get('text/xml')->getQuality(); // => 0.8 (because of text/*)
$acceptHeader->get('text/html')->getQuality(); // => 1.0
$acceptHeader->get('application/xml')->getQuality(); // => 1.0 (because of */*)

Tradução de: New in Symfony 4.1: HTTP header improvements

--

--