diff -ur libxml2-2.5.1/nanoftp.c libxml2-2.5.1-DEBUG/nanoftp.c --- libxml2-2.5.1/nanoftp.c 2002-12-10 15:56:54.000000000 +0100 +++ libxml2-2.5.1-DEBUG/nanoftp.c 2003-01-10 13:35:39.000000000 +0100 @@ -59,6 +59,7 @@ #include #include #include +#include #include #include @@ -496,6 +497,7 @@ void* xmlNanoFTPNewCtxt(const char *URL) { xmlNanoFTPCtxtPtr ret; + char *unescaped; ret = (xmlNanoFTPCtxtPtr) xmlMalloc(sizeof(xmlNanoFTPCtxt)); if (ret == NULL) return(NULL); @@ -508,8 +510,12 @@ ret->controlBufUsed = 0; ret->controlFd = -1; - if (URL != NULL) + unescaped = xmlURIUnescapeString(URL, 0, NULL); + if (unescaped != NULL) + xmlNanoFTPScanURL(ret, unescaped); + else if (URL != NULL) xmlNanoFTPScanURL(ret, URL); + xmlFree(unescaped); return(ret); } diff -ur libxml2-2.5.1/nanohttp.c libxml2-2.5.1-DEBUG/nanohttp.c --- libxml2-2.5.1/nanohttp.c 2002-12-10 17:21:37.000000000 +0100 +++ libxml2-2.5.1-DEBUG/nanohttp.c 2003-01-10 13:21:41.000000000 +0100 @@ -372,7 +372,6 @@ static xmlNanoHTTPCtxtPtr xmlNanoHTTPNewCtxt(const char *URL) { xmlNanoHTTPCtxtPtr ret; - xmlChar *escaped; ret = (xmlNanoHTTPCtxtPtr) xmlMalloc(sizeof(xmlNanoHTTPCtxt)); if (ret == NULL) return(NULL); @@ -383,13 +382,7 @@ ret->fd = -1; ret->ContentLength = -1; - escaped = xmlURIEscapeStr(BAD_CAST URL, BAD_CAST"@/:=?;#%&"); - if (escaped != NULL) { - xmlNanoHTTPScanURL(ret, (const char *) escaped); - xmlFree(escaped); - } else { - xmlNanoHTTPScanURL(ret, URL); - } + xmlNanoHTTPScanURL(ret, URL); return(ret); } diff -ur libxml2-2.5.1/xmlIO.c libxml2-2.5.1-DEBUG/xmlIO.c --- libxml2-2.5.1/xmlIO.c 2002-12-17 19:28:55.000000000 +0100 +++ libxml2-2.5.1-DEBUG/xmlIO.c 2003-01-10 13:25:26.000000000 +0100 @@ -339,7 +339,7 @@ } /** - * xmlFileOpen: + * xmlFileOpen_real: * @filename: the URI for matching * * input from FILE *, supports compressed input @@ -348,7 +348,7 @@ * Returns an I/O context or NULL in case of error */ void * -xmlFileOpen (const char *filename) { +xmlFileOpen_real (const char *filename) { const char *path = NULL; FILE *fd; @@ -386,6 +386,27 @@ } /** + * xmlFileOpen: + * @filename: the URI for matching + * + * Wrapper around xmlFileOpen_real that try it with an unescaped + * version of @filename, if this fails fallback to @filename + */ +void * +xmlFileOpen (const char *filename) { + char *unescaped; + void *retval; + unescaped = xmlURIUnescapeString(filename, 0, NULL); + if (unescaped != NULL) { + retval = xmlFileOpen_real(unescaped); + } else { + retval = xmlFileOpen_real(filename); + } + xmlFree(unescaped); + return retval; +} + +/** * xmlFileOpenW: * @filename: the URI for matching * @@ -513,7 +534,7 @@ } /** - * xmlGzfileOpen: + * xmlGzfileOpen_real: * @filename: the URI for matching * * input from compressed file open @@ -522,7 +543,7 @@ * Returns an I/O context or NULL in case of error */ static void * -xmlGzfileOpen (const char *filename) { +xmlGzfileOpen_real (const char *filename) { const char *path = NULL; gzFile fd; @@ -556,6 +577,27 @@ } /** + * xmlGzfileOpen: + * @filename: the URI for matching + * + * Wrapper around xmlGzfileOpen that try it with an unescaped + * version of @filename, if this fails fallback to @filename + */ +void * +xmlGzfileOpen (const char *filename) { + char *unescaped; + void *retval; + unescaped = xmlURIUnescapeString(filename, 0, NULL); + if (unescaped != NULL) { + retval = xmlGzfileOpen_real(unescaped); + } else { + retval = xmlGzfileOpen_real(filename); + } + xmlFree(unescaped); + return retval; +} + +/** * xmlGzfileOpenW: * @filename: the URI for matching * @compression: the compression factor (0 - 9 included) @@ -1724,7 +1766,6 @@ xmlParserInputBufferPtr ret; int i = 0; void *context = NULL; - char *unescaped; char *normalized; if (xmlInputCallbackInitialized == 0) @@ -1740,24 +1781,6 @@ /* * Try to find one of the input accept method accepting that scheme * Go in reverse to give precedence to user defined handlers. - * try with an unescaped version of the URI - */ - unescaped = xmlURIUnescapeString((char *) normalized, 0, NULL); - if (unescaped != NULL) { - for (i = xmlInputCallbackNr - 1;i >= 0;i--) { - if ((xmlInputCallbackTable[i].matchcallback != NULL) && - (xmlInputCallbackTable[i].matchcallback(unescaped) != 0)) { - context = xmlInputCallbackTable[i].opencallback(unescaped); - if (context != NULL) - break; - } - } - xmlFree(unescaped); - } - - /* - * If this failed try with a non-escaped URI this may be a strange - * filename */ if (context == NULL) { for (i = xmlInputCallbackNr - 1;i >= 0;i--) {