Skip to content

Commit 70a3a02

Browse files
authored
Merge pull request #13 from weierophinney/feature/catch-uri-errors
Treat PSR-7 request conversions as route failures
2 parents a9e7352 + dcd3efb commit 70a3a02

5 files changed

+50
-11
lines changed

.laminas-ci.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{
22
"ignore_php_platform_requirements": {
3-
"8.1": true
3+
"8.0": false,
4+
"8.1": false
45
}
56
}

composer.json

+4-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@
2020
"forum": "https://discourse.laminas.dev"
2121
},
2222
"config": {
23-
"sort-packages": true
23+
"sort-packages": true,
24+
"allow-plugins": {
25+
"dealerdirect/phpcodesniffer-composer-installer": true
26+
}
2427
},
2528
"extra": {
2629
"laminas": {

phpunit.xml.dist

+13-7
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
1-
<phpunit bootstrap="./vendor/autoload.php" colors="true">
1+
<?xml version="1.0"?>
2+
<phpunit
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
5+
bootstrap="./vendor/autoload.php"
6+
colors="true"
7+
convertDeprecationsToExceptions="true" >
8+
<coverage processUncoveredFiles="true">
9+
<include>
10+
<directory suffix=".php">src</directory>
11+
</include>
12+
</coverage>
13+
214
<testsuites>
315
<testsuite name="Mezzio laminas-mvc Router Tests">
416
<directory>./test</directory>
517
</testsuite>
618
</testsuites>
7-
8-
<filter>
9-
<whitelist processUncoveredFilesFromWhitelist="true">
10-
<directory suffix=".php">src</directory>
11-
</whitelist>
12-
</filter>
1319
</phpunit>

src/LaminasRouter.php

+13-2
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44

55
namespace Mezzio\Router;
66

7+
use Laminas\Http\Exception\InvalidArgumentException;
78
use Laminas\Psr7Bridge\Psr7ServerRequest;
89
use Laminas\Router\Http\TreeRouteStack;
910
use Laminas\Router\RouteMatch;
11+
use Laminas\Uri\Exception\InvalidUriPartException;
1012
use Psr\Http\Message\ServerRequestInterface as PsrRequest;
1113

1214
use function array_key_exists;
@@ -82,8 +84,17 @@ public function match(PsrRequest $request): RouteResult
8284
// Must inject routes prior to matching.
8385
$this->injectRoutes();
8486

85-
$laminasRequest = Psr7ServerRequest::toLaminas($request, true);
86-
$match = $this->laminasRouter->match($laminasRequest);
87+
try {
88+
$laminasRequest = Psr7ServerRequest::toLaminas($request, true);
89+
} catch (InvalidArgumentException $e) {
90+
$previous = $e->getPrevious();
91+
if ($previous instanceof InvalidUriPartException) {
92+
return RouteResult::fromRouteFailure(null);
93+
}
94+
throw $e;
95+
}
96+
97+
$match = $this->laminasRouter->match($laminasRequest);
8798

8899
if (null === $match) {
89100
// No route matched at all; to indicate that it's not due to the

test/LaminasRouterTest.php

+18
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Closure;
88
use Fig\Http\Message\RequestMethodInterface as RequestMethod;
99
use Laminas\Diactoros\ServerRequest;
10+
use Laminas\Diactoros\Uri;
1011
use Laminas\Http\Request as LaminasRequest;
1112
use Laminas\I18n\Translator\TranslatorInterface;
1213
use Laminas\Psr7Bridge\Psr7ServerRequest;
@@ -560,4 +561,21 @@ public function testGenerateUriRaisesExceptionForNotFoundRoute(): void
560561
$this->expectExceptionMessage('route not found');
561562
$router->generateUri('foo');
562563
}
564+
565+
public function testMatchReturnsRouteFailureOnFailureToConvertPsr7Request(): void
566+
{
567+
$route = new Route('/some/path', $this->getMiddleware(), [RequestMethod::METHOD_GET], 'test');
568+
569+
$router = new LaminasRouter();
570+
$router->addRoute($route);
571+
572+
$serverRequest = (new ServerRequest())
573+
->withUri(new Uri('https://${ip}/some/path'))
574+
->withHeader('Host', '${ip}')
575+
->withHeader('Accept', 'application/json');
576+
577+
$result = $router->match($serverRequest);
578+
579+
$this->assertTrue($result->isFailure());
580+
}
563581
}

0 commit comments

Comments
 (0)