diff --git a/src/aphront/response/AphrontHTTPProxyResponse.php b/src/aphront/response/AphrontHTTPProxyResponse.php index c2e5bda603..fa629181ef 100644 --- a/src/aphront/response/AphrontHTTPProxyResponse.php +++ b/src/aphront/response/AphrontHTTPProxyResponse.php @@ -1,65 +1,79 @@ future = $future; return $this; } public function getHTTPFuture() { return $this->future; } public function getCacheHeaders() { return array(); } public function getHeaders() { $this->readRequestHeaders(); return array_merge( parent::getHeaders(), $this->headers, array( array('X-Phabricator-Proxy', 'true'), )); } public function buildResponseString() { // TODO: AphrontResponse needs to support streaming responses. return $this->readRequest(); } public function getHTTPResponseCode() { $this->readRequestHeaders(); return $this->httpCode; } private function readRequestHeaders() { // TODO: This should read only the headers. $this->readRequest(); } private function readRequest() { // TODO: This is grossly inefficient for large requests. list($status, $body, $headers) = $this->future->resolve(); $this->httpCode = $status->getStatusCode(); + + // Strip "Transfer-Encoding" headers. Particularly, the server we proxied + // may have chunked the response, but cURL will already have un-chunked it. + // If we emit the header and unchunked data, the response becomes invalid. + foreach ($headers as $key => $header) { + list($header_head, $header_body) = $header; + $header_head = phutil_utf8_strtolower($header_head); + switch ($header_head) { + case 'transfer-encoding': + unset($headers[$key]); + break; + } + } + $this->headers = $headers; return $body; } }