Commit af22a010 authored by Lars Ingebrigtsen's avatar Lars Ingebrigtsen

Decode hex-encoded URLs before using them as file names

* eww.el (eww-decode-url-file-name): New function.
(eww-download-callback): Use it to decode file names before
saving them.
parent 60c0f1a1
......@@ -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))
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment