Skip to content

Commit e8350c4

Browse files
committed
RequestFactory: optimized script path detection performance
1 parent e9dd988 commit e8350c4

File tree

2 files changed

+26
-5
lines changed

2 files changed

+26
-5
lines changed

src/Http/RequestFactory.php

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -113,16 +113,17 @@ public function createHttpRequest()
113113
$script = '/';
114114
}
115115

116-
$path = strtolower($url->getPath()) . '/';
117-
$script = strtolower($script) . '/';
116+
$path = $url->getPath();
118117
$max = min(strlen($path), strlen($script));
119118
for ($i = 0; $i < $max; $i++) {
120-
if ($path[$i] !== $script[$i]) {
119+
if ($path[$i] !== $script[$i] && strcasecmp($path[$i], $script[$i])) {
121120
break;
122-
} elseif ($path[$i] === '/') {
123-
$url->setScriptPath(substr($url->getPath(), 0, $i + 1));
124121
}
125122
}
123+
$url->setScriptPath($i === $max && strlen($path) === strlen($script)
124+
? $path
125+
: substr($path, 0, strrpos($path, '/', $i - $max - 1) + 1)
126+
);
126127

127128
// GET, POST, COOKIE
128129
$useFilter = (!in_array(ini_get('filter.default'), array('', 'unsafe_raw')) || ini_get('filter.default_flags'));

tests/Http/RequestFactory.scriptPath.phpt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,23 @@ test(function() use ($factory) {
5555

5656
Assert::same( '/www/', $factory->createHttpRequest()->getUrl()->getScriptPath() );
5757
});
58+
59+
60+
test(function() use ($factory) {
61+
$_SERVER = array(
62+
'REQUEST_URI' => '/test/in',
63+
'SCRIPT_NAME' => '/test/index.php',
64+
);
65+
66+
Assert::same( '/test/', $factory->createHttpRequest()->getUrl()->getScriptPath() );
67+
});
68+
69+
70+
test(function() use ($factory) {
71+
$_SERVER = array(
72+
'REQUEST_URI' => '/test//',
73+
'SCRIPT_NAME' => '/test/index.php',
74+
);
75+
76+
Assert::same( '/test/', $factory->createHttpRequest()->getUrl()->getScriptPath() );
77+
});

0 commit comments

Comments
 (0)