Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 77ec799

Browse files
committed
Merge branch '2.2'
* 2.2: #7106 - fix for ZTS builds Added '@@' escaping strategy for YamlFileLoader and YamlDumper [Yaml] fixed bugs with folded scalar parsing [Form] made DefaultCsrfProvider using session_status() when available Added unit tests to Dumper Update .travis.yml (closes #7355) [HttpFoudantion] fixed Request::getPreferredLanguage() Revert "merged branch jfsimon/issue-6928 (PR #7378)" Routing issue with installation in a sub-directory ref: #7129
2 parents a045925 + 03fc97d commit 77ec799

File tree

17 files changed

+270
-100
lines changed

17 files changed

+270
-100
lines changed

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ matrix:
1212

1313
before_script:
1414
- echo '' > ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/xdebug.ini
15+
- echo "extension = apc.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini
1516
- COMPOSER_ROOT_VERSION=dev-master composer --prefer-source --dev install
1617
- php src/Symfony/Component/Locale/Resources/data/build-data.php
1718
- export USE_INTL_ICU_DATA_VERSION=1

src/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ private function prepareParameters($parameters, $escape = true)
260260
foreach ($parameters as $key => $value) {
261261
if (is_array($value)) {
262262
$value = $this->prepareParameters($value, $escape);
263-
} elseif ($value instanceof Reference) {
263+
} elseif ($value instanceof Reference || is_string($value) && 0 === strpos($value, '@')) {
264264
$value = '@'.$value;
265265
}
266266

src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,10 @@ private function resolveServices($value)
290290
if (is_array($value)) {
291291
$value = array_map(array($this, 'resolveServices'), $value);
292292
} elseif (is_string($value) && 0 === strpos($value, '@')) {
293-
if (0 === strpos($value, '@?')) {
293+
if (0 === strpos($value, '@@')) {
294+
$value = substr($value, 1);
295+
$invalidBehavior = null;
296+
} elseif (0 === strpos($value, '@?')) {
294297
$value = substr($value, 2);
295298
$invalidBehavior = ContainerInterface::IGNORE_ON_INVALID_REFERENCE;
296299
} else {
@@ -305,7 +308,9 @@ private function resolveServices($value)
305308
$strict = true;
306309
}
307310

308-
$value = new Reference($value, $invalidBehavior, $strict);
311+
if (null !== $invalidBehavior) {
312+
$value = new Reference($value, $invalidBehavior, $strict);
313+
}
309314
}
310315

311316
return $value;

src/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container8.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
'FOO' => '%baz%',
88
'baz' => 'bar',
99
'bar' => 'foo is %%foo bar',
10+
'escape' => '@escapeme',
1011
'values' => array(true, false, null, 0, 1000.3, 'true', 'false', 'null'),
1112
)));
1213

src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services8.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ protected function getDefaultParameters()
3737
'foo' => '%baz%',
3838
'baz' => 'bar',
3939
'bar' => 'foo is %%foo bar',
40+
'escape' => '@escapeme',
4041
'values' => array(
4142
0 => true,
4243
1 => false,

src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services8.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
<parameter key="foo">%baz%</parameter>
88
<parameter key="baz">bar</parameter>
99
<parameter key="bar">foo is %%foo bar</parameter>
10+
<parameter key="escape">@escapeme</parameter>
1011
<parameter key="values" type="collection">
1112
<parameter>true</parameter>
1213
<parameter>false</parameter>

src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services2.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ parameters:
66
- 0
77
- 1000.3
88
bar: foo
9+
escape: @@escapeme
910
foo_bar: @foo_bar
1011
MixedCase:
1112
MixedCaseKey: value

src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services8.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@ parameters:
22
foo: '%baz%'
33
baz: bar
44
bar: 'foo is %%foo bar'
5+
escape: '@@escapeme'
56
values: [true, false, null, 0, 1000.3, 'true', 'false', 'null']
67

src/Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public function testLoadParameters()
8484
$container = new ContainerBuilder();
8585
$loader = new YamlFileLoader($container, new FileLocator(self::$fixturesPath.'/yaml'));
8686
$loader->load('services2.yml');
87-
$this->assertEquals(array('foo' => 'bar', 'mixedcase' => array('MixedCaseKey' => 'value'), 'values' => array(true, false, 0, 1000.3), 'bar' => 'foo', 'foo_bar' => new Reference('foo_bar')), $container->getParameterBag()->all(), '->load() converts YAML keys to lowercase');
87+
$this->assertEquals(array('foo' => 'bar', 'mixedcase' => array('MixedCaseKey' => 'value'), 'values' => array(true, false, 0, 1000.3), 'bar' => 'foo', 'escape' => '@escapeme', 'foo_bar' => new Reference('foo_bar')), $container->getParameterBag()->all(), '->load() converts YAML keys to lowercase');
8888
}
8989

9090
public function testLoadImports()
@@ -99,7 +99,7 @@ public function testLoadImports()
9999
$loader->load('services4.yml');
100100

101101
$actual = $container->getParameterBag()->all();
102-
$expected = array('foo' => 'bar', 'values' => array(true, false), 'bar' => '%foo%', 'foo_bar' => new Reference('foo_bar'), 'mixedcase' => array('MixedCaseKey' => 'value'), 'imported_from_ini' => true, 'imported_from_xml' => true);
102+
$expected = array('foo' => 'bar', 'values' => array(true, false), 'bar' => '%foo%', 'escape' => '@escapeme', 'foo_bar' => new Reference('foo_bar'), 'mixedcase' => array('MixedCaseKey' => 'value'), 'imported_from_ini' => true, 'imported_from_xml' => true);
103103
$this->assertEquals(array_keys($expected), array_keys($actual), '->load() imports and merges imported files');
104104

105105
// Bad import throws no exception due to ignore_errors value.

src/Symfony/Component/Form/Extension/Csrf/CsrfProvider/DefaultCsrfProvider.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,11 @@ public function isCsrfTokenValid($intention, $token)
6565
*/
6666
protected function getSessionId()
6767
{
68-
if (!session_id()) {
68+
if (version_compare(PHP_VERSION, '5.4', '>=')) {
69+
if (PHP_SESSION_NONE === session_status()) {
70+
session_start();
71+
}
72+
} elseif (!session_id()) {
6973
session_start();
7074
}
7175

src/Symfony/Component/Form/Tests/Extension/Csrf/CsrfProvider/DefaultCsrfProviderTest.php

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ class DefaultCsrfProviderTest extends \PHPUnit_Framework_TestCase
2222

2323
public static function setUpBeforeClass()
2424
{
25-
@session_start();
25+
ini_set('session.save_handler', 'files');
26+
ini_set('session.save_path', sys_get_temp_dir());
2627
}
2728

2829
protected function setUp()
@@ -37,20 +38,42 @@ protected function tearDown()
3738

3839
public function testGenerateCsrfToken()
3940
{
41+
session_start();
42+
43+
$token = $this->provider->generateCsrfToken('foo');
44+
45+
$this->assertEquals(sha1('SECRET'.'foo'.session_id()), $token);
46+
}
47+
48+
public function testGenerateCsrfTokenOnUnstartedSession()
49+
{
50+
session_id('touti');
51+
52+
if (!version_compare(PHP_VERSION, '5.4', '>=')) {
53+
$this->markTestSkipped('This test requires PHP >= 5.4');
54+
}
55+
56+
$this->assertSame(PHP_SESSION_NONE, session_status());
57+
4058
$token = $this->provider->generateCsrfToken('foo');
4159

4260
$this->assertEquals(sha1('SECRET'.'foo'.session_id()), $token);
61+
$this->assertSame(PHP_SESSION_ACTIVE, session_status());
4362
}
4463

4564
public function testIsCsrfTokenValidSucceeds()
4665
{
66+
session_start();
67+
4768
$token = sha1('SECRET'.'foo'.session_id());
4869

4970
$this->assertTrue($this->provider->isCsrfTokenValid('foo', $token));
5071
}
5172

5273
public function testIsCsrfTokenValidFails()
5374
{
75+
session_start();
76+
5477
$token = sha1('SECRET'.'bar'.session_id());
5578

5679
$this->assertFalse($this->provider->isCsrfTokenValid('foo', $token));

src/Symfony/Component/HttpFoundation/Request.php

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1345,7 +1345,18 @@ public function getPreferredLanguage(array $locales = null)
13451345
return $locales[0];
13461346
}
13471347

1348-
$preferredLanguages = array_values(array_intersect($preferredLanguages, $locales));
1348+
$extendedPreferredLanguages = array();
1349+
foreach ($preferredLanguages as $language) {
1350+
$extendedPreferredLanguages[] = $language;
1351+
if (false !== $position = strpos($language, '_')) {
1352+
$superLanguage = substr($language, 0, $position);
1353+
if (!in_array($superLanguage, $preferredLanguages)) {
1354+
$extendedPreferredLanguages[] = $superLanguage;
1355+
}
1356+
}
1357+
}
1358+
1359+
$preferredLanguages = array_values(array_intersect($extendedPreferredLanguages, $locales));
13491360

13501361
return isset($preferredLanguages[0]) ? $preferredLanguages[0] : $locales[0];
13511362
}
@@ -1379,21 +1390,14 @@ public function getLanguages()
13791390
for ($i = 0, $max = count($codes); $i < $max; $i++) {
13801391
if ($i == 0) {
13811392
$lang = strtolower($codes[0]);
1382-
// First segment of compound language codes
1383-
// is added to supported languages list
1384-
if (!in_array($lang, $this->languages)) {
1385-
$this->languages[] = $lang;
1386-
}
13871393
} else {
13881394
$lang .= '_'.strtoupper($codes[$i]);
13891395
}
13901396
}
13911397
}
13921398
}
13931399

1394-
if (!in_array($lang, $this->languages)) {
1395-
$this->languages[] = $lang;
1396-
}
1400+
$this->languages[] = $lang;
13971401
}
13981402

13991403
return $this->languages;

src/Symfony/Component/HttpFoundation/Tests/RequestTest.php

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,6 +1013,14 @@ public function testGetPreferredLanguage()
10131013
$request = new Request();
10141014
$request->headers->set('Accept-language', 'zh, en-us; q=0.8, en; q=0.6');
10151015
$this->assertEquals('en', $request->getPreferredLanguage(array('fr', 'en')));
1016+
1017+
$request = new Request();
1018+
$request->headers->set('Accept-language', 'zh, en-us; q=0.8');
1019+
$this->assertEquals('en', $request->getPreferredLanguage(array('fr', 'en')));
1020+
1021+
$request = new Request();
1022+
$request->headers->set('Accept-language', 'zh, en-us; q=0.8, fr-fr; q=0.6, fr; q=0.5');
1023+
$this->assertEquals('en', $request->getPreferredLanguage(array('fr', 'en')));
10161024
}
10171025

10181026
public function testIsXmlHttpRequest()
@@ -1083,8 +1091,8 @@ public function testGetLanguages()
10831091

10841092
$request = new Request();
10851093
$request->headers->set('Accept-language', 'zh, en-us; q=0.8, en; q=0.6');
1086-
$this->assertEquals(array('zh', 'en', 'en_US'), $request->getLanguages());
1087-
$this->assertEquals(array('zh', 'en', 'en_US'), $request->getLanguages());
1094+
$this->assertEquals(array('zh', 'en_US', 'en'), $request->getLanguages());
1095+
$this->assertEquals(array('zh', 'en_US', 'en'), $request->getLanguages());
10881096

10891097
$request = new Request();
10901098
$request->headers->set('Accept-language', 'zh, en-us; q=0.6, en; q=0.8');
@@ -1101,10 +1109,6 @@ public function testGetLanguages()
11011109
$request = new Request();
11021110
$request->headers->set('Accept-language', 'zh, i-cherokee; q=0.6');
11031111
$this->assertEquals(array('zh', 'cherokee'), $request->getLanguages());
1104-
1105-
$request = new Request();
1106-
$request->headers->set('Accept-language', 'en-us');
1107-
$this->assertEquals(array('en', 'en_US'), $request->getLanguages());
11081112
}
11091113

11101114
public function testGetRequestFormat()

src/Symfony/Component/Process/Process.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,13 @@ public function __construct($commandline, $cwd = null, array $env = null, $stdin
131131

132132
$this->commandline = $commandline;
133133
$this->cwd = $cwd;
134+
134135
// on windows, if the cwd changed via chdir(), proc_open defaults to the dir where php was started
135-
if (null === $this->cwd && defined('PHP_WINDOWS_VERSION_BUILD')) {
136+
// on gnu/linux, PHP builds with --enable-maintainer-zts are also affected
137+
// @see : https://bugs.php.net/bug.php?id=51800
138+
// @see : https://bugs.php.net/bug.php?id=50524
139+
140+
if (null === $this->cwd && (defined('ZEND_THREAD_SAFE') || defined('PHP_WINDOWS_VERSION_BUILD'))) {
136141
$this->cwd = getcwd();
137142
}
138143
if (null !== $env) {

src/Symfony/Component/Yaml/Parser.php

Lines changed: 41 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -414,64 +414,61 @@ private function parseValue($value, $exceptionOnInvalidType, $objectSupport)
414414
*/
415415
private function parseFoldedScalar($separator, $indicator = '', $indentation = 0)
416416
{
417-
$separator = '|' == $separator ? "\n" : ' ';
418-
$text = '';
419-
420417
$notEOF = $this->moveToNextLine();
421-
422-
while ($notEOF && $this->isCurrentLineBlank()) {
423-
$text .= "\n";
424-
425-
$notEOF = $this->moveToNextLine();
426-
}
427-
428418
if (!$notEOF) {
429419
return '';
430420
}
431421

432-
if (!preg_match('#^(?P<indent>'.($indentation ? str_repeat(' ', $indentation) : ' +').')(?P<text>.*)$#u', $this->currentLine, $matches)) {
433-
$this->moveToPreviousLine();
434-
435-
return '';
422+
// determine indentation if not specified
423+
if (0 === $indentation) {
424+
if (preg_match('/^ +/', $this->currentLine, $matches)) {
425+
$indentation = strlen($matches[0]);
426+
}
436427
}
437428

438-
$textIndent = $matches['indent'];
439-
$previousIndent = 0;
440-
441-
$text .= $matches['text'].$separator;
442-
while ($this->currentLineNb + 1 < count($this->lines)) {
443-
$this->moveToNextLine();
444-
445-
if (preg_match('#^(?P<indent> {'.strlen($textIndent).',})(?P<text>.+)$#u', $this->currentLine, $matches)) {
446-
if (' ' == $separator && $previousIndent != $matches['indent']) {
447-
$text = substr($text, 0, -1)."\n";
429+
$text = '';
430+
if ($indentation > 0) {
431+
$pattern = sprintf('/^ {%d}(.*)$/', $indentation);
432+
433+
$isCurrentLineBlank = $this->isCurrentLineBlank();
434+
while (
435+
$notEOF && (
436+
$isCurrentLineBlank ||
437+
preg_match($pattern, $this->currentLine, $matches)
438+
)
439+
) {
440+
if ($isCurrentLineBlank) {
441+
$text .= substr($this->currentLine, $indentation);
442+
} else {
443+
$text .= $matches[1];
448444
}
449-
$previousIndent = $matches['indent'];
450445

451-
$text .= str_repeat(' ', $diff = strlen($matches['indent']) - strlen($textIndent)).$matches['text'].($diff ? "\n" : $separator);
452-
} elseif (preg_match('#^(?P<text> *)$#', $this->currentLine, $matches)) {
453-
$text .= preg_replace('#^ {1,'.strlen($textIndent).'}#', '', $matches['text'])."\n";
454-
} else {
455-
$this->moveToPreviousLine();
456-
457-
break;
446+
// newline only if not EOF
447+
if ($notEOF = $this->moveToNextLine()) {
448+
$text .= "\n";
449+
$isCurrentLineBlank = $this->isCurrentLineBlank();
450+
}
458451
}
452+
} elseif ($notEOF) {
453+
$text .= "\n";
459454
}
460455

461-
if (' ' == $separator) {
462-
// replace last separator by a newline
463-
$text = preg_replace('/ (\n*)$/', "\n$1", $text);
456+
if ($notEOF) {
457+
$this->moveToPreviousLine();
464458
}
465459

466-
switch ($indicator) {
467-
case '':
468-
$text = preg_replace('#\n+$#s', "\n", $text);
469-
break;
470-
case '+':
471-
break;
472-
case '-':
473-
$text = preg_replace('#\n+$#s', '', $text);
474-
break;
460+
// replace all non-trailing single newlines with spaces in folded blocks
461+
if ('>' === $separator) {
462+
preg_match('/(\n*)$/', $text, $matches);
463+
$text = preg_replace('/(?<!\n)\n(?!\n)/', ' ', rtrim($text, "\n"));
464+
$text .= $matches[1];
465+
}
466+
467+
// deal with trailing newlines as indicated
468+
if ('' === $indicator) {
469+
$text = preg_replace('/\n+$/s', "\n", $text);
470+
} elseif ('-' === $indicator) {
471+
$text = preg_replace('/\n+$/s', '', $text);
475472
}
476473

477474
return $text;

0 commit comments

Comments
 (0)