engelsystem/src/Http/RequestServiceProvider.php

97 lines
3.0 KiB
PHP
Raw Normal View History

<?php
namespace Engelsystem\Http;
use Engelsystem\Config\Config;
use Engelsystem\Container\ServiceProvider;
use Illuminate\Support\Str;
2018-09-02 02:09:56 +02:00
use Symfony\Component\HttpFoundation\Request as SymfonyRequest;
class RequestServiceProvider extends ServiceProvider
{
/** @var array */
protected array $appUrl;
public function register()
{
/** @var Config $config */
2018-08-13 16:30:27 +02:00
$config = $this->app->get('config');
$trustedProxies = $config->get('trusted_proxies', []);
$this->appUrl = parse_url($config->get('url') ?: '');
2018-08-13 16:30:27 +02:00
if (!is_array($trustedProxies)) {
$trustedProxies = empty($trustedProxies) ? [] : explode(',', preg_replace('~\s+~', '', $trustedProxies));
}
if (!empty($this->appUrl['path'])) {
Request::setFactory([$this, 'createRequestWithoutPrefix']);
}
2018-08-13 16:30:27 +02:00
/** @var Request $request */
$request = $this->app->call([Request::class, 'createFromGlobals']);
2018-08-13 16:30:27 +02:00
$this->setTrustedProxies($request, $trustedProxies);
2018-09-23 19:13:19 +02:00
2018-09-02 02:09:56 +02:00
$this->app->instance(Request::class, $request);
$this->app->instance(SymfonyRequest::class, $request);
$this->app->instance('request', $request);
}
2018-08-13 16:30:27 +02:00
/**
* @param array $query GET parameters
* @param array $request POST parameters
* @param array $attributes Additional data
* @param array $cookies Cookies
* @param array $files Uploaded files
* @param array $server Server env
* @param mixed $content Request content
* @return Request
*/
public function createRequestWithoutPrefix(
array $query = [],
array $request = [],
array $attributes = [],
array $cookies = [],
array $files = [],
array $server = [],
$content = null
): Request {
if (
!empty($this->appUrl['path'])
&& !empty($server['REQUEST_URI'])
&& Str::startsWith($server['REQUEST_URI'], $this->appUrl['path'])
) {
$requestUri = Str::substr(
$server['REQUEST_URI'],
Str::length(rtrim($this->appUrl['path'], '/'))
);
// Reset paths which only contain the app path
if ($requestUri && !Str::startsWith($requestUri, '/')) {
$requestUri = $server['REQUEST_URI'];
}
$server['REQUEST_URI'] = $requestUri ?: '/';
}
return new Request($query, $request, $attributes, $cookies, $files, $server, $content);
}
2018-08-13 16:30:27 +02:00
/**
* Set the trusted Proxies
*
* Required for unit tests (static methods can't be mocked)
*
* @param Request $request
* @param array $proxies
* @param int $trustedHeadersSet
* @codeCoverageIgnore
*/
protected function setTrustedProxies(
$request,
$proxies,
$trustedHeadersSet = Request::HEADER_FORWARDED | Request::HEADER_X_FORWARDED_TRAEFIK
2018-08-13 16:30:27 +02:00
) {
$request->setTrustedProxies($proxies, $trustedHeadersSet);
}
}