refined previous commit
This commit is contained in:
parent
a2a6cdca8d
commit
c896d71594
@ -54,15 +54,24 @@ class XmlEncoder extends SerializerAwareEncoder implements EncoderInterface, Dec
|
|||||||
*/
|
*/
|
||||||
public function decode($data, $format)
|
public function decode($data, $format)
|
||||||
{
|
{
|
||||||
$this->assertNoCustomDocType($data);
|
|
||||||
$internalErrors = libxml_use_internal_errors(true);
|
$internalErrors = libxml_use_internal_errors(true);
|
||||||
$disableEntities = libxml_disable_entity_loader(true);
|
$disableEntities = libxml_disable_entity_loader(true);
|
||||||
libxml_clear_errors();
|
libxml_clear_errors();
|
||||||
|
|
||||||
$xml = simplexml_load_string($data);
|
$dom = new \DOMDocument();
|
||||||
|
$dom->loadXML($data);
|
||||||
|
|
||||||
libxml_use_internal_errors($internalErrors);
|
libxml_use_internal_errors($internalErrors);
|
||||||
libxml_disable_entity_loader($disableEntities);
|
libxml_disable_entity_loader($disableEntities);
|
||||||
|
|
||||||
|
foreach ($dom->childNodes as $child) {
|
||||||
|
if ($child->nodeType === XML_DOCUMENT_TYPE_NODE) {
|
||||||
|
throw new UnexpectedValueException('Document types are not allowed.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$xml = simplexml_import_dom($dom);
|
||||||
|
|
||||||
if ($error = libxml_get_last_error()) {
|
if ($error = libxml_get_last_error()) {
|
||||||
throw new UnexpectedValueException($error->message);
|
throw new UnexpectedValueException($error->message);
|
||||||
}
|
}
|
||||||
@ -291,17 +300,6 @@ class XmlEncoder extends SerializerAwareEncoder implements EncoderInterface, Dec
|
|||||||
throw new UnexpectedValueException('An unexpected value could not be serialized: '.var_export($data, true));
|
throw new UnexpectedValueException('An unexpected value could not be serialized: '.var_export($data, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
private function assertNoCustomDocType($data)
|
|
||||||
{
|
|
||||||
$dom = new \DOMDocument;
|
|
||||||
$dom->loadXML($data);
|
|
||||||
foreach ($dom->childNodes as $child) {
|
|
||||||
if ($child->nodeType === XML_DOCUMENT_TYPE_NODE) {
|
|
||||||
throw new \InvalidArgumentException('Document types are not allowed.');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Selects the type of node to create and appends it to the parent.
|
* Selects the type of node to create and appends it to the parent.
|
||||||
*
|
*
|
||||||
|
@ -54,7 +54,7 @@ class XmlEncoderTest extends \PHPUnit_Framework_TestCase
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @expectedException \InvalidArgumentException
|
* @expectedException UnexpectedValueException
|
||||||
* @expectedExceptionMessage Document types are not allowed.
|
* @expectedExceptionMessage Document types are not allowed.
|
||||||
*/
|
*/
|
||||||
public function testDocTypeIsNotAllowed()
|
public function testDocTypeIsNotAllowed()
|
||||||
@ -255,8 +255,8 @@ class XmlEncoderTest extends \PHPUnit_Framework_TestCase
|
|||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
chdir($oldCwd);
|
chdir($oldCwd);
|
||||||
|
|
||||||
if (!$e instanceof \InvalidArgumentException) {
|
if (!$e instanceof UnexpectedValueException) {
|
||||||
$this->fail('Expected InvalidArgumentException');
|
$this->fail('Expected UnexpectedValueException');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user