Skip to content

Instantly share code, notes, and snippets.

@ephrin
Created December 3, 2017 10:44
Show Gist options
  • Save ephrin/a191deddf932e89a7b423ac1eeae8f68 to your computer and use it in GitHub Desktop.
Save ephrin/a191deddf932e89a7b423ac1eeae8f68 to your computer and use it in GitHub Desktop.
react - symfony request<>response proxy draft
<?php
require __DIR__ . '/../vendor/autoload.php';
use App\Kernel;
use React\Http\Response;
use Symfony\Component\Debug\Debug;
use Symfony\Component\Dotenv\Dotenv;
use Symfony\Component\HttpFoundation\Request;
// The check is to ensure we don't use .env in production
if (!isset($_SERVER['APP_ENV'])) {
if (!class_exists(Dotenv::class)) {
throw new \RuntimeException('APP_ENV environment variable is not defined. You need to define environment variables for configuration or add "symfony/dotenv" as a Composer dependency to load variables from a .env file.');
}
(new Dotenv())->load(__DIR__ . '/../.env');
}
$loop = React\EventLoop\Factory::create();
$i = 0;
$kernel = new Kernel($_SERVER['APP_ENV'] ?? 'dev',
$_SERVER['APP_DEBUG'] ?? ('prod' !== ($_SERVER['APP_ENV'] ?? 'dev')));
$serverStatic = [
'DOCUMENT_ROOT' => __DIR__,
'SCRIPT_FILENAME' => realpath(__FILE__),
'SCRIPT_NAME' => $self = str_replace(__DIR__, '', realpath(__FILE__)),
'PHP_SELF' => $self,
'SERVER_SOFTWARE' => 'PHP '.PHP_VERSION.' React Server'
];
$server = new React\Http\Server(function (Psr\Http\Message\ServerRequestInterface $request) use (
&$i,
$kernel,
$serverStatic
) {
$uri = $request->getUri();
$server = array_merge($serverStatic, [
'REQUEST_URI' => $uri->getPath() . ($uri->getQuery() ? '?' . $uri->getQuery() : ''),
'QUERY_STRING' => $uri->getQuery(),
'REQUEST_METHOD' => $request->getMethod(),
'SERVER_PROTOCOL' => 'HTTP/' . $request->getProtocolVersion()
]);
foreach ($request->getHeaders() as $header => [$value]) {
$server['HTTP_' . strtoupper(preg_replace('/[\- .]/', '_', $header))] = $value;
}
$server = array_merge($server, $_ENV);
$serverParams = array_merge($server, $request->getServerParams());
$serverParams['SERVER_NAME'] = $serverParams['SERVER_ADDR'];
unset($serverParams['SHELL_VERBOSITY'], $serverParams['SERVER_ADDR']);
echo '----------------------' . PHP_EOL;
try {
if ($serverParams['APP_DEBUG'] ?? ('prod' !== ($serverParams['APP_ENV'] ?? 'dev'))) {
umask(0000);
Debug::enable();
}
if ($trustedProxies = $serverParams['TRUSTED_PROXIES'] ?? false) {
Request::setTrustedProxies(explode(',', $trustedProxies),
Request::HEADER_X_FORWARDED_ALL ^ Request::HEADER_X_FORWARDED_HOST);
}
if ($trustedHosts = $serverParams['TRUSTED_HOSTS'] ?? false) {
Request::setTrustedHosts(explode(',', $trustedHosts));
}
$syReq = new Request(
$request->getQueryParams() ?: [],
$request->getParsedBody() ?: [],
$request->getAttributes() ?: [],
$request->getCookieParams(),
$request->getUploadedFiles(),
$serverParams
);
$syResp = $kernel->handle($syReq);
//$response->send();
$kernel->terminate($syReq, $syResp);
return new React\Http\Response(
$syResp->getStatusCode(),
$syResp->headers->all(),
$syResp->getContent(),
$syResp->getProtocolVersion()
);
} catch (\Symfony\Component\HttpKernel\Exception\HttpException $exception) {
return new React\Http\Response(
$exception->getStatusCode(),
$exception->getHeaders(),
$exception->getMessage()
);
} catch (\Throwable $throwable) {
print_r(get_class($throwable));
print_r($throwable->getMessage());
} finally {
echo $i++ . PHP_EOL;
}
return new React\Http\Response(
500,
['Content-Type' => 'text/plain'],
'=>'
);
});
$socket = new React\Socket\Server(8080, $loop);
$server->listen($socket);
echo "Server running at http://127.0.0.1:8080\n";
$loop->run();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment