| | 52 | |
|---|
| | 53 | |
|---|
| | 54 | class WSGITrac: |
|---|
| | 55 | """Callable class. Initi with path=/path/to/trac/env""" |
|---|
| | 56 | def __init__(self, path, secure=False): |
|---|
| | 57 | self.path = path |
|---|
| | 58 | self.secure = secure |
|---|
| | 59 | |
|---|
| | 60 | def __call__(self, environ, start_response): |
|---|
| | 61 | environ['trac.env_path'] = self.path |
|---|
| | 62 | |
|---|
| | 63 | https = environ.get("HTTPS", "off") |
|---|
| | 64 | if self.secure and https != 'on': |
|---|
| | 65 | return redirect_https(environ, start_response) |
|---|
| | 66 | |
|---|
| | 67 | return dispatch_request(environ, start_response) |
|---|
| | 68 | |
|---|
| | 69 | |
|---|
| | 70 | def redirect_https(environ, start_response): |
|---|
| | 71 | url = reconstruct_url(environ) |
|---|
| | 72 | s=list(urlparse.urlsplit(url)) |
|---|
| | 73 | s[0]="https" |
|---|
| | 74 | u2 = urlparse.urlunsplit(s) |
|---|
| | 75 | start_response("302 Temporary Redirect", [('location', u2), ('content-type', 'text/plain')]) |
|---|
| | 76 | return [u2] |
|---|
| | 77 | |
|---|
| | 78 | def reconstruct_url(environ): |
|---|
| | 79 | from urllib import quote |
|---|
| | 80 | url = environ['wsgi.url_scheme']+'://' |
|---|
| | 81 | |
|---|
| | 82 | if environ.get('HTTP_HOST'): |
|---|
| | 83 | url += environ['HTTP_HOST'] |
|---|
| | 84 | else: |
|---|
| | 85 | url += environ['SERVER_NAME'] |
|---|
| | 86 | |
|---|
| | 87 | if environ['wsgi.url_scheme'] == 'https': |
|---|
| | 88 | if environ['SERVER_PORT'] != '443': |
|---|
| | 89 | url += ':' + environ['SERVER_PORT'] |
|---|
| | 90 | else: |
|---|
| | 91 | if environ['SERVER_PORT'] != '80': |
|---|
| | 92 | url += ':' + environ['SERVER_PORT'] |
|---|
| | 93 | url += quote(environ.get('SCRIPT_NAME','')) |
|---|
| | 94 | url += quote(environ.get('PATH_INFO','')) |
|---|
| | 95 | if environ.get('QUERY_STRING'): |
|---|
| | 96 | url += '?' + environ['QUERY_STRING'] |
|---|
| | 97 | return url |
|---|
| | 98 | |
|---|
| | 99 | |
|---|
| | 100 | def wsgi_trac(global_conf, path = None, secure = False, **local_conf): |
|---|
| | 101 | return WSGITrac(path, secure=asbool(secure)) |
|---|
| | 102 | |
|---|
| | 103 | |
|---|
| | 104 | class Redirect(): |
|---|
| | 105 | def __init__(self, url, code=302): |
|---|
| | 106 | self.url = url |
|---|
| | 107 | self.status = "%d Redirect" %(code) |
|---|
| | 108 | def __call__(self, environ, start_response): |
|---|
| | 109 | start_response(self.status, [('Location', self.url)]) |
|---|
| | 110 | return [] |
|---|
| | 111 | |
|---|
| | 112 | def permanent_redirect(global_conf, url): |
|---|
| | 113 | return Redirect(url, 301) |
|---|
| | 114 | |
|---|
| | 115 | def temporary_redirect(global_conf, url): |
|---|
| | 116 | return Redirect(url, 302) |
|---|
| | 117 | |
|---|