diff --git a/ext/xmlreader/php_xmlreader.c b/ext/xmlreader/php_xmlreader.c index efed79a2395fd..7b2619540956e 100644 --- a/ext/xmlreader/php_xmlreader.c +++ b/ext/xmlreader/php_xmlreader.c @@ -175,7 +175,7 @@ zval *xmlreader_write_property(zend_object *object, zend_string *name, zval *val hnd = zend_hash_find_ptr(obj->prop_handler, name); } if (hnd != NULL) { - php_error_docref(NULL, E_WARNING, "Cannot write to read-only property"); + zend_throw_error(NULL, "Cannot write to read-only property"); } else { value = zend_std_write_property(object, name, value, cache_slot); } @@ -391,8 +391,8 @@ static void php_xmlreader_string_arg(INTERNAL_FUNCTION_PARAMETERS, xmlreader_rea } if (!name_len) { - php_error_docref(NULL, E_WARNING, "Argument cannot be an empty string"); - RETURN_FALSE; + zend_argument_value_error(1, "cannot be empty"); + RETURN_THROWS(); } id = ZEND_THIS; @@ -480,8 +480,8 @@ static void php_xmlreader_set_relaxng_schema(INTERNAL_FUNCTION_PARAMETERS, int t } if (source != NULL && !source_len) { - php_error_docref(NULL, E_WARNING, "Schema data source is required"); - RETURN_FALSE; + zend_argument_value_error(1, "cannot be empty"); + RETURN_THROWS(); } id = ZEND_THIS; @@ -506,15 +506,16 @@ static void php_xmlreader_set_relaxng_schema(INTERNAL_FUNCTION_PARAMETERS, int t intern->schema = schema; RETURN_TRUE; + } else { + php_error_docref(NULL, E_WARNING, "Schema contains errors"); + RETURN_FALSE; } + } else { + zend_throw_error(NULL, "Schema must be set prior to reading"); + RETURN_THROWS(); } - - php_error_docref(NULL, E_WARNING, "Unable to set schema. This must be set prior to reading or schema contains errors."); - - RETURN_FALSE; #else - php_error_docref(NULL, E_WARNING, "No Schema support built into libxml."); - + php_error_docref(NULL, E_WARNING, "No schema support built into libxml"); RETURN_FALSE; #endif } @@ -585,9 +586,14 @@ PHP_METHOD(XMLReader, getAttributeNs) RETURN_THROWS(); } - if (name_len == 0 || ns_uri_len == 0) { - php_error_docref(NULL, E_WARNING, "Attribute Name and Namespace URI cannot be empty"); - RETURN_FALSE; + if (name_len == 0) { + zend_argument_value_error(1, "cannot be empty"); + RETURN_THROWS(); + } + + if (ns_uri_len == 0) { + zend_argument_value_error(2, "cannot be empty"); + RETURN_THROWS(); } id = ZEND_THIS; @@ -622,8 +628,8 @@ PHP_METHOD(XMLReader, getParserProperty) retval = xmlTextReaderGetParserProp(intern->ptr,property); } if (retval == -1) { - php_error_docref(NULL, E_WARNING, "Invalid parser property"); - RETURN_FALSE; + zend_argument_value_error(1, "must be a valid parser property"); + RETURN_THROWS(); } RETURN_BOOL(retval); @@ -660,8 +666,8 @@ PHP_METHOD(XMLReader, moveToAttribute) } if (name_len == 0) { - php_error_docref(NULL, E_WARNING, "Attribute Name is required"); - RETURN_FALSE; + zend_argument_value_error(1, "cannot be empty"); + RETURN_THROWS(); } id = ZEND_THIS; @@ -719,9 +725,14 @@ PHP_METHOD(XMLReader, moveToAttributeNs) RETURN_THROWS(); } - if (name_len == 0 || ns_uri_len == 0) { - php_error_docref(NULL, E_WARNING, "Attribute Name and Namespace URI cannot be empty"); - RETURN_FALSE; + if (name_len == 0) { + zend_argument_value_error(1, "cannot be empty"); + RETURN_THROWS(); + } + + if (ns_uri_len == 0) { + zend_argument_value_error(2, "cannot be empty"); + RETURN_THROWS(); } id = ZEND_THIS; @@ -772,17 +783,17 @@ PHP_METHOD(XMLReader, read) id = ZEND_THIS; intern = Z_XMLREADER_P(id); - if (intern != NULL && intern->ptr != NULL) { - retval = xmlTextReaderRead(intern->ptr); - if (retval == -1) { - RETURN_FALSE; - } else { - RETURN_BOOL(retval); - } + if (intern == NULL || intern->ptr == NULL) { + zend_throw_error(NULL, "Data must be loaded before reading"); + RETURN_THROWS(); } - php_error_docref(NULL, E_WARNING, "Load Data before trying to read"); - RETURN_FALSE; + retval = xmlTextReaderRead(intern->ptr); + if (retval == -1) { + RETURN_FALSE; + } else { + RETURN_BOOL(retval); + } } /* }}} */ @@ -816,8 +827,7 @@ PHP_METHOD(XMLReader, next) } } - php_error_docref(NULL, E_WARNING, "Load Data before trying to read"); - RETURN_FALSE; + zend_throw_error(NULL, "Data must be loaded before reading"); } /* }}} */ @@ -848,8 +858,8 @@ PHP_METHOD(XMLReader, open) } if (!source_len) { - php_error_docref(NULL, E_WARNING, "Empty string supplied as input"); - RETURN_FALSE; + zend_argument_value_error(1, "cannot be empty"); + RETURN_THROWS(); } valid_file = _xmlreader_get_valid_file_path(source, resolved_path, MAXPATHLEN ); @@ -920,8 +930,8 @@ PHP_METHOD(XMLReader, setSchema) } if (source != NULL && !source_len) { - php_error_docref(NULL, E_WARNING, "Schema data source is required"); - RETURN_FALSE; + zend_argument_value_error(1, "cannot be empty"); + RETURN_THROWS(); } id = ZEND_THIS; @@ -932,15 +942,16 @@ PHP_METHOD(XMLReader, setSchema) if (retval == 0) { RETURN_TRUE; + } else { + php_error_docref(NULL, E_WARNING, "Schema contains errors"); + RETURN_FALSE; } + } else { + zend_throw_error(NULL, "Schema must be set prior to reading"); + RETURN_THROWS(); } - - php_error_docref(NULL, E_WARNING, "Unable to set schema. This must be set prior to reading or schema contains errors."); - - RETURN_FALSE; #else - php_error_docref(NULL, E_WARNING, "No Schema support built into libxml."); - + php_error_docref(NULL, E_WARNING, "No schema support built into libxml"); RETURN_FALSE; #endif } @@ -967,8 +978,8 @@ PHP_METHOD(XMLReader, setParserProperty) retval = xmlTextReaderSetParserProp(intern->ptr,property, value); } if (retval == -1) { - php_error_docref(NULL, E_WARNING, "Invalid parser property"); - RETURN_FALSE; + zend_argument_value_error(1, "must be a valid parser property"); + RETURN_THROWS(); } RETURN_TRUE; @@ -1022,8 +1033,8 @@ PHP_METHOD(XMLReader, XML) } if (!source_len) { - php_error_docref(NULL, E_WARNING, "Empty string supplied as input"); - RETURN_FALSE; + zend_argument_value_error(1, "cannot be empty"); + RETURN_THROWS(); } inputbfr = xmlParserInputBufferCreateMem(source, source_len, XML_CHAR_ENCODING_NONE); @@ -1105,7 +1116,7 @@ PHP_METHOD(XMLReader, expand) node = xmlTextReaderExpand(intern->ptr); if (node == NULL) { - php_error_docref(NULL, E_WARNING, "An Error Occurred while expanding "); + php_error_docref(NULL, E_WARNING, "An Error Occurred while expanding"); RETURN_FALSE; } else { nodec = xmlDocCopyNode(node, docp, 1); @@ -1117,8 +1128,8 @@ PHP_METHOD(XMLReader, expand) } } } else { - php_error_docref(NULL, E_WARNING, "Load Data before trying to expand"); - RETURN_FALSE; + zend_throw_error(NULL, "Data must be loaded before expanding"); + RETURN_THROWS(); } #else php_error(E_WARNING, "DOM support is not enabled"); diff --git a/ext/xmlreader/php_xmlreader.stub.php b/ext/xmlreader/php_xmlreader.stub.php index 9de30e5a7afd9..582919d49721f 100644 --- a/ext/xmlreader/php_xmlreader.stub.php +++ b/ext/xmlreader/php_xmlreader.stub.php @@ -7,7 +7,7 @@ class XMLReader /** @return bool */ public function close() {} - /** @return string|null|false */ + /** @return string|null */ public function getAttribute(string $name) {} /** @return string|null */ @@ -22,7 +22,7 @@ public function getParserProperty(int $property) {} /** @return bool */ public function isValid() {} - /** @return string|null|false */ + /** @return string|null */ public function lookupNamespace(string $prefix) {} /** @return bool */ diff --git a/ext/xmlreader/php_xmlreader_arginfo.h b/ext/xmlreader/php_xmlreader_arginfo.h index 749d8066f41cd..0690d414163e5 100644 --- a/ext/xmlreader/php_xmlreader_arginfo.h +++ b/ext/xmlreader/php_xmlreader_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 8bdec18c4ad8574fb1d3e4baca928949d5ec2438 */ + * Stub hash: 90e6d525ba87399c54f36965ebf18dbf65084617 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_XMLReader_close, 0, 0, 0) ZEND_END_ARG_INFO() diff --git a/ext/xmlreader/tests/001.phpt b/ext/xmlreader/tests/001.phpt index c10c1a51635a9..cf255860556f4 100644 --- a/ext/xmlreader/tests/001.phpt +++ b/ext/xmlreader/tests/001.phpt @@ -17,10 +17,15 @@ while ($reader->read()) { } $xmlstring = ''; $reader = new XMLReader(); -$reader->XML($xmlstring); + +try { + $reader->XML($xmlstring); +} catch (ValueError $exception) { + echo $exception->getMessage() . "\n"; +} + ?> ---EXPECTF-- +--EXPECT-- books books - -Warning: XMLReader::XML(): Empty string supplied as input in %s on line %d +XMLReader::XML(): Argument #1 ($source) cannot be empty diff --git a/ext/xmlreader/tests/002.phpt b/ext/xmlreader/tests/002.phpt index 6d12f02204759..803c8c7243aa6 100644 --- a/ext/xmlreader/tests/002.phpt +++ b/ext/xmlreader/tests/002.phpt @@ -10,7 +10,11 @@ $xmlstring = ' file_put_contents($filename, $xmlstring); $reader = new XMLReader(); -if ($reader->open('')) exit(); +try { + $reader->open(''); +} catch (ValueError $exception) { + echo $exception->getMessage() . "\n"; +} $reader = new XMLReader(); if (!$reader->open($filename)) { @@ -31,7 +35,7 @@ $reader->close(); unlink($filename); ?> ---EXPECTF-- -Warning: XMLReader::open(): Empty string supplied as input in %s on line %d +--EXPECT-- +XMLReader::open(): Argument #1 ($URI) cannot be empty books books diff --git a/ext/xmlreader/tests/003-get-errors.phpt b/ext/xmlreader/tests/003-get-errors.phpt index a10529118f87e..e616bbc63ce70 100644 --- a/ext/xmlreader/tests/003-get-errors.phpt +++ b/ext/xmlreader/tests/003-get-errors.phpt @@ -31,8 +31,12 @@ while ($reader->read()) { echo $reader->value . "\n"; // Test for call with an empty string argument - $attr = $reader->getAttribute(''); - var_dump($attr); + try { + $reader->getAttribute(''); + } catch (ValueError $exception) { + echo $exception->getMessage() . "\n"; + } + // Ensure that node pointer has not changed position echo $reader->name . ": "; echo $reader->value . "\n"; @@ -61,13 +65,11 @@ $reader->close(); ---EXPECTF-- +--EXPECT-- book bool(true) num: 1 - -Warning: XMLReader::getAttribute(): Argument cannot be an empty string in %s on line %d -bool(false) +XMLReader::getAttribute(): Argument #1 ($name) cannot be empty num: 1 NULL num: 1 diff --git a/ext/xmlreader/tests/003-move-errors.phpt b/ext/xmlreader/tests/003-move-errors.phpt index a00dbaf52442b..24431b6a7e2a0 100644 --- a/ext/xmlreader/tests/003-move-errors.phpt +++ b/ext/xmlreader/tests/003-move-errors.phpt @@ -31,8 +31,12 @@ while ($reader->read()) { echo $reader->value . "\n"; // Test for call with an empty string argument - $attr = $reader->moveToAttribute(''); - var_dump($attr); + try { + $reader->moveToAttribute(''); + } catch (ValueError $exception) { + echo $exception->getMessage() . "\n"; + } + // Ensure that node pointer has not changed position echo $reader->name . ": "; echo $reader->value . "\n"; @@ -60,13 +64,11 @@ $reader->close(); ---EXPECTF-- +--EXPECT-- book bool(true) num: 1 - -Warning: XMLReader::moveToAttribute(): Attribute Name is required in %s on line %d -bool(false) +XMLReader::moveToAttribute(): Argument #1 ($name) cannot be empty num: 1 bool(false) num: 1 diff --git a/ext/xmlreader/tests/003.phpt b/ext/xmlreader/tests/003.phpt index c52c932c974a2..9ecf9d62da7ca 100644 --- a/ext/xmlreader/tests/003.phpt +++ b/ext/xmlreader/tests/003.phpt @@ -68,14 +68,18 @@ while ($reader->read()) { var_dump($reader->moveToAttributeNo(20)); var_dump($reader->moveToAttribute('missing-attribute')); - var_dump($reader->moveToAttribute('')); + try { + $reader->moveToAttribute(''); + } catch (ValueError $exception) { + echo $exception->getMessage() . "\n"; + } } } } $reader->close(); unlink($filename); ?> ---EXPECTF-- +--EXPECT-- num: 1 idx: 2 num: 1 @@ -84,6 +88,4 @@ num: 1 idx: 2 bool(false) bool(false) - -Warning: XMLReader::moveToAttribute(): Attribute Name is required in %s on line %d -bool(false) +XMLReader::moveToAttribute(): Argument #1 ($name) cannot be empty diff --git a/ext/xmlreader/tests/007.phpt b/ext/xmlreader/tests/007.phpt index 796b9fa05c9d4..6b8cab43f0f7f 100644 --- a/ext/xmlreader/tests/007.phpt +++ b/ext/xmlreader/tests/007.phpt @@ -42,13 +42,15 @@ $reader->close(); $reader = new XMLReader(); $reader->XML($xmlstring); -if ($reader->setRelaxNGSchema('')) { - echo 'failed'; +try { + $reader->setRelaxNGSchema(''); +} catch (ValueError $exception) { + echo $exception->getMessage() . "\n"; } + $reader->close(); ?> ---EXPECTF-- +--EXPECT-- file relaxNG: ok string relaxNG: ok - -Warning: XMLReader::setRelaxNGSchema(): Schema data source is required in %s on line %d +XMLReader::setRelaxNGSchema(): Argument #1 ($filename) cannot be empty diff --git a/ext/xmlreader/tests/014.phpt b/ext/xmlreader/tests/014.phpt index fca94d2b1f3ef..67c0e9fb93a6c 100644 --- a/ext/xmlreader/tests/014.phpt +++ b/ext/xmlreader/tests/014.phpt @@ -24,12 +24,24 @@ while ($reader->read()) { // Find a node to try modifying if ($reader->nodeType == XMLREADER::ELEMENT && $reader->name == 'book') { // Try to set the value of the element from book1 to movie1 - $reader->value = 'movie1'; + try { + $reader->value = 'movie1'; + } catch (Error $exception) { + echo $exception->getMessage() . "\n"; + } // Try to set the value of the first "num" attribute from "1" to "num attribute 1" $attr = $reader->moveToFirstAttribute(); - $reader->value = 'num attribute 1'; + try { + $reader->value = 'num attribute 1'; + } catch (Error $exception) { + echo $exception->getMessage() . "\n"; + } // Try to set the name of the first attribute from "num" to "number" - $reader->name = 'number'; + try { + $reader->name = 'number'; + } catch (Error $exception) { + echo $exception->getMessage() . "\n"; + } } } } @@ -41,9 +53,7 @@ $reader->close(); ---EXPECTF-- -Warning: main(): Cannot write to read-only property in %s on line %d - -Warning: main(): Cannot write to read-only property in %s on line %d - -Warning: main(): Cannot write to read-only property in %s on line %d +--EXPECT-- +Cannot write to read-only property +Cannot write to read-only property +Cannot write to read-only property diff --git a/ext/xmlreader/tests/015-get-errors.phpt b/ext/xmlreader/tests/015-get-errors.phpt index 5f17326b1b6aa..850d042a4b0c8 100644 --- a/ext/xmlreader/tests/015-get-errors.phpt +++ b/ext/xmlreader/tests/015-get-errors.phpt @@ -26,8 +26,12 @@ while ($reader->read()) { $attr = $reader->moveToNextAttribute(); // Test for missing namespace argument - $attr = $reader->getAttributeNs('idx', null); - var_dump($attr); + try { + $attr = $reader->getAttributeNs('idx', null); + } catch (ValueError $exception) { + echo $exception->getMessage() . "\n"; + } + echo $reader->name . ": "; echo $reader->value . "\n"; } @@ -41,7 +45,6 @@ $reader->close(); ---EXPECTF-- -Warning: XMLReader::getAttributeNs(): Attribute Name and Namespace URI cannot be empty in %s on line %d -bool(false) +--EXPECT-- +XMLReader::getAttributeNs(): Argument #2 ($namespaceURI) cannot be empty ns1:num: 1 diff --git a/ext/xmlreader/tests/015-move-errors.phpt b/ext/xmlreader/tests/015-move-errors.phpt index 5263b555b6ea8..2b5580d7ea4fd 100644 --- a/ext/xmlreader/tests/015-move-errors.phpt +++ b/ext/xmlreader/tests/015-move-errors.phpt @@ -24,7 +24,11 @@ while ($reader->read()) { // Find the book node if ($reader->nodeType == XMLREADER::ELEMENT && $reader->name == 'book') { // Test for missing namespace argument - $attr = $reader->moveToAttributeNs('idx', null); + try { + $reader->moveToAttributeNs('idx', null); + } catch (ValueError $exception) { + echo $exception->getMessage() . "\n"; + } } } } @@ -36,5 +40,5 @@ $reader->close(); ---EXPECTF-- -Warning: XMLReader::moveToAttributeNs(): Attribute Name and Namespace URI cannot be empty in %s on line %d +--EXPECT-- +XMLReader::moveToAttributeNs(): Argument #2 ($namespaceURI) cannot be empty diff --git a/ext/xmlreader/tests/expand_error.phpt b/ext/xmlreader/tests/expand_error.phpt index 2813e836d9f76..59ab0365b6043 100644 --- a/ext/xmlreader/tests/expand_error.phpt +++ b/ext/xmlreader/tests/expand_error.phpt @@ -13,7 +13,13 @@ $xmlstring = ' new book'; $reader = new XMLReader(); -var_dump($reader->expand()); + +try { + $reader->expand(); +} catch (Error $exception) { + echo $exception->getMessage() . "\n"; +} + $reader->close(); $reader = new XMLReader(); @@ -22,8 +28,7 @@ var_dump($reader->expand()); $reader->close(); ?> --EXPECTF-- -Warning: XMLReader::expand(): Load Data before trying to expand in %s on line %d -bool(false) +Data must be loaded before expanding -Warning: XMLReader::expand(): An Error Occurred while expanding in %s on line %d +Warning: XMLReader::expand(): An Error Occurred while expanding in %s on line %d bool(false) diff --git a/ext/xmlreader/tests/next_basic.phpt b/ext/xmlreader/tests/next_basic.phpt index e0663c23d3509..70d540c2c20ba 100644 --- a/ext/xmlreader/tests/next_basic.phpt +++ b/ext/xmlreader/tests/next_basic.phpt @@ -9,8 +9,19 @@ $xml = ' '; $reader = new XMLReader(); -$reader->read(); -$reader->next(); + +try { + $reader->read(); +} catch (Error $exception) { + echo $exception->getMessage() . "\n"; +} + +try { + $reader->next(); +} catch (Error $exception) { + echo $exception->getMessage() . "\n"; +} + $reader->close(); $reader->XML($xml); @@ -28,10 +39,9 @@ echo $reader->name . PHP_EOL; $reader->close(); ?> ---EXPECTF-- -Warning: XMLReader::read(): Load Data before trying to read in %s on line %d - -Warning: XMLReader::next(): Load Data before trying to read in %s on line %d +--EXPECT-- +Data must be loaded before reading +Data must be loaded before reading node1 bool(true) node3 diff --git a/ext/xmlreader/tests/schema-bad.xsd b/ext/xmlreader/tests/schema-bad.xsd new file mode 100644 index 0000000000000..d72af314604e3 --- /dev/null +++ b/ext/xmlreader/tests/schema-bad.xsd @@ -0,0 +1 @@ +asd diff --git a/ext/xmlreader/tests/setParserProperty_error.phpt b/ext/xmlreader/tests/setParserProperty_error.phpt index 755a4e4772c4b..9bdb0baa03259 100644 --- a/ext/xmlreader/tests/setParserProperty_error.phpt +++ b/ext/xmlreader/tests/setParserProperty_error.phpt @@ -10,9 +10,12 @@ $xml = 'new bookXML($xml); -var_dump($reader->setParserProperty(-1, true)); +try { + $reader->setParserProperty(-1, true); +} catch (ValueError $exception) { + echo $exception->getMessage() . "\n"; +} $reader->close(); ?> ---EXPECTF-- -Warning: XMLReader::setParserProperty(): Invalid parser property in %s on line %d -bool(false) +--EXPECT-- +XMLReader::setParserProperty(): Argument #1 ($property) must be a valid parser property diff --git a/ext/xmlreader/tests/setSchema_error.phpt b/ext/xmlreader/tests/setSchema_error.phpt index 31bd4d6e3ed96..2984455de8bba 100644 --- a/ext/xmlreader/tests/setSchema_error.phpt +++ b/ext/xmlreader/tests/setSchema_error.phpt @@ -6,24 +6,38 @@ XMLReader: setSchema Error setSchema('')); +try { + $reader->setSchema(''); +} catch (ValueError $exception) { + echo $exception->getMessage() . "\n"; +} $reader->close(); $reader = new XMLReader(); -var_dump($reader->setSchema('schema-missing-file.xsd')); +try { + $reader->setSchema('schema-missing-file.xsd'); +} catch (Error $exception) { + echo $exception->getMessage() . "\n"; +} $reader->close(); $reader = new XMLReader(); -var_dump($reader->setSchema('schema-empty.xsd')); +try { + $reader->setSchema('schema-empty.xsd'); +} catch (Error $exception) { + echo $exception->getMessage() . "\n"; +} + +$reader = new XMLReader(); +$reader->XML(<< + +EOF); +var_dump(@$reader->setSchema('schema-bad.xsd')); $reader->close(); ?> ---EXPECTF-- - -Warning: XMLReader::setSchema(): Schema data source is required in %s on line %d -bool(false) - -Warning: XMLReader::setSchema(): Unable to set schema. This must be set prior to reading or schema contains errors. in %s on line %d -bool(false) - -Warning: XMLReader::setSchema(): Unable to set schema. This must be set prior to reading or schema contains errors. in %s on line %d +--EXPECT-- +XMLReader::setSchema(): Argument #1 ($filename) cannot be empty +Schema must be set prior to reading +Schema must be set prior to reading bool(false)