Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 7baeaa2

Browse filesBrowse files
committed
Merge branch '2.4'
* 2.4: [Process] minor fixes Improve performance of getNextEmbedBlock by removing unnecessary preg_match and function calls. Avoid unnecessary line indentation calculation. Optimise Inline::evaluateScalar() for parsing strings. fixed CS fixed parsing Mongo DSN and added Test for it () is also a valid delimiter Adding PHP 5.6 to travis-ci tests Update BCryptPasswordEncoder.php [Validator] Removed PHP <5.3.3 specific code which is not officially supported. Fixed wrong redirect url if path contains some query parameters
2 parents a820930 + 81e27d2 commit 7baeaa2
Copy full SHA for 7baeaa2

File tree

Expand file treeCollapse file tree

11 files changed

+177
-68
lines changed
Filter options
Expand file treeCollapse file tree

11 files changed

+177
-68
lines changed

‎.travis.yml

Copy file name to clipboardExpand all lines: .travis.yml
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ php:
55
- 5.3
66
- 5.4
77
- 5.5
8+
- 5.6
89
- hhvm
910

1011
matrix:

‎src/Symfony/Bundle/FrameworkBundle/Controller/RedirectController.php

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/FrameworkBundle/Controller/RedirectController.php
+5-1Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,11 @@ public function urlRedirectAction(Request $request, $path, $permanent = false, $
100100

101101
$qs = $request->getQueryString();
102102
if ($qs) {
103-
$qs = '?'.$qs;
103+
if (strpos($path, '?') === false) {
104+
$qs = '?'.$qs;
105+
} else {
106+
$qs = '&'.$qs;
107+
}
104108
}
105109

106110
$port = '';

‎src/Symfony/Bundle/FrameworkBundle/Tests/Controller/RedirectControllerTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/FrameworkBundle/Tests/Controller/RedirectControllerTest.php
+34-1Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,36 @@ public function testUrlRedirect($scheme, $httpPort, $httpsPort, $requestScheme,
199199
$this->assertRedirectUrl($returnValue, $expectedUrl);
200200
}
201201

202-
private function createRequestObject($scheme, $host, $port, $baseUrl)
202+
public function pathQueryParamsProvider()
203+
{
204+
return array(
205+
array('http://www.example.com/base/redirect-path', '/redirect-path', ''),
206+
array('http://www.example.com/base/redirect-path?foo=bar', '/redirect-path?foo=bar', ''),
207+
array('http://www.example.com/base/redirect-path?foo=bar', '/redirect-path', 'foo=bar'),
208+
array('http://www.example.com/base/redirect-path?foo=bar&abc=example', '/redirect-path?foo=bar', 'abc=example'),
209+
array('http://www.example.com/base/redirect-path?foo=bar&abc=example&baz=def', '/redirect-path?foo=bar', 'abc=example&baz=def'),
210+
);
211+
}
212+
213+
/**
214+
* @dataProvider pathQueryParamsProvider
215+
*/
216+
public function testPathQueryParams($expectedUrl, $path, $queryString)
217+
{
218+
$scheme = 'http';
219+
$host = 'www.example.com';
220+
$baseUrl = '/base';
221+
$port = 80;
222+
223+
$request = $this->createRequestObject($scheme, $host, $port, $baseUrl, $queryString);
224+
225+
$controller = $this->createRedirectController();
226+
227+
$returnValue = $controller->urlRedirectAction($request, $path, false, $scheme, $port, null);
228+
$this->assertRedirectUrl($returnValue, $expectedUrl);
229+
}
230+
231+
private function createRequestObject($scheme, $host, $port, $baseUrl, $queryString = '')
203232
{
204233
$request = $this->getMock('Symfony\Component\HttpFoundation\Request');
205234
$request
@@ -218,6 +247,10 @@ private function createRequestObject($scheme, $host, $port, $baseUrl)
218247
->expects($this->any())
219248
->method('getBaseUrl')
220249
->will($this->returnValue($baseUrl));
250+
$request
251+
->expects($this->any())
252+
->method('getQueryString')
253+
->will($this->returnValue($queryString));
221254

222255
return $request;
223256
}

‎src/Symfony/Component/Finder/Expression/Regex.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Finder/Expression/Regex.php
+5-1Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,11 @@ public static function create($expr)
6565
$start = substr($m[1], 0, 1);
6666
$end = substr($m[1], -1);
6767

68-
if (($start === $end && !preg_match('/[*?[:alnum:] \\\\]/', $start)) || ($start === '{' && $end === '}')) {
68+
if (
69+
($start === $end && !preg_match('/[*?[:alnum:] \\\\]/', $start))
70+
|| ($start === '{' && $end === '}')
71+
|| ($start === '(' && $end === ')')
72+
) {
6973
return new self(substr($m[1], 1, -1), $m[2], $end);
7074
}
7175
}

‎src/Symfony/Component/HttpKernel/Profiler/MongoDbProfilerStorage.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/HttpKernel/Profiler/MongoDbProfilerStorage.php
+34-13Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -99,21 +99,19 @@ public function write(Profile $profile)
9999
*/
100100
protected function getMongo()
101101
{
102-
if ($this->mongo === null) {
103-
if (preg_match('#^(mongodb://.*)/(.*)/(.*)$#', $this->dsn, $matches)) {
104-
$server = $matches[1].(!empty($matches[2]) ? '/'.$matches[2] : '');
105-
$database = $matches[2];
106-
$collection = $matches[3];
107-
108-
$mongoClass = (version_compare(phpversion('mongo'), '1.3.0', '<')) ? '\Mongo' : '\MongoClient';
109-
$mongo = new $mongoClass($server);
110-
$this->mongo = $mongo->selectCollection($database, $collection);
111-
} else {
112-
throw new \RuntimeException(sprintf('Please check your configuration. You are trying to use MongoDB with an invalid dsn "%s". The expected format is "mongodb://[user:pass@]host/database/collection"', $this->dsn));
113-
}
102+
if (null !== $this->mongo) {
103+
return $this->mongo;
104+
}
105+
106+
if (!$parsedDsn = $this->parseDsn($this->dsn)) {
107+
throw new \RuntimeException(sprintf('Please check your configuration. You are trying to use MongoDB with an invalid dsn "%s". The expected format is "mongodb://[user:pass@]host/database/collection"', $this->dsn));
114108
}
115109

116-
return $this->mongo;
110+
list($server, $database, $collection) = $parsedDsn;
111+
$mongoClass = version_compare(phpversion('mongo'), '1.3.0', '<') ? '\Mongo' : '\MongoClient';
112+
$mongo = new $mongoClass($server);
113+
114+
return $this->mongo = $mongo->selectCollection($database, $collection);
117115
}
118116

119117
/**
@@ -233,4 +231,27 @@ private function getProfile(array $data)
233231

234232
return $profile;
235233
}
234+
235+
/**
236+
* @param string $dsn
237+
*
238+
* @return null|array Array($server, $database, $collection)
239+
*/
240+
private function parseDsn($dsn)
241+
{
242+
if (!preg_match('#^(mongodb://.*)/(.*)/(.*)$#', $dsn, $matches)) {
243+
return;
244+
}
245+
246+
$server = $matches[1];
247+
$database = $matches[2];
248+
$collection = $matches[3];
249+
preg_match('#^mongodb://(([^:]+):?(.*)(?=@))?@?([^/]*)(.*)$#', $server, $matchesServer);
250+
251+
if ('' == $matchesServer[5] && '' != $matches[2]) {
252+
$server .= '/'.$matches[2];
253+
}
254+
255+
return array($server, $database, $collection);
256+
}
236257
}

‎src/Symfony/Component/HttpKernel/Tests/Profiler/MongoDbProfilerStorageTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/HttpKernel/Tests/Profiler/MongoDbProfilerStorageTest.php
+37Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,32 @@ public static function tearDownAfterClass()
7171
}
7272
}
7373

74+
public function getDsns()
75+
{
76+
return array(
77+
array('mongodb://localhost/symfony_tests/profiler_data', array(
78+
'mongodb://localhost/symfony_tests',
79+
'symfony_tests',
80+
'profiler_data'
81+
)),
82+
array('mongodb://user:password@localhost/symfony_tests/profiler_data', array(
83+
'mongodb://user:password@localhost/symfony_tests',
84+
'symfony_tests',
85+
'profiler_data'
86+
)),
87+
array('mongodb://user:password@localhost/admin/symfony_tests/profiler_data', array(
88+
'mongodb://user:password@localhost/admin',
89+
'symfony_tests',
90+
'profiler_data'
91+
)),
92+
array('mongodb://user:password@localhost:27009,localhost:27010/?replicaSet=rs-name&authSource=admin/symfony_tests/profiler_data', array(
93+
'mongodb://user:password@localhost:27009,localhost:27010/?replicaSet=rs-name&authSource=admin',
94+
'symfony_tests',
95+
'profiler_data'
96+
))
97+
);
98+
}
99+
74100
public function testCleanup()
75101
{
76102
$dt = new \DateTime('-2 day');
@@ -87,6 +113,17 @@ public function testCleanup()
87113
self::$storage->purge();
88114
}
89115

116+
/**
117+
* @dataProvider getDsns
118+
*/
119+
public function testDsnParser($dsn, $expected)
120+
{
121+
$m = new \ReflectionMethod(self::$storage, 'parseDsn');
122+
$m->setAccessible(true);
123+
124+
$this->assertEquals($expected, $m->invoke(self::$storage, $dsn));
125+
}
126+
90127
public function testUtf8()
91128
{
92129
$profile = new Profile('utf8_test_profile');

‎src/Symfony/Component/Process/Process.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Process/Process.php
+4-1Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -911,7 +911,9 @@ public function getEnv()
911911
public function setEnv(array $env)
912912
{
913913
// Process can not handle env values that are arrays
914-
$env = array_filter($env, function ($value) { if (!is_array($value)) { return true; } });
914+
$env = array_filter($env, function ($value) {
915+
return !is_array($value);
916+
});
915917

916918
$this->env = array();
917919
foreach ($env as $key => $value) {
@@ -1190,6 +1192,7 @@ private function validateTimeout($timeout)
11901192
* Reads pipes, executes callback.
11911193
*
11921194
* @param Boolean $blocking Whether to use blocking calls or not.
1195+
* @param Boolean $close Whether to close file handles or not.
11931196
*/
11941197
private function readPipes($blocking, $close)
11951198
{

‎src/Symfony/Component/Process/ProcessPipes.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Process/ProcessPipes.php
+4-1Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public function unblock()
7979
public function close()
8080
{
8181
$this->closeUnixPipes();
82-
foreach ($this->fileHandles as $offset => $handle) {
82+
foreach ($this->fileHandles as $handle) {
8383
fclose($handle);
8484
}
8585
$this->fileHandles = array();
@@ -227,6 +227,8 @@ public function write($blocking, $stdin)
227227
/**
228228
* Reads data in file handles.
229229
*
230+
* @param Boolean $close Whether to close file handles or not.
231+
*
230232
* @return array An array of read data indexed by their fd.
231233
*/
232234
private function readFileHandles($close = false)
@@ -262,6 +264,7 @@ private function readFileHandles($close = false)
262264
* Reads data in file pipes streams.
263265
*
264266
* @param Boolean $blocking Whether to use blocking calls or not.
267+
* @param Boolean $close Whether to close file handles or not.
265268
*
266269
* @return array An array of read data indexed by their fd.
267270
*/

‎src/Symfony/Component/Security/Core/Encoder/BCryptPasswordEncoder.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Security/Core/Encoder/BCryptPasswordEncoder.php
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class BCryptPasswordEncoder extends BasePasswordEncoder
2929
*
3030
* @param integer $cost The algorithmic cost that should be used
3131
*
32+
* @throws \RuntimeException When no BCrypt encoder is available
3233
* @throws \InvalidArgumentException if cost is out of range
3334
*/
3435
public function __construct($cost)

‎src/Symfony/Component/Yaml/Inline.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Yaml/Inline.php
+43-39Lines changed: 43 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -386,51 +386,55 @@ private static function parseMapping($mapping, &$i = 0)
386386
private static function evaluateScalar($scalar)
387387
{
388388
$scalar = trim($scalar);
389-
389+
$scalarLower = strtolower($scalar);
390390
switch (true) {
391-
case 'null' == strtolower($scalar):
391+
case 'null' == $scalarLower:
392392
case '' == $scalar:
393393
case '~' == $scalar:
394394
return null;
395-
case 0 === strpos($scalar, '!str'):
396-
return (string) substr($scalar, 5);
397-
case 0 === strpos($scalar, '! '):
398-
return intval(self::parseScalar(substr($scalar, 2)));
399-
case 0 === strpos($scalar, '!!php/object:'):
400-
if (self::$objectSupport) {
401-
return unserialize(substr($scalar, 13));
402-
}
403-
404-
if (self::$exceptionOnInvalidType) {
405-
throw new ParseException('Object support when parsing a YAML file has been disabled.');
406-
}
407-
408-
return null;
409-
case ctype_digit($scalar):
410-
$raw = $scalar;
411-
$cast = intval($scalar);
412-
413-
return '0' == $scalar[0] ? octdec($scalar) : (((string) $raw == (string) $cast) ? $cast : $raw);
414-
case '-' === $scalar[0] && ctype_digit(substr($scalar, 1)):
415-
$raw = $scalar;
416-
$cast = intval($scalar);
417-
418-
return '0' == $scalar[1] ? octdec($scalar) : (((string) $raw == (string) $cast) ? $cast : $raw);
419-
case 'true' === strtolower($scalar):
395+
case 'true' === $scalarLower:
420396
return true;
421-
case 'false' === strtolower($scalar):
397+
case 'false' === $scalarLower:
422398
return false;
423-
case is_numeric($scalar):
424-
return '0x' == $scalar[0].$scalar[1] ? hexdec($scalar) : floatval($scalar);
425-
case 0 == strcasecmp($scalar, '.inf'):
426-
case 0 == strcasecmp($scalar, '.NaN'):
427-
return -log(0);
428-
case 0 == strcasecmp($scalar, '-.inf'):
429-
return log(0);
430-
case preg_match('/^(-|\+)?[0-9,]+(\.[0-9]+)?$/', $scalar):
431-
return floatval(str_replace(',', '', $scalar));
432-
case preg_match(self::getTimestampRegex(), $scalar):
433-
return strtotime($scalar);
399+
// Optimise for returning strings.
400+
case $scalar[0] === '+' || $scalar[0] === '-' || $scalar[0] === '.' || $scalar[0] === '!' || is_numeric($scalar[0]):
401+
switch (true) {
402+
case 0 === strpos($scalar, '!str'):
403+
return (string) substr($scalar, 5);
404+
case 0 === strpos($scalar, '! '):
405+
return intval(self::parseScalar(substr($scalar, 2)));
406+
case 0 === strpos($scalar, '!!php/object:'):
407+
if (self::$objectSupport) {
408+
return unserialize(substr($scalar, 13));
409+
}
410+
411+
if (self::$exceptionOnInvalidType) {
412+
throw new ParseException('Object support when parsing a YAML file has been disabled.');
413+
}
414+
415+
return null;
416+
case ctype_digit($scalar):
417+
$raw = $scalar;
418+
$cast = intval($scalar);
419+
420+
return '0' == $scalar[0] ? octdec($scalar) : (((string) $raw == (string) $cast) ? $cast : $raw);
421+
case '-' === $scalar[0] && ctype_digit(substr($scalar, 1)):
422+
$raw = $scalar;
423+
$cast = intval($scalar);
424+
425+
return '0' == $scalar[1] ? octdec($scalar) : (((string) $raw == (string) $cast) ? $cast : $raw);
426+
case is_numeric($scalar):
427+
return '0x' == $scalar[0].$scalar[1] ? hexdec($scalar) : floatval($scalar);
428+
case 0 == strcasecmp($scalar, '.inf'):
429+
case 0 == strcasecmp($scalar, '.NaN'):
430+
return -log(0);
431+
case 0 == strcasecmp($scalar, '-.inf'):
432+
return log(0);
433+
case preg_match('/^(-|\+)?[0-9,]+(\.[0-9]+)?$/', $scalar):
434+
return floatval(str_replace(',', '', $scalar));
435+
case preg_match(self::getTimestampRegex(), $scalar):
436+
return strtotime($scalar);
437+
}
434438
default:
435439
return (string) $scalar;
436440
}

‎src/Symfony/Component/Yaml/Parser.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Yaml/Parser.php
+9-11Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,9 @@ private function getNextEmbedBlock($indentation = null)
312312
$removeComments = !preg_match($removeCommentsPattern, $this->currentLine);
313313

314314
while ($this->moveToNextLine()) {
315-
if ($this->getCurrentLineIndentation() === $newIndent) {
315+
$indent = $this->getCurrentLineIndentation();
316+
317+
if ($indent === $newIndent) {
316318
$removeComments = !preg_match($removeCommentsPattern, $this->currentLine);
317319
}
318320

@@ -321,20 +323,16 @@ private function getNextEmbedBlock($indentation = null)
321323
break;
322324
}
323325

324-
if ($removeComments && $this->isCurrentLineEmpty() || $this->isCurrentLineBlank()) {
325-
if ($this->isCurrentLineBlank()) {
326-
$data[] = substr($this->currentLine, $newIndent);
327-
}
328-
326+
if ($this->isCurrentLineBlank()) {
327+
$data[] = substr($this->currentLine, $newIndent);
329328
continue;
330329
}
331330

332-
$indent = $this->getCurrentLineIndentation();
331+
if ($removeComments && $this->isCurrentLineComment()) {
332+
continue;
333+
}
333334

334-
if (preg_match('#^(?P<text> *)$#', $this->currentLine, $match)) {
335-
// empty line
336-
$data[] = $match['text'];
337-
} elseif ($indent >= $newIndent) {
335+
if ($indent >= $newIndent) {
338336
$data[] = substr($this->currentLine, $newIndent);
339337
} elseif (0 == $indent) {
340338
$this->moveToPreviousLine();

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.