(eval-when-compile (require 'cl))
(require 'mm-util)
+(require 'gnus)
(eval-and-compile
(autoload 'executable-find "executable"))
\f
;;; Internal variables
+(defvar mm-url-package-name
+ (gnus-replace-in-string
+ (gnus-replace-in-string gnus-version " v.*$" "")
+ " " "-"))
+
+(defvar mm-url-package-version gnus-version-number)
+
;; Stolen from w3.
(defvar mm-url-html-entities
'(
(insert-file-contents (substring url (1- (match-end 0))))
(mm-url-insert-file-contents-external url))
(mm-url-load-url)
- (let ((name buffer-file-name))
+ (let ((name buffer-file-name)
+ (url-package-name (or mm-url-package-name
+ url-package-name))
+ (url-package-version (or mm-url-package-version
+ url-package-version)))
(prog1
(url-insert-file-contents url)
(save-excursion
args (append mm-url-arguments (list url))))
(apply 'call-process program nil t nil args)))
+(defvar mm-url-timeout 30
+ "The number of seconds before timing out an URL fetch.")
+
+(defvar mm-url-retries 10
+ "The number of retries after timing out when fetching an URL.")
+
(defun mm-url-insert (url &optional follow-refresh)
"Insert the contents from an URL in the current buffer.
If FOLLOW-REFRESH is non-nil, redirect refresh url in META."
- (if follow-refresh
- (save-restriction
- (narrow-to-region (point) (point))
- (mm-url-insert-file-contents url)
- (goto-char (point-min))
- (when (re-search-forward
- "<meta[ \t\r\n]*http-equiv=\"Refresh\"[^>]*URL=\\([^\"]+\\)\"" nil t)
- (let ((url (match-string 1)))
- (delete-region (point-min) (point-max))
- (mm-url-insert url t))))
- (mm-url-insert-file-contents url)))
+ (let ((times mm-url-retries)
+ (done nil)
+ (first t)
+ result)
+ (message "%s" url)
+ (while (and (not (zerop (decf times)))
+ (not done))
+ (with-timeout (mm-url-timeout)
+ (unless first
+ (message "Trying again (%s)..." (- mm-url-retries times)))
+ (setq first nil)
+ (if follow-refresh
+ (save-restriction
+ (narrow-to-region (point) (point))
+ (mm-url-insert-file-contents url)
+ (goto-char (point-min))
+ (when (re-search-forward
+ "<meta[ \t\r\n]*http-equiv=\"Refresh\"[^>]*URL=\\([^\"]+\\)\"" nil t)
+ (let ((url (match-string 1)))
+ (delete-region (point-min) (point-max))
+ (setq result (mm-url-insert url t)))))
+ (setq result (mm-url-insert-file-contents url)))
+ (setq done t)))
+ result))
(defun mm-url-decode-entities ()
"Decode all HTML entities."