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
Proyectos Symfony destacados
La forma más sencilla de generar el backend de tus aplicaciones Symfony. Ver más
Síguenos en @symfony_es para acceder a las últimas noticias.