changeset 84508:c431e16c1635

(browse-url-encode-url): Fix an infinite loop. New argument `filename-p' to use one set of confusing chars or another. (browse-url-file-url): Use the argument. Suggested by Johannes Weiner.
author Michaël Cadilhac <michael.cadilhac@lrde.org>
date Wed, 12 Sep 2007 11:48:22 +0000
parents 8418c42a7854
children 24fe522ec90f
files lisp/net/browse-url.el
diffstat 1 files changed, 11 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/net/browse-url.el	Wed Sep 12 11:33:02 2007 +0000
+++ b/lisp/net/browse-url.el	Wed Sep 12 11:48:22 2007 +0000
@@ -619,16 +619,19 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; URL encoding
 
-(defun browse-url-encode-url (url)
-  "Encode all `confusing' characters in URL."
-  (let ((encoded-url (copy-sequence url)))
-    (while (string-match "%" encoded-url)
-      (setq encoded-url (replace-match "%25" t t encoded-url)))
-    (while (string-match "[*\"()',=;? ]" encoded-url)
+(defun browse-url-encode-url (url &optional filename-p)
+  "Encode all `confusing' characters in URL.
+If FILENAME-P is nil, the confusing characters are [,)$].
+Otherwise, the confusing characters are [*\"()',=;?% ]."
+  (let ((conf-char (if filename-p "[*\"()',=;?% ]" "[,)$]"))
+	(encoded-url (copy-sequence url))
+	(s 0))
+    (while (setq s (string-match conf-char encoded-url s))
       (setq encoded-url
 	    (replace-match (format "%%%x"
 				   (string-to-char (match-string 0 encoded-url)))
-			   t t encoded-url)))
+			   t t encoded-url)
+	    s (1+ s)))
     encoded-url))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -703,7 +706,7 @@
 		     (or file-name-coding-system
 			 default-file-name-coding-system))))
     (if coding (setq file (encode-coding-string file coding))))
-  (setq file (browse-url-encode-url file))
+  (setq file (browse-url-encode-url file 'url-is-filename))
   (dolist (map browse-url-filename-alist)
     (when (and map (string-match (car map) file))
       (setq file (replace-match (cdr map) t nil file))))