1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-12-11 08:06:13 +01:00

(stable) Don't combine automatic output compression with "Content-Length"

Summary:
Fixes T12013. Send either "Content-Length" or enable output compression, but not both.

Prefer compression for static resources (CSS, JS, etc).

Test Plan: Ran `curl -v ...`, no longer saw responses with both compression and `Content-Length`.

Reviewers: chad, avivey

Reviewed By: avivey

Subscribers: avivey

Maniphest Tasks: T12013

Differential Revision: https://secure.phabricator.com/D17045
This commit is contained in:
epriestley 2016-12-13 14:02:04 -08:00
parent 3cd0001d8b
commit 1cd64f9975
5 changed files with 38 additions and 9 deletions

View file

@ -5,6 +5,7 @@ final class AphrontFileResponse extends AphrontResponse {
private $content; private $content;
private $contentIterator; private $contentIterator;
private $contentLength; private $contentLength;
private $compressResponse;
private $mimeType; private $mimeType;
private $download; private $download;
@ -69,6 +70,15 @@ final class AphrontFileResponse extends AphrontResponse {
return $this->contentLength; return $this->contentLength;
} }
public function setCompressResponse($compress_response) {
$this->compressResponse = $compress_response;
return $this;
}
public function getCompressResponse() {
return $this->compressResponse;
}
public function setRange($min, $max) { public function setRange($min, $max) {
$this->rangeMin = $min; $this->rangeMin = $min;
$this->rangeMax = $max; $this->rangeMax = $max;
@ -94,7 +104,9 @@ final class AphrontFileResponse extends AphrontResponse {
$content_len = $this->getContentLength(); $content_len = $this->getContentLength();
} }
$headers[] = array('Content-Length', $this->getContentLength()); if (!$this->shouldCompressResponse()) {
$headers[] = array('Content-Length', $this->getContentLength());
}
if (strlen($this->getDownload())) { if (strlen($this->getDownload())) {
$headers[] = array('X-Download-Options', 'noopen'); $headers[] = array('X-Download-Options', 'noopen');
@ -118,4 +130,8 @@ final class AphrontFileResponse extends AphrontResponse {
return $headers; return $headers;
} }
protected function shouldCompressResponse() {
return $this->getCompressResponse();
}
} }

View file

@ -242,6 +242,21 @@ abstract class AphrontResponse extends Phobject {
return gmdate('D, d M Y H:i:s', $epoch_timestamp).' GMT'; return gmdate('D, d M Y H:i:s', $epoch_timestamp).' GMT';
} }
protected function shouldCompressResponse() {
return true;
}
public function willBeginWrite() {
if ($this->shouldCompressResponse()) {
// Enable automatic compression here. Webservers sometimes do this for
// us, but we now detect the absence of compression and warn users about
// it so try to cover our bases more thoroughly.
ini_set('zlib.output_compression', 1);
} else {
ini_set('zlib.output_compression', 0);
}
}
public function didCompleteWrite($aborted) { public function didCompleteWrite($aborted) {
return; return;
} }

View file

@ -96,6 +96,8 @@ abstract class AphrontHTTPSink extends Phobject {
* @return void * @return void
*/ */
final public function writeResponse(AphrontResponse $response) { final public function writeResponse(AphrontResponse $response) {
$response->willBeginWrite();
// Build the content iterator first, in case it throws. Ideally, we'd // Build the content iterator first, in case it throws. Ideally, we'd
// prefer to handle exceptions before we emit the response status or any // prefer to handle exceptions before we emit the response status or any
// HTTP headers. // HTTP headers.

View file

@ -103,9 +103,10 @@ abstract class CelerityResourceController extends PhabricatorController {
} }
} }
$response = new AphrontFileResponse(); $response = id(new AphrontFileResponse())
$response->setContent($data); ->setContent($data)
$response->setMimeType($type_map[$type]); ->setMimeType($type_map[$type])
->setCompressResponse(true);
// NOTE: This is a piece of magic required to make WOFF fonts work in // NOTE: This is a piece of magic required to make WOFF fonts work in
// Firefox and IE. Possibly we should generalize this more. // Firefox and IE. Possibly we should generalize this more.

View file

@ -395,11 +395,6 @@ final class PhabricatorStartup {
if (function_exists('libxml_disable_entity_loader')) { if (function_exists('libxml_disable_entity_loader')) {
libxml_disable_entity_loader(true); libxml_disable_entity_loader(true);
} }
// Enable automatic compression here. Webservers sometimes do this for
// us, but we now detect the absence of compression and warn users about
// it so try to cover our bases more thoroughly.
ini_set('zlib.output_compression', 1);
} }