summaryrefslogtreecommitdiff
path: root/ext/libxml
diff options
context:
space:
mode:
authorRob Richards <rrichards@php.net>2005-10-13 20:34:37 +0000
committerRob Richards <rrichards@php.net>2005-10-13 20:34:37 +0000
commit646500bfe956af0f3f19f93355916f71025af055 (patch)
tree1496a26916764eaf288df6c3665b1c635977597a /ext/libxml
parent1e0494a714783eeb3341afacdd3c2782c665d83e (diff)
downloadphp-git-646500bfe956af0f3f19f93355916f71025af055.tar.gz
MFH: insure stream usage
Diffstat (limited to 'ext/libxml')
-rw-r--r--ext/libxml/libxml.c123
1 files changed, 77 insertions, 46 deletions
diff --git a/ext/libxml/libxml.c b/ext/libxml/libxml.c
index 44a1a4f820..7d1feb02c1 100644
--- a/ext/libxml/libxml.c
+++ b/ext/libxml/libxml.c
@@ -249,36 +249,6 @@ static void php_libxml_init_globals(php_libxml_globals *libxml_globals_p TSRMLS_
/* Channel libxml file io layer through the PHP streams subsystem.
* This allows use of ftps:// and https:// urls */
-int php_libxml_streams_IO_match_wrapper(const char *filename)
-{
- char *resolved_path;
- int retval, isescaped=0;
- xmlURI *uri;
-
- TSRMLS_FETCH();
-
- if (zend_is_executing(TSRMLS_C)) {
- uri = xmlParseURI((xmlChar *)filename);
- if (uri && (uri->scheme == NULL || (xmlStrncmp(uri->scheme, "file", 4) == 0))) {
- resolved_path = xmlURIUnescapeString(filename, 0, NULL);
- isescaped = 1;
- } else {
- resolved_path = (char *)filename;
- }
-
- if (uri) {
- xmlFreeURI(uri);
- }
-
- retval = php_stream_locate_url_wrapper(resolved_path, NULL, 0 TSRMLS_CC) ? 1 : 0;
- if (resolved_path && isescaped) {
- xmlFree(resolved_path);
- }
- return retval;
- }
- return 0;
-}
-
void *php_libxml_streams_IO_open_wrapper(const char *filename, const char *mode, const int read_only)
{
php_stream_statbuf ssbuf;
@@ -362,6 +332,78 @@ int php_libxml_streams_IO_close(void *context)
return php_stream_close((php_stream*)context);
}
+xmlParserInputBufferPtr
+php_libxml_input_buffer_create_filename(const char *URI, xmlCharEncoding enc)
+{
+ xmlParserInputBufferPtr ret;
+ void *context = NULL;
+
+ if (URI == NULL)
+ return(NULL);
+
+ context = php_libxml_streams_IO_open_read_wrapper(URI);
+
+ if (context == NULL) {
+ return(NULL);
+ }
+
+ /* Allocate the Input buffer front-end. */
+ ret = xmlAllocParserInputBuffer(enc);
+ if (ret != NULL) {
+ ret->context = context;
+ ret->readcallback = php_libxml_streams_IO_read;
+ ret->closecallback = php_libxml_streams_IO_close;
+ } else
+ php_libxml_streams_IO_close(context);
+
+ return(ret);
+}
+
+xmlOutputBufferPtr
+php_libxml_output_buffer_create_filename(const char *URI,
+ xmlCharEncodingHandlerPtr encoder,
+ int compression ATTRIBUTE_UNUSED)
+{
+ xmlOutputBufferPtr ret;
+ xmlURIPtr puri;
+ void *context = NULL;
+ char *unescaped = NULL;
+
+ if (URI == NULL)
+ return(NULL);
+
+ puri = xmlParseURI(URI);
+ if (puri != NULL) {
+ if (puri->scheme != NULL)
+ unescaped = xmlURIUnescapeString(URI, 0, NULL);
+ xmlFreeURI(puri);
+ }
+
+ if (unescaped != NULL) {
+ context = php_libxml_streams_IO_open_write_wrapper(unescaped);
+ xmlFree(unescaped);
+ }
+
+ /* try with a non-escaped URI this may be a strange filename */
+ if (context == NULL) {
+ context = context = php_libxml_streams_IO_open_write_wrapper(URI);
+ }
+
+ if (context == NULL) {
+ return(NULL);
+ }
+
+ /* Allocate the Output buffer front-end. */
+ ret = xmlAllocOutputBuffer(encoder);
+ if (ret != NULL) {
+ ret->context = context;
+ ret->writecallback = php_libxml_streams_IO_write;
+ ret->closecallback = php_libxml_streams_IO_close;
+ }
+
+ return(ret);
+}
+
static int _php_libxml_free_error(xmlErrorPtr error) {
/* This will free the libxml alloc'd memory */
xmlResetError(error);
@@ -501,22 +543,6 @@ PHP_LIBXML_API void php_libxml_initialize() {
/* we should be the only one's to ever init!! */
xmlInitParser();
- /* Enable php stream/wrapper support for libxml
- we only use php streams, so we do not enable
- the default io handlers in libxml.
- */
- xmlRegisterInputCallbacks(
- php_libxml_streams_IO_match_wrapper,
- php_libxml_streams_IO_open_read_wrapper,
- php_libxml_streams_IO_read,
- php_libxml_streams_IO_close);
-
- xmlRegisterOutputCallbacks(
- php_libxml_streams_IO_match_wrapper,
- php_libxml_streams_IO_open_write_wrapper,
- php_libxml_streams_IO_write,
- php_libxml_streams_IO_close);
-
zend_hash_init(&php_libxml_exports, 0, NULL, NULL, 1);
_php_libxml_initialized = 1;
@@ -595,6 +621,8 @@ PHP_RINIT_FUNCTION(libxml)
{
/* report errors via handler rather than stderr */
xmlSetGenericErrorFunc(NULL, php_libxml_error_handler);
+ xmlParserInputBufferCreateFilenameDefault(php_libxml_input_buffer_create_filename);
+ xmlOutputBufferCreateFilenameDefault(php_libxml_output_buffer_create_filename);
return SUCCESS;
}
@@ -613,6 +641,9 @@ PHP_RSHUTDOWN_FUNCTION(libxml)
xmlSetGenericErrorFunc(NULL, NULL);
xmlSetStructuredErrorFunc(NULL, NULL);
+ xmlParserInputBufferCreateFilenameDefault(NULL);
+ xmlOutputBufferCreateFilenameDefault(NULL);
+
smart_str_free(&LIBXML(error_buffer));
if (LIBXML(error_list)) {
zend_llist_destroy(LIBXML(error_list));