Skip to content

Commit 168a6d4

Browse files
committed
reworked WSGI interface to not use the RequestDispatcher class for two
different purposes (but have a separate RequestHandler)
1 parent 59445db commit 168a6d4

File tree

1 file changed

+32
-33
lines changed

1 file changed

+32
-33
lines changed

roundup/cgi/wsgi_handler.py

Lines changed: 32 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,25 @@ def write(self, data):
5454
return self.write(data)
5555

5656

57+
class RequestHandler(object):
58+
def __init__(self, environ, start_response):
59+
self.__start_response = start_response
60+
self.__wfile = None
61+
self.headers = Headers(environ)
62+
self.rfile, self.wfile = None, Writer(self)
63+
64+
def start_response(self, headers, response_code):
65+
"""Set HTTP response code"""
66+
message, explain = BaseHTTPRequestHandler.responses[response_code]
67+
self.__wfile = self.__start_response('%d %s' % (response_code,
68+
message), headers)
69+
70+
def get_wfile(self):
71+
if self.__wfile is None:
72+
raise ValueError('start_response() not called')
73+
return self.__wfile
74+
75+
5776
class RequestDispatcher(object):
5877
def __init__(self, home, debug=False, timing=False, lang=None):
5978
assert os.path.isdir(home), '%r is not a directory' % (home,)
@@ -68,13 +87,7 @@ def __init__(self, home, debug=False, timing=False, lang=None):
6887

6988
def __call__(self, environ, start_response):
7089
"""Initialize with `apache.Request` object"""
71-
self.environ = environ
72-
request = RequestDispatcher(self.home, self.debug, self.timing)
73-
request.__start_response = start_response
74-
75-
request.wfile = Writer(request)
76-
request.__wfile = None
77-
request.headers = Headers(environ)
90+
request = RequestHandler(environ, start_response)
7891

7992
if environ['REQUEST_METHOD'] == 'OPTIONS':
8093
if environ["PATH_INFO"][:5] == "/rest":
@@ -89,25 +102,22 @@ def __call__(self, environ, start_response):
89102
request.wfile.write(s2b(DEFAULT_ERROR_MESSAGE % locals()))
90103
return []
91104

92-
tracker = roundup.instance.open(self.home, not self.debug)
93-
94-
with self.get_tracker() as tracker:
95-
# need to strip the leading '/'
96-
environ["PATH_INFO"] = environ["PATH_INFO"][1:]
97-
if request.timing:
98-
environ["CGI_SHOW_TIMING"] = request.timing
105+
# need to strip the leading '/'
106+
environ["PATH_INFO"] = environ["PATH_INFO"][1:]
107+
if self.timing:
108+
environ["CGI_SHOW_TIMING"] = self.timing
99109

110+
if environ['REQUEST_METHOD'] in ("OPTIONS", "DELETE"):
111+
# these methods have no data. When we init tracker.Client
112+
# set form to None to get a properly initialized empty
113+
# form.
114+
form = None
115+
else:
100116
form = BinaryFieldStorage(fp=environ['wsgi.input'], environ=environ)
101117

102-
if environ['REQUEST_METHOD'] in ("OPTIONS", "DELETE"):
103-
# these methods have no data. When we init tracker.Client
104-
# set form to None and request.rfile to None to get a
105-
# properly initialized empty form.
106-
form = None
107-
request.rfile = None
108-
118+
with self.get_tracker() as tracker:
109119
client = tracker.Client(tracker, request, environ, form,
110-
request.translator)
120+
self.translator)
111121
try:
112122
client.main()
113123
except roundup.cgi.client.NotFound:
@@ -118,17 +128,6 @@ def __call__(self, environ, start_response):
118128
# all body data has been written using wfile
119129
return []
120130

121-
def start_response(self, headers, response_code):
122-
"""Set HTTP response code"""
123-
message, explain = BaseHTTPRequestHandler.responses[response_code]
124-
self.__wfile = self.__start_response('%d %s' % (response_code,
125-
message), headers)
126-
127-
def get_wfile(self):
128-
if self.__wfile is None:
129-
raise ValueError('start_response() not called')
130-
return self.__wfile
131-
132131
@contextmanager
133132
def get_tracker(self):
134133
# get a new instance for each request

0 commit comments

Comments
 (0)