Anonymous avatar Anonymous committed c1d9bd4

Refactored the httptools.redirect code

Comments (0)

Files changed (2)

cherrypy/_cphttptools.py

             raise IndexRedirect(newUrl)
 
     return candidate, objectPathList, virtualPathList
-    
-def canonicalizeUrl(newUrl):
-    if not newUrl.startswith('http://') and not newUrl.startswith('https://'):
-        # If newUrl is not canonical, we must make it canonical
-        if newUrl[0] == '/':
+ 
+def canonicalizeUrl(url):
+    """ Canonicalize a URL. The URL might be relative, absolute or canonical """
+    if not url.startswith('http://') and not url.startswith('https://'):
+        # If url is not canonical, we must make it canonical
+        if url[0] == '/':
             # URL was absolute: we just add the request.base in front of it
-            newUrl = cpg.request.base + newUrl
+            url = cpg.request.base + url
         else:
             # URL was relative
             if cpg.request.browserUrl == cpg.request.base:
                 # browserUrl is request.base
-                newUrl = cpg.request.base + '/' + newUrl
+                url = cpg.request.base + '/' + url
             else:
                 i = cpg.request.browserUrl.rfind('/')
-                newUrl = cpg.request.browserUrl[:i+1] + newUrl
-    return newUrl
+                url = cpg.request.browserUrl[:i+1] + url
+    return url

cherrypy/lib/httptools.py

 
 from cherrypy import cpg
 
-def redirect(newUrl):
-    """ Sends a redirect to the browser """
-    
-    if not newUrl.startswith('http://') and not newUrl.startswith('https://'):
-        # If newUrl is not canonical, we must make it canonical
-        if newUrl.startswith('/'):
-            # newUrl was absolute:
-            # we just add request.base in front of it
-            newUrl = cpg.request.base + newUrl
+def canonicalizeUrl(url):
+    """ Canonicalize a URL. The URL might be relative, absolute or canonical """
+    if not url.startswith('http://') and not url.startswith('https://'):
+        # If url is not canonical, we must make it canonical
+        if url[0] == '/':
+            # URL was absolute: we just add the request.base in front of it
+            url = cpg.request.base + url
         else:
-            # newUrl was relative:
-            # we remove the last bit from browserUrl and add newUrl to it
-            i = cpg.request.browserUrl.rfind('/')
-            newUrl = cpg.request.browserUrl[:i+1] + newUrl
+            # URL was relative
+            if cpg.request.browserUrl == cpg.request.base:
+                # browserUrl is request.base
+                url = cpg.request.base + '/' + url
+            else:
+                i = cpg.request.browserUrl.rfind('/')
+                url = cpg.request.browserUrl[:i+1] + url
+    return url
+
+def redirect(url):
+    """ Sends a redirect to the browser (after canonicalizing the URL) """
     cpg.response.headerMap['Status'] = 302
-    cpg.response.headerMap['Location'] = newUrl
+    cpg.response.headerMap['Location'] = canonicalizeUrl(url)
     return ""
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.