Closed
Description
Version of symfony: 2.*
Step to reproduce:
$resp = new \Symfony\Component\HttpFoundation\Response('test',\Symfony\Component\HttpFoundation\Response::HTTP_UNPROCESSABLE_ENTITY);
$resp->headers->set('MyHeader','MyValue');
$resp->send();
Result:
curl -vvv -XGET http://ololo-pew-pew/api/v1/performance/tick
[SKIPPED]
< HTTP/1.1 422
[SKIPPED]
Expected:
curl -vvv -XGET http://ololo-pew-pew/api/v1/performance/tick
[SKIPPED]
< HTTP/1.1 422 Unprocessable Entity
[SKIPPED]
This behaviour occurs due hhvm header implementation:
https://github.com/facebook/hhvm/blob/44b242ba185856a3e6661d8179039d8274d0d4a9/hphp/runtime/ext/std/ext_std_network.cpp#L284
https://github.com/facebook/hhvm/blob/4a3be43df46ea29b5d7860aaa524bd3ee8aaf4c8/hphp/runtime/server/transport.cpp#L521
https://github.com/facebook/hhvm/blob/f3fb59b8639668cc6ec26db56da350e04e2fe182/hphp/runtime/server/http-protocol.cpp#L940
hhvm rewrite HTTP response header on each call header() function if pass response code
I think that the simplest workaround is change:
https://github.com/symfony/symfony/blob/2.8/src/Symfony/Component/HttpFoundation/Response.php#L332
to
// headers
foreach ($this->headers->allPreserveCase() as $name => $values) {
foreach ($values as $value) {
header($name.': '.$value, false, $this->statusCode);
}
}
// status
header(sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText), true, $this->statusCode);