<?php
namespace App\Events;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\RequestContextAwareInterface;
use Symfony\Component\HttpFoundation;
/**
* Set host when Ngrok is used as reverse proxy
*/
class NGrokAwareRequestContext implements EventSubscriberInterface
{
const SCHEME_HTTP = 'http';
const SCHEME_HTTPS = 'https';
const NGROK_DOMAIN = '.ngrok.io';
/**
* @var RequestContextAwareInterface
*/
private $router;
/**
* @param RequestContextAwareInterface $router
*/
public function __construct(RequestContextAwareInterface $router)
{
$this->router = $router;
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents()
{
return [KernelEvents::REQUEST => 'onRequest'];
}
/**
* @param GetResponseEvent $event
*/
public function onRequest(GetResponseEvent $event)
{
if (!$event->isMasterRequest()) {
return;
}
$request = $event->getRequest();
$host = $this->getHost($request);
$scheme = $this->getScheme($request);
$router_context = $this->router->getContext();
$router_context->setHost($host);
$router_context->setScheme($scheme);
}
/**
* Get Ngrok Domain/Hostname or fallback to the default Host
*
* @param Request $request
* @return string
*/
public function getHost($request)
{
// if using ngrok, rewrite the host to be the original host, and not ngrok.io
// so that the request can be mapped to a virtual server on apache
$original_host = $this->getServer($request, 'HTTP_X_ORIGINAL_HOST');
$http_host = $this->getServer($request, 'HTTP_HOST');
$ngrokDomain = $original_host ?: $http_host;
$useHost = stripos($ngrokDomain, self::NGROK_DOMAIN) == false ? $http_host : $ngrokDomain;
return $useHost;
}
/**
* Get the forwarded scheme or fallback to default scheme
*
* @param Request $request
* @return string
*/
public function getScheme($request)
{
$forwarded_proto = $this->getServer($request, 'HTTP_X_FORWARDED_PROTO');
$default_scheme = $this->getServer($request, 'REQUEST_SCHEME');
return $forwarded_proto ?: $default_scheme;
}
/**
* Get server parameter value by key
*
* @param string $key
* @return string
*/
protected function getServer($request, $key)
{
return $request->server->get($key, '');
}
}