changeset 61630:68114d546e48

(url-retrieve-synchronously): Work around the fact that url-http sometimes doesn't call the callback.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Mon, 18 Apr 2005 13:19:43 +0000
parents cacf55df1896
children c17a96999f36
files lisp/url/ChangeLog lisp/url/url.el
diffstat 2 files changed, 22 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/url/ChangeLog	Mon Apr 18 11:34:46 2005 +0000
+++ b/lisp/url/ChangeLog	Mon Apr 18 13:19:43 2005 +0000
@@ -1,3 +1,8 @@
+2005-04-18  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* url.el (url-retrieve-synchronously): Work around the fact that
+	url-http sometimes doesn't call the callback.
+
 2005-04-04  Lute Kamstra  <lute@gnu.org>
 
 	* url-handlers.el (url-handler-mode): Specify :group.
--- a/lisp/url/url.el	Mon Apr 18 11:34:46 2005 +0000
+++ b/lisp/url/url.el	Mon Apr 18 13:19:43 2005 +0000
@@ -180,15 +180,23 @@
 	  (url-debug 'retrieval
 		     "Spinning in url-retrieve-synchronously: %S (%S)"
 		     retrieval-done asynch-buffer)
-	  ;; We used to use `sit-for' here, but in some cases it wouldn't
-	  ;; work because apparently pending keyboard input would always
-	  ;; interrupt it before it got a chance to handle process input.
-	  ;; `sleep-for' was tried but it lead to other forms of
-	  ;; hanging.  --Stef
-	  (unless (accept-process-output proc)
-	    ;; accept-process-output returned nil, maybe because the process
-	    ;; exited (and may have been replaced with another).
-	    (setq proc (get-buffer-process asynch-buffer)))))
+	  (if (memq (process-status proc) '(closed exit signal failed))
+	      ;; FIXME: It's not clear whether url-retrieve's callback is
+	      ;; guaranteed to be called or not.  It seems that url-http
+	      ;; decides sometimes consciously not to call it, so it's not
+	      ;; clear that it's a bug, but even if we need to decide how
+	      ;; url-http can then warn us that the download has completed.
+              ;; In the mean time, we use this here workaround.
+              (setq retrieval-done t)
+            ;; We used to use `sit-for' here, but in some cases it wouldn't
+            ;; work because apparently pending keyboard input would always
+            ;; interrupt it before it got a chance to handle process input.
+            ;; `sleep-for' was tried but it lead to other forms of
+            ;; hanging.  --Stef
+            (unless (accept-process-output proc)
+              ;; accept-process-output returned nil, maybe because the process
+              ;; exited (and may have been replaced with another).
+              (setq proc (get-buffer-process asynch-buffer))))))
       asynch-buffer)))
 
 (defun url-mm-callback (&rest ignored)