| 49 | | if (settings.PREPEND_WWW and old_url[0] and |
|---|
| 50 | | not old_url[0].startswith('www.')): |
|---|
| 51 | | new_url[0] = 'www.' + old_url[0] |
|---|
| 52 | | |
|---|
| 53 | | # Append a slash if APPEND_SLASH is set and the URL doesn't have a |
|---|
| 54 | | # trailing slash and there is no pattern for the current path |
|---|
| 55 | | if settings.APPEND_SLASH and (not old_url[1].endswith('/')): |
|---|
| 56 | | try: |
|---|
| 57 | | urlresolvers.resolve(request.path) |
|---|
| 58 | | except urlresolvers.Resolver404: |
|---|
| 59 | | new_url[1] = new_url[1] + '/' |
|---|
| 60 | | if settings.DEBUG and request.method == 'POST': |
|---|
| 61 | | raise RuntimeError, ("" |
|---|
| 62 | | "You called this URL via POST, but the URL doesn't end " |
|---|
| 63 | | "in a slash and you have APPEND_SLASH set. Django can't " |
|---|
| 64 | | "redirect to the slash URL while maintaining POST data. " |
|---|
| 65 | | "Change your form to point to %s%s (note the trailing " |
|---|
| 66 | | "slash), or set APPEND_SLASH=False in your Django " |
|---|
| 67 | | "settings.") % (new_url[0], new_url[1]) |
|---|
| 68 | | |
|---|
| 69 | | if new_url != old_url: |
|---|
| 70 | | # Redirect if the target url exists |
|---|
| 71 | | try: |
|---|
| 72 | | urlresolvers.resolve(new_url[1]) |
|---|
| 73 | | except urlresolvers.Resolver404: |
|---|
| 74 | | pass |
|---|
| 75 | | else: |
|---|
| 76 | | if new_url[0]: |
|---|
| 77 | | newurl = "%s://%s%s" % ( |
|---|
| 78 | | request.is_secure() and 'https' or 'http', |
|---|
| 79 | | new_url[0], urlquote(new_url[1])) |
|---|
| 80 | | else: |
|---|
| 81 | | newurl = urlquote(new_url[1]) |
|---|
| 82 | | if request.GET: |
|---|
| 83 | | newurl += '?' + request.GET.urlencode() |
|---|
| 84 | | return http.HttpResponsePermanentRedirect(newurl) |
|---|
| 85 | | |
|---|
| | 85 | def _handle_redirects(request, resolve=True): |
|---|
| | 86 | host = request.get_host() |
|---|
| | 87 | old_url = [host, request.path] |
|---|
| | 88 | new_url = old_url[:] |
|---|
| | 89 | |
|---|
| | 90 | if (settings.PREPEND_WWW and old_url[0] and |
|---|
| | 91 | not old_url[0].startswith('www.')): |
|---|
| | 92 | new_url[0] = 'www.' + old_url[0] |
|---|
| | 93 | |
|---|
| | 94 | # Append a slash if APPEND_SLASH is set and the URL doesn't have a |
|---|
| | 95 | # trailing slash and there is no pattern for the current path |
|---|
| | 96 | if settings.APPEND_SLASH and (not old_url[1].endswith('/')): |
|---|
| | 97 | if resolve: |
|---|
| | 98 | try: |
|---|
| | 99 | urlresolvers.resolve(request.path) |
|---|
| | 100 | except urlresolvers.Resolver404: |
|---|
| | 101 | new_url[1] = new_url[1] + '/' |
|---|
| | 102 | else: |
|---|
| | 103 | new_url[1] = new_url[1] + '/' |
|---|
| | 104 | |
|---|
| | 105 | if new_url != old_url: |
|---|
| | 106 | # Redirect if the target url exists |
|---|
| | 107 | try: |
|---|
| | 108 | if resolve and new_url[0] == new_url[0] and new_url[1] != old_url[1]: |
|---|
| | 109 | urlresolvers.resolve(new_url[1]) |
|---|
| | 110 | except urlresolvers.Resolver404: |
|---|
| | 111 | pass |
|---|
| | 112 | else: |
|---|
| | 113 | if new_url[0]: |
|---|
| | 114 | newurl = "%s://%s%s" % ( |
|---|
| | 115 | request.is_secure() and 'https' or 'http', |
|---|
| | 116 | new_url[0], urlquote(new_url[1])) |
|---|
| | 117 | else: |
|---|
| | 118 | newurl = urlquote(new_url[1]) |
|---|
| | 119 | if request.GET: |
|---|
| | 120 | newurl += '?' + request.GET.urlencode() |
|---|
| | 121 | if settings.DEBUG and request.method == 'POST': |
|---|
| | 122 | raise RuntimeError, ("" |
|---|
| | 123 | "You called this URL via POST, but the URL doesn't end " |
|---|
| | 124 | "in a slash and you have APPEND_SLASH set. Django can't " |
|---|
| | 125 | "redirect to the slash URL while maintaining POST data. " |
|---|
| | 126 | "Change your form to point to %s%s (note the trailing " |
|---|
| | 127 | "slash), or set APPEND_SLASH=False in your Django " |
|---|
| | 128 | "settings.") % (new_url[0], new_url[1]) |
|---|
| | 129 | return http.HttpResponsePermanentRedirect(newurl) |
|---|
| | 130 | |
|---|