aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lisp/net/eww.el29
1 files changed, 27 insertions, 2 deletions
diff --git a/lisp/net/eww.el b/lisp/net/eww.el
index 2224b2e74e7..d5606365396 100644
--- a/lisp/net/eww.el
+++ b/lisp/net/eww.el
@@ -1404,13 +1404,38 @@ Differences in #targets are ignored."
1404 (unless (plist-get status :error) 1404 (unless (plist-get status :error)
1405 (let* ((obj (url-generic-parse-url url)) 1405 (let* ((obj (url-generic-parse-url url))
1406 (path (car (url-path-and-query obj))) 1406 (path (car (url-path-and-query obj)))
1407 (file (eww-make-unique-file-name (file-name-nondirectory path) 1407 (file (eww-make-unique-file-name
1408 eww-download-directory))) 1408 (eww-decode-url-file-name (file-name-nondirectory path))
1409 eww-download-directory)))
1409 (goto-char (point-min)) 1410 (goto-char (point-min))
1410 (re-search-forward "\r?\n\r?\n") 1411 (re-search-forward "\r?\n\r?\n")
1411 (write-region (point) (point-max) file) 1412 (write-region (point) (point-max) file)
1412 (message "Saved %s" file)))) 1413 (message "Saved %s" file))))
1413 1414
1415(defun eww-decode-url-file-name (string)
1416 (let* ((binary (url-unhex-string string))
1417 (decoded
1418 (decode-coding-string
1419 binary
1420 ;; Possibly set by `universal-coding-system-argument'.
1421 (or coding-system-for-read
1422 ;; RFC 3986 says that %AB stuff is utf-8.
1423 (if (equal (decode-coding-string binary 'utf-8)
1424 '(unicode))
1425 'utf-8
1426 ;; But perhaps not.
1427 (car (detect-coding-string binary))))))
1428 (encodes (find-coding-systems-string decoded)))
1429 (if (or (equal encodes '(undecided))
1430 (memq (or file-name-coding-system
1431 default-file-name-coding-system)
1432 encodes))
1433 decoded
1434 ;; If we can't encode the decoded file name (due to language
1435 ;; environment settings), then we return the original, hexified
1436 ;; string.
1437 string)))
1438
1414(defun eww-make-unique-file-name (file directory) 1439(defun eww-make-unique-file-name (file directory)
1415 (cond 1440 (cond
1416 ((zerop (length file)) 1441 ((zerop (length file))