bug #11244 [HttpFoundation] Remove body-related headers when sending the response, if body is empty (SimonSimCity)
This PR was submitted for the master branch but it was merged into the 2.3 branch instead (closes #11244).
Discussion
----------
[HttpFoundation] Remove body-related headers when sending the response, if body is empty
| Q | A
| ------------- | ---
| Bug fix? | no
| New feature? | yes
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets |
| License | MIT
| Doc PR |
I've updated the implementation for informational and 204 or 304 responses. They will now, as they have no content, not return headers like `content-type` or `content-length`.
I'm unsure about `content-length` - we could also set it hardcoded to zero ... but I thought, that (because the specs say that it just can't have a response-body) the system should not return anything here.
Commits
-------
9dbe89d
[HttpFoundation] Remove content-related headers if content is empty
This commit is contained in:
commit
75abd1a451
|
@ -209,36 +209,42 @@ class Response
|
||||||
|
|
||||||
if ($this->isInformational() || in_array($this->statusCode, array(204, 304))) {
|
if ($this->isInformational() || in_array($this->statusCode, array(204, 304))) {
|
||||||
$this->setContent(null);
|
$this->setContent(null);
|
||||||
}
|
$headers->remove('Content-Type');
|
||||||
|
|
||||||
// Content-type based on the Request
|
|
||||||
if (!$headers->has('Content-Type')) {
|
|
||||||
$format = $request->getRequestFormat();
|
|
||||||
if (null !== $format && $mimeType = $request->getMimeType($format)) {
|
|
||||||
$headers->set('Content-Type', $mimeType);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fix Content-Type
|
|
||||||
$charset = $this->charset ?: 'UTF-8';
|
|
||||||
if (!$headers->has('Content-Type')) {
|
|
||||||
$headers->set('Content-Type', 'text/html; charset='.$charset);
|
|
||||||
} elseif (0 === stripos($headers->get('Content-Type'), 'text/') && false === stripos($headers->get('Content-Type'), 'charset')) {
|
|
||||||
// add the charset
|
|
||||||
$headers->set('Content-Type', $headers->get('Content-Type').'; charset='.$charset);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fix Content-Length
|
|
||||||
if ($headers->has('Transfer-Encoding')) {
|
|
||||||
$headers->remove('Content-Length');
|
$headers->remove('Content-Length');
|
||||||
}
|
} else {
|
||||||
|
// Content-type based on the Request
|
||||||
|
if (!$headers->has('Content-Type')) {
|
||||||
|
$format = $request->getRequestFormat();
|
||||||
|
if (null !== $format && $mimeType = $request->getMimeType($format)) {
|
||||||
|
$headers->set('Content-Type', $mimeType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ($request->isMethod('HEAD')) {
|
// Fix Content-Type
|
||||||
// cf. RFC2616 14.13
|
$charset = $this->charset ?: 'UTF-8';
|
||||||
$length = $headers->get('Content-Length');
|
if (!$headers->has('Content-Type')) {
|
||||||
$this->setContent(null);
|
$headers->set('Content-Type', 'text/html; charset=' . $charset);
|
||||||
if ($length) {
|
} elseif (0 === stripos($headers->get('Content-Type'), 'text/') && false === stripos(
|
||||||
$headers->set('Content-Length', $length);
|
$headers->get('Content-Type'),
|
||||||
|
'charset'
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
// add the charset
|
||||||
|
$headers->set('Content-Type', $headers->get('Content-Type') . '; charset=' . $charset);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fix Content-Length
|
||||||
|
if ($headers->has('Transfer-Encoding')) {
|
||||||
|
$headers->remove('Content-Length');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($request->isMethod('HEAD')) {
|
||||||
|
// cf. RFC2616 14.13
|
||||||
|
$length = $headers->get('Content-Length');
|
||||||
|
$this->setContent(null);
|
||||||
|
if ($length) {
|
||||||
|
$headers->set('Content-Length', $length);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -374,6 +374,8 @@ class ResponseTest extends ResponseTestCase
|
||||||
$response->prepare($request);
|
$response->prepare($request);
|
||||||
|
|
||||||
$this->assertEquals('', $response->getContent());
|
$this->assertEquals('', $response->getContent());
|
||||||
|
$this->assertFalse($response->headers->has('Content-Type'));
|
||||||
|
$this->assertFalse($response->headers->has('Content-Length'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testPrepareSetsPragmaOnHttp10Only()
|
public function testPrepareSetsPragmaOnHttp10Only()
|
||||||
|
|
Reference in New Issue