X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=lisp%2Fmm-url.el;h=f1c032c8e2009f2bec17ca631ed996fe834e1f6f;hb=9b741e050b400987d68ff761c6cc3276c932839c;hp=ba32df49eb71bed0db9d6202b25a215bcfc769f5;hpb=ea42fdd601ccdb6580a1d47059ceb7f636696211;p=elisp%2Fgnus.git- diff --git a/lisp/mm-url.el b/lisp/mm-url.el index ba32df4..f1c032c 100644 --- a/lisp/mm-url.el +++ b/lisp/mm-url.el @@ -1,5 +1,5 @@ ;;; mm-url.el --- a wrapper of url functions/commands for Gnus -;; Copyright (C) 2001 Free Software Foundation, Inc. +;; Copyright (C) 2001, 2002 Free Software Foundation, Inc. ;; Author: Shenghuo Zhu @@ -29,13 +29,13 @@ ;;; Code: -(require 'mm-util) -(require 'path-util) - (eval-when-compile (require 'cl)) +(require 'mm-util) +(require 'gnus) + (eval-and-compile - (autoload 'url-insert-file-contents "url-handlers")) + (autoload 'exec-installed-p "path-util")) (defgroup mm-url nil "A wrapper of url package and external url command for Gnus." @@ -43,7 +43,7 @@ (defcustom mm-url-use-external (not (condition-case nil - (require 'url-handlers) + (require 'url) (error nil))) "*If not-nil, use external grab program `mm-url-program'." :type 'boolean @@ -51,18 +51,21 @@ (defvar mm-url-predefined-programs '((wget "wget" "-q" "-O" "-") + (w3m "w3m" "-dump_source") (lynx "lynx" "-source") (curl "curl"))) (defcustom mm-url-program (cond ((exec-installed-p "wget") 'wget) + ((executable-find "w3m") 'w3m) ((exec-installed-p "lynx") 'lynx) ((exec-installed-p "curl") 'curl) (t "GET")) "The url grab program." :type '(choice (symbol :tag "wget" wget) + (symbol :tag "w3m" w3m) (symbol :tag "lynx" lynx) (symbol :tag "curl" curl) (string :tag "other")) @@ -73,6 +76,16 @@ :type '(repeat string) :group 'mm-url) + +;;; 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 '( @@ -246,15 +259,32 @@ "A list of characters that are _NOT_ reserved in the URL spec. This is taken from RFC 2396.") +(defun mm-url-load-url () + "Load `url-insert-file-contents'." + (unless (condition-case () + (require 'url-handlers) + (error nil)) + ;; w3-4.0pre0.46 or earlier version. + (require 'w3-vars) + (require 'url))) + (defun mm-url-insert-file-contents (url) (if mm-url-use-external (if (string-match "^file:/+" url) (insert-file-contents (substring url (1- (match-end 0)))) (mm-url-insert-file-contents-external url)) - (require 'url-handlers) - (let ((name buffer-file-name)) + (mm-url-load-url) + (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 + (goto-char (point-min)) + (while (re-search-forward "\r 1000\r ?" nil t) + (replace-match ""))) (setq buffer-file-name name))))) (defun mm-url-insert-file-contents-external (url) @@ -267,20 +297,38 @@ This is taken from RFC 2396.") 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 - "]*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) + (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 + "]*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." @@ -344,7 +392,7 @@ spaces. Die Die Die." (defun mm-url-fetch-form (url pairs) "Fetch a form from URL with PAIRS as the data using the POST method." - (require 'url-handlers) + (mm-url-load-url) (let ((url-request-data (mm-url-encode-www-form-urlencoded pairs)) (url-request-method "POST") (url-request-extra-headers @@ -354,7 +402,7 @@ spaces. Die Die Die." t) (defun mm-url-fetch-simple (url content) - (require 'url-handlers) + (mm-url-load-url) (let ((url-request-data content) (url-request-method "POST") (url-request-extra-headers