Symfony 4.1: Melhorias nos Cabeçalhos HTTP
Adicionada a classe HeaderUtils
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