patch from Stefano Zacchiroli to fix some URI/file escaping problems

* nanoftp.c nanohttp.c xmlIO.c: patch from Stefano Zacchiroli
  to fix some URI/file escaping problems
Daniel
diff --git a/ChangeLog b/ChangeLog
index 6ff34b7..a1ebbc3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Fri Jan 10 17:07:01 CET 2003 Daniel Veillard <daniel@veillard.com>
+
+	* nanoftp.c nanohttp.c xmlIO.c: patch from Stefano Zacchiroli
+	  to fix some URI/file escaping problems
+
 Fri Jan 10 16:20:34 CET 2003 Daniel Veillard <daniel@veillard.com>
 
 	* python/generator.py: fixed a bug raised by Raymond Wiker, 
diff --git a/nanoftp.c b/nanoftp.c
index d3c1e28..a179deb 100644
--- a/nanoftp.c
+++ b/nanoftp.c
@@ -59,6 +59,7 @@
 #include <libxml/xmlmemory.h>
 #include <libxml/parser.h>
 #include <libxml/xmlerror.h>
+#include <libxml/uri.h>
 #include <libxml/nanoftp.h>
 #include <libxml/globals.h>
 
@@ -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 --git a/nanohttp.c b/nanohttp.c
index 614fab7..376660b 100644
--- a/nanohttp.c
+++ b/nanohttp.c
@@ -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 --git a/xmlIO.c b/xmlIO.c
index 9607322..fa6f37d 100644
--- a/xmlIO.c
+++ b/xmlIO.c
@@ -339,7 +339,7 @@
 }
 
 /**
- * xmlFileOpen:
+ * xmlFileOpen_real:
  * @filename:  the URI for matching
  *
  * input from FILE *, supports compressed input
@@ -347,8 +347,8 @@
  *
  * Returns an I/O context or NULL in case of error
  */
-void *
-xmlFileOpen (const char *filename) {
+static void *
+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
+ */
+static 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--) {