emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Avoid a redirect loop in url-http


From: Chong Yidong
Subject: Re: Avoid a redirect loop in url-http
Date: Thu, 12 Apr 2007 11:48:51 -0400
User-agent: Gnus/5.11 (Gnus v5.11) Emacs/22.0.97 (gnu/linux)

Diane Murray <address@hidden> writes:

> There are sites that for some reason or another keep returning
> redirect responses.  Some redirect to the same host and file path
> but with slightly different query arguments, possibly because the
> page expects a cookie to be set and url-cookie doesn't allow it.
> Other mischievous sites might do something similar just to try and
> cause problems.  Since these are all distinct URLs, they won't be
> equal, which is why I suggested checking how many times the request
> has been redirected.

I see.

How about this patch?

*** emacs/lisp/url/url-vars.el.~1.16.~  2007-01-20 22:24:41.000000000 -0500
--- emacs/lisp/url/url-vars.el  2007-04-12 11:32:34.000000000 -0400
***************
*** 320,325 ****
--- 320,331 ----
    "\\`\\([-a-zA-Z0-9+.]+:\\)"
    "A regular expression that will match an absolute URL.")
  
+ (defcustom url-max-redirections 30
+   "*The maximum number of redirection requests to honor in a HTTP connection.
+ A negative number means to honor an unlimited number of redirection requests."
+   :type 'integer
+   :group 'url)
+ 
  (defcustom url-confirmation-func 'y-or-n-p
    "*What function to use for asking yes or no functions.
  Possible values are `yes-or-no-p' or `y-or-n-p', or any function that
*** emacs/lisp/url/url-http.el.~1.52.~  2007-04-01 11:32:35.000000000 -0400
--- emacs/lisp/url/url-http.el  2007-04-12 11:44:48.000000000 -0400
***************
*** 556,561 ****
--- 556,575 ----
             (let ((url-request-method url-http-method)
                 (url-request-data url-http-data)
                 (url-request-extra-headers url-http-extra-headers))
+            ;; Check existing number of redirects
+            (if (or (< url-max-redirections 0)
+                    (and (> url-max-redirections 0)
+                         (let ((events (car url-callback-arguments))
+                               (old-redirects 0))
+                           (while events
+                             (if (eq (car events) :redirect)
+                                 (setq old-redirects (1+ old-redirects)))
+                             (and (setq events (cdr events))
+                                  (setq events (cdr events))))
+                           (< old-redirects url-max-redirections))))
+                ;; url-max-redirections hasn't been reached, so go
+                ;; ahead and redirect.
+                (progn
             ;; Remember that the request was redirected.
             (setf (car url-callback-arguments)
                   (nconc (list :redirect redirect-uri)
***************
*** 570,576 ****
                   (url-retrieve-internal
                    redirect-uri url-callback-function
                    url-callback-arguments))
!             (url-mark-buffer-as-dead (current-buffer))))))
        (4                              ; Client error
         ;; 400 Bad Request
         ;; 401 Unauthorized
--- 584,598 ----
                   (url-retrieve-internal
                    redirect-uri url-callback-function
                    url-callback-arguments))
!             (url-mark-buffer-as-dead (current-buffer)))
!              ;; We hit url-max-redirections, so issue an error and
!              ;; stop redirecting.
!              (setf (car url-callback-arguments)
!                    (nconc (list :error (list 'error
!                                              'http
!                                              url-http-response-status))
!                           (car url-callback-arguments)))
!              (setq success t))))))
        (4                              ; Client error
         ;; 400 Bad Request
         ;; 401 Unauthorized




reply via email to

[Prev in Thread] Current Thread [Next in Thread]