annotate roundup/cgi/wsgi_handler.py @ 6546:c58c7cd31243

issue2550991 - Some mechanism to set expiration header or max age for static resources Work was done in 2.0.0 to add support for cache control headers. This checkin sets default values for javascript (2 weeks) and css (2 month) files.
author John Rouillard <rouilj@ieee.org>
date Thu, 09 Dec 2021 17:36:08 -0500
parents 0da655d1498d
children d32d43e4a5ba
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1 # WSGI interface for Roundup Issue Tracker
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2 #
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
3 # This module is free software, you may redistribute it
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
4 # and/or modify under the same terms as Python.
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
5 #
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
6
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
7 import os
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
8 import weakref
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
9
6080
274c2c082f68 factor out get_tracker so we can potentially customise if we want to reuse
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6061
diff changeset
10 from contextlib import contextmanager
274c2c082f68 factor out get_tracker so we can potentially customise if we want to reuse
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6061
diff changeset
11
5837
883c9e90b403 Fix problem with cgi.escape being depricated a different way. This way
John Rouillard <rouilj@ieee.org>
parents: 5823
diff changeset
12 from roundup.anypy.html import html_escape
5800
1a835db41674 Call cgi.escape only on python 2. Replace with html.escapeif it can be
John Rouillard <rouilj@ieee.org>
parents: 5664
diff changeset
13
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
14 import roundup.instance
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
15 from roundup.cgi import TranslationService
5409
277e91bf7936 Python 3 preparation: update BaseHTTPServer imports.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
16 from roundup.anypy import http_
6083
f74d078cfd9a issue2551019 needs to be handled in the action code itself, not the WSGI handler
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6080
diff changeset
17 from roundup.anypy.strings import s2b
5945
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
18
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
19 from roundup.cgi.client import BinaryFieldStorage
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
20
5409
277e91bf7936 Python 3 preparation: update BaseHTTPServer imports.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
21 BaseHTTPRequestHandler = http_.server.BaseHTTPRequestHandler
277e91bf7936 Python 3 preparation: update BaseHTTPServer imports.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
22 DEFAULT_ERROR_MESSAGE = http_.server.DEFAULT_ERROR_MESSAGE
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
23
6061
82816000aef3 Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents: 5945
diff changeset
24
5821
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
25 class Headers(object):
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
26 """ Idea more or less stolen from the 'apache.py' in same directory.
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
27 Except that wsgi stores http headers in environment.
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
28 """
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
29 def __init__(self, environ):
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
30 self.environ = environ
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
31
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
32 def mangle_name(self, name):
5823
edd9e2c67785 Make REST-API updates work with WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5821
diff changeset
33 """ Content-Type is handled specially, it doesn't have a HTTP_
edd9e2c67785 Make REST-API updates work with WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5821
diff changeset
34 prefix in cgi.
edd9e2c67785 Make REST-API updates work with WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5821
diff changeset
35 """
5821
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
36 n = name.replace('-', '_').upper()
5823
edd9e2c67785 Make REST-API updates work with WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5821
diff changeset
37 if n == 'CONTENT_TYPE':
edd9e2c67785 Make REST-API updates work with WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5821
diff changeset
38 return n
5821
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
39 return 'HTTP_' + n
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
40
6061
82816000aef3 Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents: 5945
diff changeset
41 def get(self, name, default=None):
5821
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
42 return self.environ.get(self.mangle_name(name), default)
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
43 getheader = get
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44
6061
82816000aef3 Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents: 5945
diff changeset
45
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46 class Writer(object):
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
47 '''Perform a start_response if need be when we start writing.'''
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
48 def __init__(self, request):
6061
82816000aef3 Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents: 5945
diff changeset
49 self.request = request #weakref.ref(request)
82816000aef3 Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents: 5945
diff changeset
50
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
51 def write(self, data):
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
52 f = self.request.get_wfile()
6083
f74d078cfd9a issue2551019 needs to be handled in the action code itself, not the WSGI handler
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6080
diff changeset
53 self.write = f
5609
dccf9b7e5ee4 Fix CSV export with WSGI and Python 3 (issue2551019).
Tom Ekberg <tekberg@uw.edu>
parents: 5539
diff changeset
54 return self.write(data)
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
55
6061
82816000aef3 Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents: 5945
diff changeset
56
6084
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
57 class RequestHandler(object):
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
58 def __init__(self, environ, start_response):
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
59 self.__start_response = start_response
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
60 self.__wfile = None
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
61 self.headers = Headers(environ)
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
62 self.rfile, self.wfile = None, Writer(self)
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
63
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
64 def start_response(self, headers, response_code):
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
65 """Set HTTP response code"""
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
66 message, explain = BaseHTTPRequestHandler.responses[response_code]
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
67 self.__wfile = self.__start_response('%d %s' % (response_code,
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
68 message), headers)
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
69
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
70 def get_wfile(self):
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
71 if self.__wfile is None:
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
72 raise ValueError('start_response() not called')
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
73 return self.__wfile
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
74
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
75
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
76 class RequestDispatcher(object):
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
77 def __init__(self, home, debug=False, timing=False, lang=None):
6061
82816000aef3 Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents: 5945
diff changeset
78 assert os.path.isdir(home), '%r is not a directory' % (home,)
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
79 self.home = home
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
80 self.debug = debug
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
81 self.timing = timing
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
82 if lang:
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
83 self.translator = TranslationService.get_translation(lang,
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
84 tracker_home=home)
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
85 else:
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
86 self.translator = None
6326
0343b6fea4b9 Factor preloading into a preload method
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6321
diff changeset
87 self.preload()
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
88
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
89 def __call__(self, environ, start_response):
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
90 """Initialize with `apache.Request` object"""
6084
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
91 request = RequestHandler(environ, start_response)
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
92
6061
82816000aef3 Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents: 5945
diff changeset
93 if environ['REQUEST_METHOD'] == 'OPTIONS':
5945
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
94 if environ["PATH_INFO"][:5] == "/rest":
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
95 # rest does support options
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
96 # This I hope will result in self.form=None
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
97 environ['CONTENT_LENGTH'] = 0
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
98 else:
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
99 code = 501
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
100 message, explain = BaseHTTPRequestHandler.responses[code]
6387
0da655d1498d Remove Connection: close header for 501 error handling rest
John Rouillard <rouilj@ieee.org>
parents: 6326
diff changeset
101 request.start_response([('Content-Type', 'text/html')],
0da655d1498d Remove Connection: close header for 501 error handling rest
John Rouillard <rouilj@ieee.org>
parents: 6326
diff changeset
102 code)
5945
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
103 request.wfile.write(s2b(DEFAULT_ERROR_MESSAGE % locals()))
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
104 return []
6061
82816000aef3 Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents: 5945
diff changeset
105
6084
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
106 # need to strip the leading '/'
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
107 environ["PATH_INFO"] = environ["PATH_INFO"][1:]
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
108 if self.timing:
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
109 environ["CGI_SHOW_TIMING"] = self.timing
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
110
6084
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
111 if environ['REQUEST_METHOD'] in ("OPTIONS", "DELETE"):
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
112 # these methods have no data. When we init tracker.Client
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
113 # set form to None to get a properly initialized empty
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
114 # form.
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
115 form = None
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
116 else:
6080
274c2c082f68 factor out get_tracker so we can potentially customise if we want to reuse
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6061
diff changeset
117 form = BinaryFieldStorage(fp=environ['wsgi.input'], environ=environ)
5945
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
118
6084
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
119 with self.get_tracker() as tracker:
6080
274c2c082f68 factor out get_tracker so we can potentially customise if we want to reuse
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6061
diff changeset
120 client = tracker.Client(tracker, request, environ, form,
6084
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
121 self.translator)
6080
274c2c082f68 factor out get_tracker so we can potentially customise if we want to reuse
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6061
diff changeset
122 try:
274c2c082f68 factor out get_tracker so we can potentially customise if we want to reuse
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6061
diff changeset
123 client.main()
274c2c082f68 factor out get_tracker so we can potentially customise if we want to reuse
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6061
diff changeset
124 except roundup.cgi.client.NotFound:
274c2c082f68 factor out get_tracker so we can potentially customise if we want to reuse
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6061
diff changeset
125 request.start_response([('Content-Type', 'text/html')], 404)
274c2c082f68 factor out get_tracker so we can potentially customise if we want to reuse
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6061
diff changeset
126 request.wfile.write(s2b('Not found: %s' %
274c2c082f68 factor out get_tracker so we can potentially customise if we want to reuse
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6061
diff changeset
127 html_escape(client.path)))
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
128
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
129 # all body data has been written using wfile
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
130 return []
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
131
6326
0343b6fea4b9 Factor preloading into a preload method
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6321
diff changeset
132 def preload(self):
0343b6fea4b9 Factor preloading into a preload method
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6321
diff changeset
133 """ Trigger pre-loading of imports and templates """
0343b6fea4b9 Factor preloading into a preload method
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6321
diff changeset
134 with self.get_tracker():
0343b6fea4b9 Factor preloading into a preload method
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6321
diff changeset
135 pass
0343b6fea4b9 Factor preloading into a preload method
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6321
diff changeset
136
6080
274c2c082f68 factor out get_tracker so we can potentially customise if we want to reuse
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6061
diff changeset
137 @contextmanager
274c2c082f68 factor out get_tracker so we can potentially customise if we want to reuse
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6061
diff changeset
138 def get_tracker(self):
274c2c082f68 factor out get_tracker so we can potentially customise if we want to reuse
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6061
diff changeset
139 # get a new instance for each request
274c2c082f68 factor out get_tracker so we can potentially customise if we want to reuse
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6061
diff changeset
140 yield roundup.instance.open(self.home, not self.debug)

Roundup Issue Tracker: http://roundup-tracker.org/