From: Chong Yidong Date: Sun, 11 Mar 2012 15:12:26 +0000 (+0800) Subject: Allow url-http to handle expired keepalive connections. X-Git-Tag: emacs-pretest-24.0.05~105 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=091006330e4bf8a8e3a98fd2711372bb1a43eeee;p=emacs.git Allow url-http to handle expired keepalive connections. * lisp/url/url-http.el (url-http-end-of-document-sentinel): Handle keepalive expiry by calling url-http again. (url-http): New arg, for the above. Fixes: debbugs:10223 --- diff --git a/lisp/url/ChangeLog b/lisp/url/ChangeLog index 6f65ab57fe6..960649bdbc9 100644 --- a/lisp/url/ChangeLog +++ b/lisp/url/ChangeLog @@ -1,3 +1,9 @@ +2012-03-11 Chong Yidong + + * url-http.el (url-http-end-of-document-sentinel): Handle + keepalive expiry by calling url-http again (Bug#10223). + (url-http): New arg, for the above. + 2012-03-11 Devon Sean McCullough * url-http.el (url-http-find-free-connection): Don't pass a nil diff --git a/lisp/url/url-http.el b/lisp/url/url-http.el index 36e35593385..a4726489814 100644 --- a/lisp/url/url-http.el +++ b/lisp/url/url-http.el @@ -27,6 +27,7 @@ (eval-when-compile (require 'cl)) (defvar url-http-extra-headers) (defvar url-http-target-url) +(defvar url-http-no-retry) (defvar url-http-proxy) (defvar url-http-connection-opened) (require 'url-gw) @@ -875,19 +876,26 @@ should be shown to the user." url-http-open-connections)) (defun url-http-end-of-document-sentinel (proc why) - ;; Sentinel used for old HTTP/0.9 or connections we know are going - ;; to die as the 'end of document' notifier. + ;; Sentinel used to handle (i) terminated old HTTP/0.9 connections, + ;; and (ii) closed connection due to reusing a HTTP connection which + ;; we believed was still alive, but which the server closed on us. + ;; We handle case (ii) by calling `url-http' again. (url-http-debug "url-http-end-of-document-sentinel in buffer (%s)" (process-buffer proc)) (url-http-idle-sentinel proc why) (when (buffer-name (process-buffer proc)) (with-current-buffer (process-buffer proc) (goto-char (point-min)) - (if (not (looking-at "HTTP/")) - ;; HTTP/0.9 just gets passed back no matter what - (url-http-activate-callback) - (if (url-http-parse-headers) - (url-http-activate-callback)))))) + (cond ((not (looking-at "HTTP/")) + (if url-http-no-retry + ;; HTTP/0.9 just gets passed back no matter what + (url-http-activate-callback) + ;; Call `url-http' again if our connection expired. + (erase-buffer) + (url-http url-current-object url-callback-function + url-callback-arguments (current-buffer)))) + ((url-http-parse-headers) + (url-http-activate-callback)))))) (defun url-http-simple-after-change-function (st nd length) ;; Function used when we do NOT know how long the document is going to be @@ -1165,11 +1173,14 @@ the end of the document." (goto-char (point-max))))) ;;;###autoload -(defun url-http (url callback cbargs) +(defun url-http (url callback cbargs &optional retry-buffer) "Retrieve URL via HTTP asynchronously. URL must be a parsed URL. See `url-generic-parse-url' for details. When retrieval is completed, the function CALLBACK is executed with -CBARGS as the arguments." +CBARGS as the arguments. + +Optional arg RETRY-BUFFER, if non-nil, specifies the buffer of a +previous `url-http' call, which is being re-attempted." (check-type url vector "Need a pre-parsed URL.") (declare (special url-current-object url-http-end-of-headers @@ -1190,7 +1201,8 @@ CBARGS as the arguments." (let* ((host (url-host (or url-using-proxy url))) (port (url-port (or url-using-proxy url))) (connection (url-http-find-free-connection host port)) - (buffer (generate-new-buffer (format " *http %s:%d*" host port)))) + (buffer (or retry-buffer + (generate-new-buffer (format " *http %s:%d*" host port))))) (if (not connection) ;; Failed to open the connection for some reason (progn @@ -1220,6 +1232,7 @@ CBARGS as the arguments." url-http-extra-headers url-http-data url-http-target-url + url-http-no-retry url-http-connection-opened url-http-proxy)) (set (make-local-variable var) nil)) @@ -1235,6 +1248,7 @@ CBARGS as the arguments." url-callback-arguments cbargs url-http-after-change-function 'url-http-wait-for-headers-change-function url-http-target-url url-current-object + url-http-no-retry retry-buffer url-http-connection-opened nil url-http-proxy url-using-proxy) @@ -1261,6 +1275,7 @@ CBARGS as the arguments." (with-current-buffer (process-buffer proc) (cond (url-http-connection-opened + (setq url-http-no-retry t) (url-http-end-of-document-sentinel proc why)) ((string= (substring why 0 4) "open") (setq url-http-connection-opened t)