7 changed files with 384 additions and 3 deletions
-
3UPGRADING
-
177ext/libxml/libxml.c
-
5ext/libxml/php_libxml.h
-
48ext/libxml/tests/libxml_set_external_entity_loader_basic.phpt
-
39ext/libxml/tests/libxml_set_external_entity_loader_error1.phpt
-
71ext/libxml/tests/libxml_set_external_entity_loader_variation1.phpt
-
44ext/libxml/tests/libxml_set_external_entity_loader_variation2.phpt
@ -0,0 +1,48 @@ |
|||
--TEST-- |
|||
libxml_set_external_entity_loader() basic test |
|||
--SKIPIF-- |
|||
<?php if (!extension_loaded('dom')) die('skip'); ?> |
|||
--FILE-- |
|||
<?php |
|||
$xml = <<<XML |
|||
<!DOCTYPE foo PUBLIC "-//FOO/BAR" "http://example.com/foobar"> |
|||
<foo>bar</foo> |
|||
XML; |
|||
|
|||
$dtd = <<<DTD |
|||
<!ELEMENT foo (#PCDATA)> |
|||
DTD; |
|||
|
|||
libxml_set_external_entity_loader( |
|||
function ($public, $system, $context) use($dtd){ |
|||
var_dump($public); |
|||
var_dump($system); |
|||
var_dump($context); |
|||
$f = fopen("php://temp", "r+"); |
|||
fwrite($f, $dtd); |
|||
rewind($f); |
|||
return $f; |
|||
} |
|||
); |
|||
|
|||
$dd = new DOMDocument; |
|||
$r = $dd->loadXML($xml); |
|||
var_dump($dd->validate()); |
|||
|
|||
echo "Done.\n"; |
|||
|
|||
--EXPECT-- |
|||
string(10) "-//FOO/BAR" |
|||
string(25) "http://example.com/foobar" |
|||
array(4) { |
|||
["directory"]=> |
|||
NULL |
|||
["intSubName"]=> |
|||
NULL |
|||
["extSubURI"]=> |
|||
NULL |
|||
["extSubSystem"]=> |
|||
NULL |
|||
} |
|||
bool(true) |
|||
Done. |
|||
@ -0,0 +1,39 @@ |
|||
--TEST-- |
|||
libxml_set_external_entity_loader() error: bad arguments |
|||
--SKIPIF-- |
|||
<?php if (!extension_loaded('dom')) die('skip'); ?> |
|||
--FILE-- |
|||
<?php |
|||
$xml = <<<XML |
|||
<!DOCTYPE foo PUBLIC "-//FOO/BAR" "http://example.com/foobar"> |
|||
<foo>bar</foo> |
|||
XML; |
|||
|
|||
$dd = new DOMDocument; |
|||
$r = $dd->loadXML($xml); |
|||
|
|||
var_dump(libxml_set_external_entity_loader([])); |
|||
var_dump(libxml_set_external_entity_loader()); |
|||
var_dump(libxml_set_external_entity_loader(function() {}, 2)); |
|||
|
|||
var_dump(libxml_set_external_entity_loader(function($a, $b, $c, $d) {})); |
|||
var_dump($dd->validate()); |
|||
|
|||
echo "Done.\n"; |
|||
|
|||
--EXPECTF-- |
|||
Warning: libxml_set_external_entity_loader() expects parameter 1 to be a valid callback, array must have exactly two members in %s on line %d |
|||
NULL |
|||
|
|||
Warning: libxml_set_external_entity_loader() expects exactly 1 parameter, 0 given in %s on line %d |
|||
NULL |
|||
|
|||
Warning: libxml_set_external_entity_loader() expects exactly 1 parameter, 2 given in %s on line %d |
|||
NULL |
|||
bool(true) |
|||
|
|||
Warning: Missing argument 4 for {closure}() in %s on line %d |
|||
|
|||
Warning: DOMDocument::validate(): Could not load the external subset "http://example.com/foobar" in %s on line %d |
|||
bool(false) |
|||
Done. |
|||
@ -0,0 +1,71 @@ |
|||
--TEST-- |
|||
libxml_set_external_entity_loader() variation: resolve externals and entities |
|||
--SKIPIF-- |
|||
<?php if (!extension_loaded('dom')) die('skip'); ?> |
|||
--FILE-- |
|||
<?php |
|||
$xml = <<<XML |
|||
<!DOCTYPE foo PUBLIC "-//FOO/BAR" "http://example.com/foobar"> |
|||
<foo>bar&fooz;</foo> |
|||
XML; |
|||
|
|||
$dtd = <<<DTD |
|||
<!ELEMENT foo (#PCDATA)> |
|||
<!ENTITY % fooentity PUBLIC |
|||
"-//FOO/ENTITY" |
|||
"fooentity.ent"> |
|||
%fooentity; |
|||
DTD; |
|||
|
|||
$entity = <<<ENT |
|||
<!ENTITY fooz "baz"> |
|||
ENT; |
|||
|
|||
libxml_set_external_entity_loader( |
|||
function ($public, $system, $context) use($dtd,$entity){ |
|||
static $first = true; |
|||
var_dump($public); |
|||
var_dump($system); |
|||
var_dump($context); |
|||
$f = fopen("php://temp", "r+"); |
|||
fwrite($f, $first ? $dtd : $entity); |
|||
$first = false; |
|||
rewind($f); |
|||
return $f; |
|||
} |
|||
); |
|||
|
|||
$dd = new DOMDocument; |
|||
$dd->resolveExternals = true; |
|||
$r = $dd->loadXML($xml); |
|||
var_dump($dd->validate()); |
|||
|
|||
echo "Done.\n"; |
|||
|
|||
--EXPECTF-- |
|||
string(10) "-//FOO/BAR" |
|||
string(25) "http://example.com/foobar" |
|||
array(4) { |
|||
["directory"]=> |
|||
string(36) "%s" |
|||
["intSubName"]=> |
|||
string(3) "foo" |
|||
["extSubURI"]=> |
|||
string(25) "http://example.com/foobar" |
|||
["extSubSystem"]=> |
|||
string(10) "-//FOO/BAR" |
|||
} |
|||
string(13) "-//FOO/ENTITY" |
|||
string(32) "http://example.com/fooentity.ent" |
|||
array(4) { |
|||
["directory"]=> |
|||
string(36) "%s" |
|||
["intSubName"]=> |
|||
string(3) "foo" |
|||
["extSubURI"]=> |
|||
string(25) "http://example.com/foobar" |
|||
["extSubSystem"]=> |
|||
string(10) "-//FOO/BAR" |
|||
} |
|||
bool(true) |
|||
Done. |
|||
@ -0,0 +1,44 @@ |
|||
--TEST-- |
|||
libxml_set_external_entity_loader() variation: restore original handler; returning NULL |
|||
--SKIPIF-- |
|||
<?php if (!extension_loaded('dom')) die('skip'); ?> |
|||
--CLEAN-- |
|||
<?php |
|||
@unlink(__DIR__ . "/foobar.dtd"); |
|||
--FILE-- |
|||
<?php |
|||
$xml = <<<XML |
|||
<!DOCTYPE foo PUBLIC "-//FOO/BAR" "foobar.dtd"> |
|||
<foo>bar</foo> |
|||
XML; |
|||
|
|||
$dtd = <<<DTD |
|||
<!ELEMENT foo (#PCDATA)> |
|||
DTD; |
|||
|
|||
|
|||
libxml_set_external_entity_loader( |
|||
function ($public, $system, $context) { |
|||
var_dump($public,$system); |
|||
return null; |
|||
} |
|||
); |
|||
|
|||
$dd = new DOMDocument; |
|||
$r = $dd->loadXML($xml); |
|||
var_dump($dd->validate()); |
|||
|
|||
libxml_set_external_entity_loader(NULL); |
|||
file_put_contents(__DIR__ . "/foobar.dtd", $dtd); |
|||
var_dump($dd->validate()); |
|||
|
|||
echo "Done.\n"; |
|||
|
|||
--EXPECTF-- |
|||
string(10) "-//FOO/BAR" |
|||
string(46) "%sfoobar.dtd" |
|||
|
|||
Warning: DOMDocument::validate(): Could not load the external subset "foobar.dtd" in %s on line %d |
|||
bool(false) |
|||
bool(true) |
|||
Done. |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue