* lisp/emacs-lisp/package.el: Fix a decoding issue

(package--with-response-buffer): Use `url-insert-buffer-contents'.
The previous code had some issues with decoding. Refactoring that
function allows us to use the decoding from url-handlers while still
treating both sync and async requests the same.

* lisp/url/url-handlers.el (url-insert-file-contents): Move some code to
`url-insert-buffer-contents'.
(url-insert-buffer-contents): New function
This commit is contained in:
Artur Malabarba 2015-11-15 21:28:37 +00:00
parent 5f9153faaf
commit 7cc233e1e3
2 changed files with 32 additions and 26 deletions

View file

@ -1165,16 +1165,16 @@ BODY (does not apply to errors signaled by ERROR-FORM).
(when-let ((er (plist-get status :error)))
(error "Error retrieving: %s %S" url er))
(unless (search-forward-regexp "^\r?\n\r?" nil 'noerror)
(rest-error 'rest-unintelligible-result))
(delete-region (point-min) (point))
,@body)
(when (buffer-live-p b)
(kill-buffer b)))))))
(error "Error retrieving: %s %S" url "incomprehensible buffer"))
(with-temp-buffer
(url-insert-buffer-contents b url)
(kill-buffer b)
(goto-char (point-min))
,@body)))))))
(if ,async
(wrap-errors (url-retrieve url callback nil 'silent))
(let ((buffer (wrap-errors (url-retrieve-synchronously url 'silent))))
(with-current-buffer buffer
(funcall callback nil)))))
(with-current-buffer (wrap-errors (url-retrieve-synchronously url 'silent))
(funcall callback nil))))
(wrap-errors (with-temp-buffer
(let ((url (expand-file-name ,file ,url-1)))
(unless (file-name-absolute-p url)

View file

@ -309,6 +309,29 @@ They count bytes from the beginning of the body."
(defvar url-http-codes)
(defun url-insert-buffer-contents (buffer url &optional visit beg end replace)
"Insert the contents of BUFFER into current buffer.
This is like `url-insert', but also decodes the current buffer as
if it had been inserted from a file named URL."
(if visit (setq buffer-file-name url))
(save-excursion
(let* ((start (point))
(size-and-charset (url-insert buffer beg end)))
(kill-buffer buffer)
(when replace
(delete-region (point-min) start)
(delete-region (point) (point-max)))
(unless (cadr size-and-charset)
;; If the headers don't specify any particular charset, use the
;; usual heuristic/rules that we apply to files.
(decode-coding-inserted-region (point-min) (point) url
visit beg end replace))
(let ((inserted (car size-and-charset)))
(when (fboundp 'after-insert-file-set-coding)
(let ((insval (after-insert-file-set-coding inserted visit)))
(if insval (setq inserted insval))))
(list url inserted)))))
;;;###autoload
(defun url-insert-file-contents (url &optional visit beg end replace)
(let ((buffer (url-retrieve-synchronously url)))
@ -323,24 +346,7 @@ They count bytes from the beginning of the body."
(kill-buffer buffer)
;; Signal file-error per http://debbugs.gnu.org/16733.
(signal 'file-error (list url desc))))))
(if visit (setq buffer-file-name url))
(save-excursion
(let* ((start (point))
(size-and-charset (url-insert buffer beg end)))
(kill-buffer buffer)
(when replace
(delete-region (point-min) start)
(delete-region (point) (point-max)))
(unless (cadr size-and-charset)
;; If the headers don't specify any particular charset, use the
;; usual heuristic/rules that we apply to files.
(decode-coding-inserted-region start (point) url
visit beg end replace))
(let ((inserted (car size-and-charset)))
(when (fboundp 'after-insert-file-set-coding)
(let ((insval (after-insert-file-set-coding inserted visit)))
(if insval (setq inserted insval))))
(list url inserted))))))
(url-insert-buffer-contents buffer url visit beg end replace)))
(put 'insert-file-contents 'url-file-handlers 'url-insert-file-contents)