annotate roundup/cgi/wsgi_handler.py @ 7864:b080cdb8b199

fix: document/fix wrapped HtmlProperty method. The wrapped method was not documented in reference.txt. It is now documented in reference.txt. The docstring documented that it would not break up long words. Fixed by adding break_long_words=False to prevent breaking string longer than the wrap length. Wrapping was breaking the hyperlinking of long urls. Added columns argument to set the wrap length (default 80 columns).
author John Rouillard <rouilj@ieee.org>
date Sun, 07 Apr 2024 15:27:18 -0400
parents dbeb6bf056c7
children 14c7c07b32d8
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
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
8 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
9
7820
da4c51effdfd chore(lint): fix imports, normalize trailing , on list/tuple
John Rouillard <rouilj@ieee.org>
parents: 7819
diff changeset
10 import roundup.instance
da4c51effdfd chore(lint): fix imports, normalize trailing , on list/tuple
John Rouillard <rouilj@ieee.org>
parents: 7819
diff changeset
11 from roundup.anypy import http_
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
7820
da4c51effdfd chore(lint): fix imports, normalize trailing , on list/tuple
John Rouillard <rouilj@ieee.org>
parents: 7819
diff changeset
13 from roundup.anypy.strings import s2b
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
14 from roundup.cgi import TranslationService
5945
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
15 from roundup.cgi.client import BinaryFieldStorage
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
16
5409
277e91bf7936 Python 3 preparation: update BaseHTTPServer imports.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
17 BaseHTTPRequestHandler = http_.server.BaseHTTPRequestHandler
277e91bf7936 Python 3 preparation: update BaseHTTPServer imports.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
18 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
19
7556
273c8c2b5042 fix(api): - issue2551063 - Rest/Xmlrpc interfaces needs failed login protection.
John Rouillard <rouilj@ieee.org>
parents: 7228
diff changeset
20 try:
273c8c2b5042 fix(api): - issue2551063 - Rest/Xmlrpc interfaces needs failed login protection.
John Rouillard <rouilj@ieee.org>
parents: 7228
diff changeset
21 # python2 is missing this definition
273c8c2b5042 fix(api): - issue2551063 - Rest/Xmlrpc interfaces needs failed login protection.
John Rouillard <rouilj@ieee.org>
parents: 7228
diff changeset
22 http_.server.BaseHTTPRequestHandler.responses[429]
273c8c2b5042 fix(api): - issue2551063 - Rest/Xmlrpc interfaces needs failed login protection.
John Rouillard <rouilj@ieee.org>
parents: 7228
diff changeset
23 except KeyError:
273c8c2b5042 fix(api): - issue2551063 - Rest/Xmlrpc interfaces needs failed login protection.
John Rouillard <rouilj@ieee.org>
parents: 7228
diff changeset
24 http_.server.BaseHTTPRequestHandler.responses[429] = (
273c8c2b5042 fix(api): - issue2551063 - Rest/Xmlrpc interfaces needs failed login protection.
John Rouillard <rouilj@ieee.org>
parents: 7228
diff changeset
25 'Too Many Requests',
273c8c2b5042 fix(api): - issue2551063 - Rest/Xmlrpc interfaces needs failed login protection.
John Rouillard <rouilj@ieee.org>
parents: 7228
diff changeset
26 'The user has sent too many requests in '
7820
da4c51effdfd chore(lint): fix imports, normalize trailing , on list/tuple
John Rouillard <rouilj@ieee.org>
parents: 7819
diff changeset
27 'a given amount of time ("rate limiting")',
7556
273c8c2b5042 fix(api): - issue2551063 - Rest/Xmlrpc interfaces needs failed login protection.
John Rouillard <rouilj@ieee.org>
parents: 7228
diff changeset
28 )
6061
82816000aef3 Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents: 5945
diff changeset
29
7834
dbeb6bf056c7 chore(lint): _ unused var; replace assert wth if/raise; whitespace
John Rouillard <rouilj@ieee.org>
parents: 7820
diff changeset
30
5821
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
31 class Headers(object):
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
32 """ 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
33 Except that wsgi stores http headers in environment.
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
34 """
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
35 def __init__(self, environ):
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
36 self.environ = environ
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
37
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
38 def mangle_name(self, name):
5823
edd9e2c67785 Make REST-API updates work with WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5821
diff changeset
39 """ 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
40 prefix in cgi.
edd9e2c67785 Make REST-API updates work with WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5821
diff changeset
41 """
5821
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
42 n = name.replace('-', '_').upper()
5823
edd9e2c67785 Make REST-API updates work with WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5821
diff changeset
43 if n == 'CONTENT_TYPE':
edd9e2c67785 Make REST-API updates work with WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5821
diff changeset
44 return n
5821
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
45 return 'HTTP_' + n
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
46
6061
82816000aef3 Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents: 5945
diff changeset
47 def get(self, name, default=None):
5821
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
48 return self.environ.get(self.mangle_name(name), default)
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
49 getheader = get
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
50
6061
82816000aef3 Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents: 5945
diff changeset
51
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
52 class Writer(object):
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
53 '''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
54 def __init__(self, request):
7228
07ce4e4110f5 flake8 fixes: whitespace, remove unused imports
John Rouillard <rouilj@ieee.org>
parents: 6747
diff changeset
55 self.request = request # weakref.ref(request)
6061
82816000aef3 Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents: 5945
diff changeset
56
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
57 def write(self, data):
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
58 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
59 self.write = f
5609
dccf9b7e5ee4 Fix CSV export with WSGI and Python 3 (issue2551019).
Tom Ekberg <tekberg@uw.edu>
parents: 5539
diff changeset
60 return self.write(data)
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
61
6061
82816000aef3 Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents: 5945
diff changeset
62
6084
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
63 class RequestHandler(object):
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
64 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
65 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
66 self.__wfile = None
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
67 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
68 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
69
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
70 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
71 """Set HTTP response code"""
7834
dbeb6bf056c7 chore(lint): _ unused var; replace assert wth if/raise; whitespace
John Rouillard <rouilj@ieee.org>
parents: 7820
diff changeset
72 message, _explain = BaseHTTPRequestHandler.responses[response_code]
6084
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
73 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
74 message), headers)
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
75
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
76 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
77 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
78 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
79 return self.__wfile
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
80
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
81
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
82 class RequestDispatcher(object):
6747
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
83 def __init__(self, home, debug=False, timing=False, lang=None,
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
84 feature_flags=None):
7834
dbeb6bf056c7 chore(lint): _ unused var; replace assert wth if/raise; whitespace
John Rouillard <rouilj@ieee.org>
parents: 7820
diff changeset
85 if not os.path.isdir(home):
dbeb6bf056c7 chore(lint): _ unused var; replace assert wth if/raise; whitespace
John Rouillard <rouilj@ieee.org>
parents: 7820
diff changeset
86 raise ValueError('%r is not a directory' % (home,))
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
87 self.home = home
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
88 self.debug = debug
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
89 self.timing = timing
7228
07ce4e4110f5 flake8 fixes: whitespace, remove unused imports
John Rouillard <rouilj@ieee.org>
parents: 6747
diff changeset
90 self.feature_flags = feature_flags or {}
6747
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
91 self.tracker = None
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
92 if lang:
7228
07ce4e4110f5 flake8 fixes: whitespace, remove unused imports
John Rouillard <rouilj@ieee.org>
parents: 6747
diff changeset
93 self.translator = TranslationService.get_translation(
07ce4e4110f5 flake8 fixes: whitespace, remove unused imports
John Rouillard <rouilj@ieee.org>
parents: 6747
diff changeset
94 lang,
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
95 tracker_home=home)
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
96 else:
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
97 self.translator = None
6747
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
98
7819
0fe2b9f6e19f issue2551212 - enable wsgi cache_tracker by default
John Rouillard <rouilj@ieee.org>
parents: 7556
diff changeset
99 if "cache_tracker" not in self.feature_flags or \
0fe2b9f6e19f issue2551212 - enable wsgi cache_tracker by default
John Rouillard <rouilj@ieee.org>
parents: 7556
diff changeset
100 self.feature_flags["cache_tracker"] is not False:
6747
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
101 self.tracker = roundup.instance.open(self.home, not self.debug)
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
102 else:
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
103 self.preload()
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
104
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
105 def __call__(self, environ, start_response):
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
106 """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
107 request = RequestHandler(environ, start_response)
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
108
6061
82816000aef3 Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents: 5945
diff changeset
109 if environ['REQUEST_METHOD'] == 'OPTIONS':
5945
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
110 if environ["PATH_INFO"][:5] == "/rest":
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
111 # rest does support options
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
112 # 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
113 environ['CONTENT_LENGTH'] = 0
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
114 else:
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
115 code = 501
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
116 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
117 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
118 code)
5945
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
119 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
120 return []
6061
82816000aef3 Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents: 5945
diff changeset
121
6084
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
122 # 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
123 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
124 if self.timing:
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
125 environ["CGI_SHOW_TIMING"] = self.timing
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
126
6084
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
127 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
128 # 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
129 # 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
130 # form.
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
131 form = None
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
132 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
133 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
134
7819
0fe2b9f6e19f issue2551212 - enable wsgi cache_tracker by default
John Rouillard <rouilj@ieee.org>
parents: 7556
diff changeset
135 if "cache_tracker" not in self.feature_flags or \
0fe2b9f6e19f issue2551212 - enable wsgi cache_tracker by default
John Rouillard <rouilj@ieee.org>
parents: 7556
diff changeset
136 self.feature_flags["cache_tracker"] is not False:
6747
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
137 client = self.tracker.Client(self.tracker, request, environ, form,
7228
07ce4e4110f5 flake8 fixes: whitespace, remove unused imports
John Rouillard <rouilj@ieee.org>
parents: 6747
diff changeset
138 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
139 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
140 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
141 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
142 request.start_response([('Content-Type', 'text/html')], 404)
7228
07ce4e4110f5 flake8 fixes: whitespace, remove unused imports
John Rouillard <rouilj@ieee.org>
parents: 6747
diff changeset
143 request.wfile.write(s2b('Not found: %s' %
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
144 html_escape(client.path)))
6747
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
145 else:
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
146 with self.get_tracker() as tracker:
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
147 client = tracker.Client(tracker, request, environ, form,
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
148 self.translator)
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
149 try:
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
150 client.main()
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
151 except roundup.cgi.client.NotFound:
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
152 request.start_response([('Content-Type', 'text/html')], 404)
7228
07ce4e4110f5 flake8 fixes: whitespace, remove unused imports
John Rouillard <rouilj@ieee.org>
parents: 6747
diff changeset
153 request.wfile.write(s2b('Not found: %s' %
6747
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
154 html_escape(client.path)))
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
155
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
156 # 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
157 return []
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
158
6326
0343b6fea4b9 Factor preloading into a preload method
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6321
diff changeset
159 def preload(self):
0343b6fea4b9 Factor preloading into a preload method
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6321
diff changeset
160 """ Trigger pre-loading of imports and templates """
0343b6fea4b9 Factor preloading into a preload method
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6321
diff changeset
161 with self.get_tracker():
0343b6fea4b9 Factor preloading into a preload method
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6321
diff changeset
162 pass
0343b6fea4b9 Factor preloading into a preload method
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6321
diff changeset
163
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
164 @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
165 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
166 # 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
167 yield roundup.instance.open(self.home, not self.debug)

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