Mercurial > p > roundup > code
annotate roundup/cgi/wsgi_handler.py @ 5409:277e91bf7936
Python 3 preparation: update BaseHTTPServer imports.
roundup/anypy/http_.py extended and used in more places. Manual
patch.
| author | Joseph Myers <jsm@polyomino.org.uk> |
|---|---|
| date | Wed, 25 Jul 2018 00:17:07 +0000 |
| parents | 35ea9b1efc14 |
| children | 3a07c57d72bb |
| 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 cgi |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
9 import weakref |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
10 |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
11 import roundup.instance |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
12 from roundup.cgi import TranslationService |
|
5409
277e91bf7936
Python 3 preparation: update BaseHTTPServer imports.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5378
diff
changeset
|
13 from roundup.anypy import http_ |
|
277e91bf7936
Python 3 preparation: update BaseHTTPServer imports.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5378
diff
changeset
|
14 BaseHTTPRequestHandler = http_.server.BaseHTTPRequestHandler |
|
277e91bf7936
Python 3 preparation: update BaseHTTPServer imports.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5378
diff
changeset
|
15 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
|
16 |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
17 |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
18 class Writer(object): |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
19 '''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
|
20 def __init__(self, request): |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
21 self.request = request #weakref.ref(request) |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
22 def write(self, data): |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
23 f = self.request.get_wfile() |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
24 self.write = f |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
25 return f(data) |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
26 |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
27 class RequestDispatcher(object): |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
28 def __init__(self, home, debug=False, timing=False, lang=None): |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
29 assert os.path.isdir(home), '%r is not a directory'%(home,) |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
30 self.home = home |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
31 self.debug = debug |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
32 self.timing = timing |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
33 if lang: |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
34 self.translator = TranslationService.get_translation(lang, |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
35 tracker_home=home) |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
36 else: |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
37 self.translator = None |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
38 |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
39 def __call__(self, environ, start_response): |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
40 """Initialize with `apache.Request` object""" |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
41 self.environ = environ |
|
3990
0728808fdf5c
make WSGI threadsafe
Richard Jones <richard@users.sourceforge.net>
parents:
3736
diff
changeset
|
42 request = RequestDispatcher(self.home, self.debug, self.timing) |
|
0728808fdf5c
make WSGI threadsafe
Richard Jones <richard@users.sourceforge.net>
parents:
3736
diff
changeset
|
43 request.__start_response = start_response |
|
3736
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
44 |
|
3990
0728808fdf5c
make WSGI threadsafe
Richard Jones <richard@users.sourceforge.net>
parents:
3736
diff
changeset
|
45 request.wfile = Writer(request) |
|
0728808fdf5c
make WSGI threadsafe
Richard Jones <richard@users.sourceforge.net>
parents:
3736
diff
changeset
|
46 request.__wfile = None |
|
3736
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
47 |
|
4292
859ab007829f
Handle OPTIONS http request method in wsgi handler, fixes issue2550587.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3990
diff
changeset
|
48 if environ ['REQUEST_METHOD'] == 'OPTIONS': |
|
859ab007829f
Handle OPTIONS http request method in wsgi handler, fixes issue2550587.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3990
diff
changeset
|
49 code = 501 |
|
859ab007829f
Handle OPTIONS http request method in wsgi handler, fixes issue2550587.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3990
diff
changeset
|
50 message, explain = BaseHTTPRequestHandler.responses[code] |
|
859ab007829f
Handle OPTIONS http request method in wsgi handler, fixes issue2550587.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3990
diff
changeset
|
51 request.start_response([('Content-Type', 'text/html'), |
|
859ab007829f
Handle OPTIONS http request method in wsgi handler, fixes issue2550587.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3990
diff
changeset
|
52 ('Connection', 'close')], code) |
|
859ab007829f
Handle OPTIONS http request method in wsgi handler, fixes issue2550587.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3990
diff
changeset
|
53 request.wfile.write(DEFAULT_ERROR_MESSAGE % locals()) |
|
859ab007829f
Handle OPTIONS http request method in wsgi handler, fixes issue2550587.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3990
diff
changeset
|
54 return [] |
|
859ab007829f
Handle OPTIONS http request method in wsgi handler, fixes issue2550587.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3990
diff
changeset
|
55 |
|
3736
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
56 tracker = roundup.instance.open(self.home, not self.debug) |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
57 |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
58 # need to strip the leading '/' |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
59 environ["PATH_INFO"] = environ["PATH_INFO"][1:] |
|
3990
0728808fdf5c
make WSGI threadsafe
Richard Jones <richard@users.sourceforge.net>
parents:
3736
diff
changeset
|
60 if request.timing: |
|
0728808fdf5c
make WSGI threadsafe
Richard Jones <richard@users.sourceforge.net>
parents:
3736
diff
changeset
|
61 environ["CGI_SHOW_TIMING"] = request.timing |
|
3736
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
62 |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
63 form = cgi.FieldStorage(fp=environ['wsgi.input'], environ=environ) |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
64 |
|
3990
0728808fdf5c
make WSGI threadsafe
Richard Jones <richard@users.sourceforge.net>
parents:
3736
diff
changeset
|
65 client = tracker.Client(tracker, request, environ, form, |
|
0728808fdf5c
make WSGI threadsafe
Richard Jones <richard@users.sourceforge.net>
parents:
3736
diff
changeset
|
66 request.translator) |
|
3736
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
67 try: |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
68 client.main() |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
69 except roundup.cgi.client.NotFound: |
|
3990
0728808fdf5c
make WSGI threadsafe
Richard Jones <richard@users.sourceforge.net>
parents:
3736
diff
changeset
|
70 request.start_response([('Content-Type', 'text/html')], 404) |
|
0728808fdf5c
make WSGI threadsafe
Richard Jones <richard@users.sourceforge.net>
parents:
3736
diff
changeset
|
71 request.wfile.write('Not found: %s'%client.path) |
|
3736
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
72 |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
73 # 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
|
74 return [] |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
75 |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
76 def start_response(self, headers, response_code): |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
77 """Set HTTP response code""" |
|
4303
7aa72c31464d
Fix WSGI response code (thanks Peter Pöml)
Richard Jones <richard@users.sourceforge.net>
parents:
4292
diff
changeset
|
78 message, explain = BaseHTTPRequestHandler.responses[response_code] |
|
3736
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
79 self.__wfile = self.__start_response('%d %s'%(response_code, |
|
4303
7aa72c31464d
Fix WSGI response code (thanks Peter Pöml)
Richard Jones <richard@users.sourceforge.net>
parents:
4292
diff
changeset
|
80 message), headers) |
|
3736
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
81 |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
82 def get_wfile(self): |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
83 if self.__wfile is None: |
|
5378
35ea9b1efc14
Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents:
4303
diff
changeset
|
84 raise ValueError('start_response() not called') |
|
3736
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
85 return self.__wfile |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
86 |
