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(); $this->headers = $headers; return $body; } }