Nuevo en Symfony 4.1: mejoras relacionadas con las cabeceras HTTP

Nueva clase HeaderUtils

Procesar el valor de las cabeceras HTTP no es algo tan sencillo como algunos creen porque hay que lidiar con caracteres escapados y con los espacios en blanco, que a veces se ignoran y otras veces no.

En el componente HttpFoundation hacíamos este procesamiento en varios sitios, por lo que el código repetido empezaba a ser complicado de mantener. Así que en Symfony 4.1 hemos introducido una clase HeaderUtils que proporciona las utilidades más comunes para procesar cabeceras HTTP y que también puedes utilizar en tus aplicaciones:

use Symfony\Component\HttpFoundation\HeaderUtils;
 
// Divide una cadena en partes según los separadores indicados
HeaderUtils::split('da, en-gb;q=0.8', ',;')
// => array(array('da'), array('en-gb'), array('q', '0.8'))
 
// Combina un array de arrays para crear un array asociativo
HeaderUtils::combine(array(array('foo', 'abc'), array('bar')))
// => array('foo' => 'abc', 'bar' => true)
 
// Transforma un array asociativo en una cadena para usarlo como
// valor de una cabecera HTTP
HeaderUtils::toString(array('foo' => 'abc', 'bar' => true, 'baz' => 'a b c'), ',')
// => 'foo=abc, bar, baz="a b c"'
 
// Escapa el valor indicado para incluirlo como valor de una cabecera HTTP
HeaderUtils::quote('foo "bar"')
// => 'foo \"bar\"'
 
// Realiza el proceso inverso de 'quote()'
HeaderUtils::unquote('foo \"bar\"')
// => 'foo "bar"'

Esta funcionalidad fue contribuida por Christian Schmidt en el pull request #24699.

Sobreescribir cabeceras HTTP en tests

Este issue reportado en el proyecto Mink nos hizo ver que no es posible sobreescribir las cabeceras HTTP cuando se envían formularios en tests que utilizan el componente BrowserKit.

Así que en Symfony 4.1, el método submit() ahora acepta un tercer argumento opcional llamado $serverParameters que permite hacer cosas como estas:

$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'

Esta funcionalidad fue contribuida por cfjulien en el pull request #26791.

Valores por defecto en las cabeceras Accept

Cuando se trabaja con cabeceras HTTP de tipo Accept es común usar expresiones como .../*, */* y * para definir valores por defecto:

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

Sin embargo, en las versiones anteriores a 4.1, estos valores por defecto no se tenían en cuenta:

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();
// en vez de devolver '0.8', este código muestra el siguiente error:
//   Call to a member function getQuality() on null

En Symfony 4.1 todos estos valores por defecto están soportados:

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

Esta funcionalidad fue contribuida por Javier Eguiluz en el pull request #26036.

Fuente: New in Symfony 4.1: HTTP header improvements

Comentarios

Publicada el

30 de mayo de 2018

Etiquetas

Proyectos Symfony destacados

La plataforma de eCommerce 100% Symfony que rivaliza con Magento y PrestaShop. Ver más

Síguenos en @symfony_es para acceder a las últimas noticias.