[BUGFIX] Trim input into xml2array 16/50716/2
authorAnja Leichsenring <aleichsenring@ab-softlab.de>
Sun, 20 Nov 2016 08:42:59 +0000 (09:42 +0100)
committerChristian Kuhn <lolli@schwarzbu.ch>
Sun, 20 Nov 2016 12:31:04 +0000 (13:31 +0100)
Preciding whitespace in the xml input string causes xml2array()
to fail with an error message. This whitespace is often
introduced by formatting code via IDE, so blaming the developer
only helps so far. Inserting a trim() before the input is processed
mitigates the problem.

Resolves: #78752
Releases: master, 7.6
Change-Id: I3b9d3c81b64d502e7cefef80e72bef3a1bd9b3da
Reviewed-on: https://review.typo3.org/50716
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Łukasz Uznański <l.uznanski@macopedia.pl>
Tested-by: Łukasz Uznański <l.uznanski@macopedia.pl>
Reviewed-by: Ralf Zimmermann <ralf.zimmermann@tritum.de>
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
typo3/sysext/core/Classes/Utility/GeneralUtility.php
typo3/sysext/core/Tests/Unit/Utility/GeneralUtilityTest.php

index 8ace260..d1f0f19 100644 (file)
@@ -1795,7 +1795,7 @@ class GeneralUtility
         if (!empty($firstLevelCache[$identifier])) {
             $array = $firstLevelCache[$identifier];
         } else {
-            $array = self::xml2arrayProcess($string, $NSprefix, $reportDocTag);
+            $array = self::xml2arrayProcess(trim($string), $NSprefix, $reportDocTag);
             // Store content in first level cache
             $firstLevelCache[$identifier] = $array;
         }
index f431d71..fc60703 100644 (file)
@@ -4632,6 +4632,76 @@ class GeneralUtilityTest extends \TYPO3\CMS\Core\Tests\UnitTestCase
     }
 
     /**
+     * @return array
+     */
+    public function providerForXml2Array(): array
+    {
+        return [
+            'inputWithoutWhitespaces' => [
+                '<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+                <T3FlexForms>
+                    <data>
+                        <field index="settings.persistenceIdentifier">
+                            <value index="vDEF">egon</value>
+                        </field>
+                    </data>
+                </T3FlexForms>'
+            ],
+            'inputWithPrecedingWhitespaces' => [
+                '
+                <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+                <T3FlexForms>
+                    <data>
+                        <field index="settings.persistenceIdentifier">
+                            <value index="vDEF">egon</value>
+                        </field>
+                    </data>
+                </T3FlexForms>'
+            ],
+            'inputWithTrailingWhitespaces' => [
+                '<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+                <T3FlexForms>
+                    <data>
+                        <field index="settings.persistenceIdentifier">
+                            <value index="vDEF">egon</value>
+                        </field>
+                    </data>
+                </T3FlexForms>
+                '
+            ],
+            'inputWithPrecedingAndTrailingWhitespaces' => [
+                '
+                <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+                <T3FlexForms>
+                    <data>
+                        <field index="settings.persistenceIdentifier">
+                            <value index="vDEF">egon</value>
+                        </field>
+                    </data>
+                </T3FlexForms>
+                '
+            ],
+        ];
+    }
+
+    /**
+     * @test
+     * @dataProvider providerForXml2Array
+     * @param string $input
+     */
+    public function xml2ArrayDealsProperlyWithWhitespace(string $input)
+    {
+        $expected = [
+            'data' => [
+                'settings.persistenceIdentifier' => [
+                    'vDEF' => 'egon',
+                ]
+            ],
+        ];
+        $this->assertSame($expected, GeneralUtility::xml2array($input));
+    }
+
+    /**
      * @test
      * @dataProvider idnaEncodeDataProvider
      * @param $actual