mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-02-24 13:57:36 +00:00
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.
Backport:
(cherry picked from commit af22a010d8)
This commit is contained in:
parent
5bd3a0c9e0
commit
90f82ffa5d
1 changed files with 27 additions and 2 deletions
|
|
@ -1400,13 +1400,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))
|
||||
|
|
|
|||
Loading…
Reference in a new issue