mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-20 13:52:40 +01:00
Add an AphrontHTTPProxyResponse
Summary: Ref T7019. Adds a new response which can proxy an HTTP request and pass the result through. This is grossly inefficient for the same reasons as HTTP hosting is generally inefficient right now (T4369). This stuff is fixable but not trivial. Test Plan: Replaced home page with a proxy to `example.org`, used Charles to view headers, saw the page headers and content proxy with an X-Phabricator-Proxied header. Reviewers: btrahan Reviewed By: btrahan Subscribers: epriestley Maniphest Tasks: T7019 Differential Revision: https://secure.phabricator.com/D11492
This commit is contained in:
parent
ac41db402a
commit
51b2c4d01e
2 changed files with 67 additions and 0 deletions
|
@ -136,6 +136,7 @@ phutil_register_library_map(array(
|
||||||
'AphrontFormView' => 'view/form/AphrontFormView.php',
|
'AphrontFormView' => 'view/form/AphrontFormView.php',
|
||||||
'AphrontGlyphBarView' => 'view/widget/bars/AphrontGlyphBarView.php',
|
'AphrontGlyphBarView' => 'view/widget/bars/AphrontGlyphBarView.php',
|
||||||
'AphrontHTMLResponse' => 'aphront/response/AphrontHTMLResponse.php',
|
'AphrontHTMLResponse' => 'aphront/response/AphrontHTMLResponse.php',
|
||||||
|
'AphrontHTTPProxyResponse' => 'aphront/response/AphrontHTTPProxyResponse.php',
|
||||||
'AphrontHTTPSink' => 'aphront/sink/AphrontHTTPSink.php',
|
'AphrontHTTPSink' => 'aphront/sink/AphrontHTTPSink.php',
|
||||||
'AphrontHTTPSinkTestCase' => 'aphront/sink/__tests__/AphrontHTTPSinkTestCase.php',
|
'AphrontHTTPSinkTestCase' => 'aphront/sink/__tests__/AphrontHTTPSinkTestCase.php',
|
||||||
'AphrontIsolatedDatabaseConnectionTestCase' => 'infrastructure/storage/__tests__/AphrontIsolatedDatabaseConnectionTestCase.php',
|
'AphrontIsolatedDatabaseConnectionTestCase' => 'infrastructure/storage/__tests__/AphrontIsolatedDatabaseConnectionTestCase.php',
|
||||||
|
@ -3248,6 +3249,7 @@ phutil_register_library_map(array(
|
||||||
'AphrontFormView' => 'AphrontView',
|
'AphrontFormView' => 'AphrontView',
|
||||||
'AphrontGlyphBarView' => 'AphrontBarView',
|
'AphrontGlyphBarView' => 'AphrontBarView',
|
||||||
'AphrontHTMLResponse' => 'AphrontResponse',
|
'AphrontHTMLResponse' => 'AphrontResponse',
|
||||||
|
'AphrontHTTPProxyResponse' => 'AphrontResponse',
|
||||||
'AphrontHTTPSinkTestCase' => 'PhabricatorTestCase',
|
'AphrontHTTPSinkTestCase' => 'PhabricatorTestCase',
|
||||||
'AphrontIsolatedDatabaseConnectionTestCase' => 'PhabricatorTestCase',
|
'AphrontIsolatedDatabaseConnectionTestCase' => 'PhabricatorTestCase',
|
||||||
'AphrontIsolatedHTTPSink' => 'AphrontHTTPSink',
|
'AphrontIsolatedHTTPSink' => 'AphrontHTTPSink',
|
||||||
|
|
65
src/aphront/response/AphrontHTTPProxyResponse.php
Normal file
65
src/aphront/response/AphrontHTTPProxyResponse.php
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Responds to a request by proxying an HTTP future.
|
||||||
|
*
|
||||||
|
* NOTE: This is currently very inefficient for large responses, and buffers
|
||||||
|
* the entire response into memory before returning it. It should be updated
|
||||||
|
* to stream the response instead, but we need to complete additional
|
||||||
|
* infrastructure work first.
|
||||||
|
*/
|
||||||
|
final class AphrontHTTPProxyResponse extends AphrontResponse {
|
||||||
|
|
||||||
|
private $future;
|
||||||
|
private $headers;
|
||||||
|
private $httpCode;
|
||||||
|
|
||||||
|
public function setHTTPFuture(HTTPSFuture $future) {
|
||||||
|
$this->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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in a new issue