]> git.eshelyaron.com Git - emacs.git/commitdiff
Decode hex-encoded URLs before using them as file names
authorLars Ingebrigtsen <larsi@gnus.org>
Thu, 24 Dec 2015 21:21:24 +0000 (22:21 +0100)
committerLars Ingebrigtsen <larsi@gnus.org>
Thu, 24 Dec 2015 21:21:24 +0000 (22:21 +0100)
* eww.el (eww-decode-url-file-name): New function.
(eww-download-callback): Use it to decode file names before
saving them.

lisp/net/eww.el

index 2224b2e74e7d5e1b6ea64dade85c7e3cc9256d0b..d560636539685660dce33d0d6254b1766e8ebf00 100644 (file)
@@ -1404,13 +1404,38 @@ Differences in #targets are ignored."
   (unless (plist-get status :error)
     (let* ((obj (url-generic-parse-url url))
            (path (car (url-path-and-query obj)))
-           (file (eww-make-unique-file-name (file-name-nondirectory path)
-                                           eww-download-directory)))
+           (file (eww-make-unique-file-name
+                  (eww-decode-url-file-name (file-name-nondirectory path))
+                  eww-download-directory)))
       (goto-char (point-min))
       (re-search-forward "\r?\n\r?\n")
       (write-region (point) (point-max) file)
       (message "Saved %s" file))))
 
+(defun eww-decode-url-file-name (string)
+  (let* ((binary (url-unhex-string string))
+         (decoded
+          (decode-coding-string
+           binary
+           ;; Possibly set by `universal-coding-system-argument'.
+           (or coding-system-for-read
+               ;; RFC 3986 says that %AB stuff is utf-8.
+               (if (equal (decode-coding-string binary 'utf-8)
+                          '(unicode))
+                   'utf-8
+                 ;; But perhaps not.
+                 (car (detect-coding-string binary))))))
+         (encodes (find-coding-systems-string decoded)))
+    (if (or (equal encodes '(undecided))
+            (memq (or file-name-coding-system
+                      default-file-name-coding-system)
+                  encodes))
+        decoded
+      ;; If we can't encode the decoded file name (due to language
+      ;; environment settings), then we return the original, hexified
+      ;; string.
+      string)))
+
 (defun eww-make-unique-file-name (file directory)
     (cond
      ((zerop (length file))