API Remove Content-Length setting from HTTPResponse (fixes #8010)

This reverts commit 356a367eb5.
We can't use headers_sent() to determine an accurate
content length, since PHP defaults to buffering a couple of bytes
even without ob_start() (see "output_buffering" setting).
This makes the patch harmful, since it breaks any responses relying
on more structure data, like removing closing brackets from JSON.
Which in turn breaks the CMS in horrible ways (see #8010).
See #7574 for context.
This commit is contained in:
Ingo Schommer 2013-01-23 15:02:30 +01:00
parent 4892c11aaa
commit c69381c33e
3 changed files with 3 additions and 21 deletions

View File

@ -148,17 +148,6 @@ class Director implements TemplateGlobalProvider {
number_format(memory_get_peak_usage(),0)
));
} else {
// Set content length (according to RFC2616)
if(
!headers_sent()
&& $response->getBody()
&& $req->httpMethod() != 'HEAD'
&& $response->getStatusCode() >= 200
&& !in_array($response->getStatusCode(), array(204, 304))
) {
$response->fixContentLength();
}
$response->output();
}
} else {

View File

@ -150,6 +150,9 @@ class SS_HTTPResponse {
public function setBody($body) {
$this->body = $body;
// Set content-length in bytes. Use mbstring to avoid problems with mb_internal_encoding() and mbstring.func_overload
$this->headers['Content-Length'] = mb_strlen($this->body,'8bit');
}
public function getBody() {
@ -246,14 +249,6 @@ class SS_HTTPResponse {
public function isFinished() {
return in_array($this->statusCode, array(301, 302, 401, 403));
}
/**
* Set content-length in bytes. Should be called right before {@link output()}.
*/
public function fixContentLength() {
// Use mbstring to avoid problems with mb_internal_encoding() and mbstring.func_overload
$this->headers['Content-Length'] = mb_strlen($this->body,'8bit');
}
}

View File

@ -15,7 +15,6 @@ class HTTPResponseTest extends SapphireTest {
public function testContentLengthHeader() {
$r = new SS_HTTPResponse('123ü');
$r->fixContentLength();
$this->assertNotNull($r->getHeader('Content-Length'), 'Content-length header is added');
$this->assertEquals(
5,
@ -24,7 +23,6 @@ class HTTPResponseTest extends SapphireTest {
);
$r->setBody('1234ü');
$r->fixContentLength();
$this->assertEquals(
6,
$r->getHeader('Content-Length'),