- Fixed domains not being prepending properly to urls.

- Won't prepend subdomain to urls if subdomain is equal to current host.
- Url: implemented parse function.
- Router: getUrl now parses url to properly parse the subdomain.
This commit is contained in:
Simon
2023-11-27 05:52:10 +01:00
parent a275366a90
commit ed1ed43484
9 changed files with 55 additions and 46 deletions
+8 -8
View File
@@ -130,9 +130,9 @@ class Request
// Check if special IIS header exist, otherwise use default. // Check if special IIS header exist, otherwise use default.
$url = $this->getHeader('unencoded-url'); $url = $this->getHeader('unencoded-url');
if($url !== null){ if ($url !== null) {
$this->setUrl(new Url($url)); $this->setUrl(new Url($url));
}else{ } else {
$this->setUrl(new Url(urldecode((string)$this->getHeader('request-uri')))); $this->setUrl(new Url(urldecode((string)$this->getHeader('request-uri'))));
} }
$this->setContentType((string)$this->getHeader('content-type')); $this->setContentType((string)$this->getHeader('content-type'));
@@ -225,7 +225,7 @@ class Request
public function getIp(bool $safeMode = false): ?string public function getIp(bool $safeMode = false): ?string
{ {
$headers = []; $headers = [];
if($safeMode === false) { if ($safeMode === false) {
$headers = [ $headers = [
'http-cf-connecting-ip', 'http-cf-connecting-ip',
'http-client-ip', 'http-client-ip',
@@ -303,9 +303,9 @@ class Request
*/ */
public function getFirstHeader(array $headers, $defaultValue = null) public function getFirstHeader(array $headers, $defaultValue = null)
{ {
foreach($headers as $header) { foreach ($headers as $header) {
$header = $this->getHeader($header); $header = $this->getHeader($header);
if($header !== null) { if ($header !== null) {
return $header; return $header;
} }
} }
@@ -329,7 +329,7 @@ class Request
*/ */
protected function setContentType(string $contentType): self protected function setContentType(string $contentType): self
{ {
if(strpos($contentType, ';') > 0) { if (strpos($contentType, ';') > 0) {
$this->contentType = strtolower(substr($contentType, 0, strpos($contentType, ';'))); $this->contentType = strtolower(substr($contentType, 0, strpos($contentType, ';')));
} else { } else {
$this->contentType = strtolower($contentType); $this->contentType = strtolower($contentType);
@@ -395,11 +395,11 @@ class Request
{ {
$this->url = $url; $this->url = $url;
if ($this->url->getHost() === null) { if ($this->url->getHost() === null && $this->getHost() !== null) {
$this->url->setHost((string)$this->getHost()); $this->url->setHost((string)$this->getHost());
} }
if($this->isSecure() === true) { if ($this->isSecure() === true) {
$this->url->setScheme('https'); $this->url->setScheme('https');
} }
} }
+9 -1
View File
@@ -67,7 +67,11 @@ class Url implements JsonSerializable
public function __construct(?string $url) public function __construct(?string $url)
{ {
$this->originalUrl = $url; $this->originalUrl = $url;
$this->parse($url, true);
}
public function parse(?string $url, bool $setOriginalPath = false): self
{
if ($url !== null && $url !== '/') { if ($url !== null && $url !== '/') {
$data = $this->parseUrl($url); $data = $this->parseUrl($url);
@@ -79,7 +83,10 @@ class Url implements JsonSerializable
if (isset($data['path']) === true) { if (isset($data['path']) === true) {
$this->setPath($data['path']); $this->setPath($data['path']);
$this->originalPath = $data['path'];
if ($setOriginalPath === true) {
$this->originalPath = $data['path'];
}
} }
$this->fragment = $data['fragment'] ?? null; $this->fragment = $data['fragment'] ?? null;
@@ -88,6 +95,7 @@ class Url implements JsonSerializable
$this->setQueryString($data['query']); $this->setQueryString($data['query']);
} }
} }
return $this;
} }
/** /**
+10 -7
View File
@@ -6,6 +6,7 @@ use Pecee\Http\Middleware\IMiddleware;
use Pecee\Http\Request; use Pecee\Http\Request;
use Pecee\SimpleRouter\Exceptions\HttpException; use Pecee\SimpleRouter\Exceptions\HttpException;
use Pecee\SimpleRouter\Router; use Pecee\SimpleRouter\Router;
use Pecee\SimpleRouter\SimpleRouter;
abstract class LoadableRoute extends Route implements ILoadableRoute abstract class LoadableRoute extends Route implements ILoadableRoute
{ {
@@ -138,12 +139,6 @@ abstract class LoadableRoute extends Route implements ILoadableRoute
{ {
$url = $this->getUrl(); $url = $this->getUrl();
$group = $this->getGroup();
if ($group !== null && count($group->getDomains()) !== 0) {
$url = '//' . $group->getDomains()[0] . $url;
}
/* Create the param string - {parameter} */ /* Create the param string - {parameter} */
$param1 = $this->paramModifiers[0] . '%s' . $this->paramModifiers[1]; $param1 = $this->paramModifiers[0] . '%s' . $this->paramModifiers[1];
@@ -177,7 +172,15 @@ abstract class LoadableRoute extends Route implements ILoadableRoute
} }
} }
return rtrim('/' . ltrim($url, '/'), '/') . '/'; $url = rtrim('/' . ltrim($url, '/'), '/') . '/';
$group = $this->getGroup();
if ($group !== null && count($group->getDomains()) !== 0 && SimpleRouter::request()->getHost() !== $group->getDomains()[0]) {
$url = '//' . $group->getDomains()[0] . $url;
}
return $url;
} }
/** /**
@@ -3,6 +3,7 @@
namespace Pecee\SimpleRouter\Route; namespace Pecee\SimpleRouter\Route;
use Pecee\Http\Request; use Pecee\Http\Request;
use Pecee\SimpleRouter\SimpleRouter;
class RouteController extends LoadableRoute implements IControllerRoute class RouteController extends LoadableRoute implements IControllerRoute
{ {
@@ -77,13 +78,15 @@ class RouteController extends LoadableRoute implements IControllerRoute
$group = $this->getGroup(); $group = $this->getGroup();
if ($group !== null && count($group->getDomains()) !== 0) {
$url .= '//' . $group->getDomains()[0];
}
$url .= '/' . trim($this->getUrl(), '/') . '/' . strtolower((string)$method) . implode('/', $parameters); $url .= '/' . trim($this->getUrl(), '/') . '/' . strtolower((string)$method) . implode('/', $parameters);
return '/' . trim($url, '/') . '/'; $url = '/' . trim($url, '/') . '/';
if ($group !== null && count($group->getDomains()) !== 0 && SimpleRouter::request()->getHost() !== $group->getDomains()[0]) {
$url = '//' . $group->getDomains()[0] . $url;
}
return $url;
} }
public function matchRoute(string $url, Request $request): bool public function matchRoute(string $url, Request $request): bool
+1 -1
View File
@@ -220,7 +220,7 @@ class RouteGroup extends Route implements IGroupRoute
$this->setExceptionHandlers((array)$settings['exceptionHandler']); $this->setExceptionHandlers((array)$settings['exceptionHandler']);
} }
if ($merge === false && isset($settings['domain']) === true) { if (isset($settings['domain']) === true) {
$this->setDomains((array)$settings['domain']); $this->setDomains((array)$settings['domain']);
} }
@@ -3,6 +3,7 @@
namespace Pecee\SimpleRouter\Route; namespace Pecee\SimpleRouter\Route;
use Pecee\Http\Request; use Pecee\Http\Request;
use Pecee\SimpleRouter\SimpleRouter;
class RouteResource extends LoadableRoute implements IControllerRoute class RouteResource extends LoadableRoute implements IControllerRoute
{ {
@@ -80,7 +81,14 @@ class RouteResource extends LoadableRoute implements IControllerRoute
return rtrim($this->url . $parametersUrl . $this->urls[$url], '/') . '/'; return rtrim($this->url . $parametersUrl . $this->urls[$url], '/') . '/';
} }
return $this->url . $parametersUrl; $url = $this->url . $parametersUrl;
$group = $this->getGroup();
if ($group !== null && count($group->getDomains()) !== 0 && SimpleRouter::request()->getHost() !== $group->getDomains()[0]) {
$url = '//' . $group->getDomains()[0] . $url;
}
return $url;
} }
protected function call($method): bool protected function call($method): bool
+5 -20
View File
@@ -691,10 +691,7 @@ class Router
/* If nothing is defined and a route is loaded we use that */ /* If nothing is defined and a route is loaded we use that */
if ($name === null && $loadedRoute !== null) { if ($name === null && $loadedRoute !== null) {
return $this->request return $this->request->getUrlCopy()->parse($loadedRoute->findUrl($loadedRoute->getMethod(), $parameters, $name))->setParams($getParams);
->getUrlCopy()
->setPath($loadedRoute->findUrl($loadedRoute->getMethod(), $parameters, $name))
->setParams($getParams);
} }
if ($name !== null) { if ($name !== null) {
@@ -702,10 +699,7 @@ class Router
$route = $this->findRoute($name); $route = $this->findRoute($name);
if ($route !== null) { if ($route !== null) {
return $this->request return $this->request->getUrlCopy()->parse($route->findUrl($route->getMethod(), $parameters, $name))->setParams($getParams);
->getUrlCopy()
->setPath($route->findUrl($route->getMethod(), $parameters, $name))
->setParams($getParams);
} }
} }
@@ -720,18 +714,12 @@ class Router
/* Check if the route contains the name/alias */ /* Check if the route contains the name/alias */
if ($processedRoute->hasName($controller) === true) { if ($processedRoute->hasName($controller) === true) {
return $this->request return $this->request->getUrlCopy()->parse($processedRoute->findUrl($method, $parameters, $name))->setParams($getParams);
->getUrlCopy()
->setPath($processedRoute->findUrl($method, $parameters, $name))
->setParams($getParams);
} }
/* Check if the route controller is equal to the name */ /* Check if the route controller is equal to the name */
if ($processedRoute instanceof IControllerRoute && strtolower($processedRoute->getController()) === strtolower($controller)) { if ($processedRoute instanceof IControllerRoute && strtolower($processedRoute->getController()) === strtolower($controller)) {
return $this->request return $this->request->getUrlCopy()->parse($processedRoute->findUrl($method, $parameters, $name))->setParams($getParams);
->getUrlCopy()
->setPath($processedRoute->findUrl($method, $parameters, $name))
->setParams($getParams);
} }
} }
@@ -741,10 +729,7 @@ class Router
$url = trim(implode('/', array_merge((array)$name, (array)$parameters)), '/'); $url = trim(implode('/', array_merge((array)$name, (array)$parameters)), '/');
$url = (($url === '') ? '/' : '/' . $url . '/'); $url = (($url === '') ? '/' : '/' . $url . '/');
return $this->request return $this->request->getUrlCopy()->parse($url)->setParams($getParams);
->getUrlCopy()
->setPath($url)
->setParams($getParams);
} }
/** /**
@@ -94,11 +94,13 @@ class RouterUrlTest extends \PHPUnit\Framework\TestCase
public function testSimilarUrls() public function testSimilarUrls()
{ {
TestRouter::reset();
// Match normal route on alias // Match normal route on alias
TestRouter::get('/url11', 'DummyController@method1'); TestRouter::get('/url11', 'DummyController@method1');
TestRouter::get('/url22', 'DummyController@method2'); TestRouter::get('/url22', 'DummyController@method2');
TestRouter::get('/url33', 'DummyController@method2')->name('match'); TestRouter::get('/url33', 'DummyController@method2')->name('match');
TestRouter::debugNoReset('/url33', 'get'); TestRouter::debugNoReset('/url33', 'get');
$this->assertEquals(TestRouter::getUrl('match'), TestRouter::getUrl()); $this->assertEquals(TestRouter::getUrl('match'), TestRouter::getUrl());
+1 -1
View File
@@ -17,7 +17,7 @@ class TestRouter extends \Pecee\SimpleRouter\SimpleRouter
{ {
$request = static::request(); $request = static::request();
$request->setUrl((new \Pecee\Http\Url($testUrl))->setHost('local.unitTest')); $request->setUrl((new \Pecee\Http\Url($testUrl)));
$request->setMethod($testMethod); $request->setMethod($testMethod);
static::start(); static::start();