]> git.eshelyaron.com Git - emacs.git/commitdiff
Allow url-http to handle expired keepalive connections.
authorChong Yidong <cyd@gnu.org>
Sun, 11 Mar 2012 15:12:26 +0000 (23:12 +0800)
committerChong Yidong <cyd@gnu.org>
Sun, 11 Mar 2012 15:12:26 +0000 (23:12 +0800)
* 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
lisp/url/ChangeLog
lisp/url/url-http.el

index 6f65ab57fe60548ceed1c9ea998f60ff8ecb4b97..960649bdbc963deb612f62ddae2748a406eb872b 100644 (file)
@@ -1,3 +1,9 @@
+2012-03-11  Chong Yidong  <cyd@gnu.org>
+
+       * 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  <emacs-hacker2012@jovi.net>
 
        * url-http.el (url-http-find-free-connection): Don't pass a nil
index 36e355933853c99d0650ef878a50e9e1ca4d44fc..a4726489814d3fbd13fb5cdd00ff89b349140c1b 100644 (file)
@@ -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)