Mercurial > p > roundup > code
comparison roundup/cgi/wsgi_handler.py @ 6061:82816000aef3
Flake8 whitespace changes, removal of unused import cgi.
| author | John Rouillard <rouilj@ieee.org> |
|---|---|
| date | Fri, 17 Jan 2020 20:25:39 -0500 |
| parents | 40f5b20d1e70 |
| children | 274c2c082f68 |
comparison
equal
deleted
inserted
replaced
| 6060:1045b8eb0a3b | 6061:82816000aef3 |
|---|---|
| 3 # This module is free software, you may redistribute it | 3 # This module is free software, you may redistribute it |
| 4 # and/or modify under the same terms as Python. | 4 # and/or modify under the same terms as Python. |
| 5 # | 5 # |
| 6 | 6 |
| 7 import os | 7 import os |
| 8 import cgi | |
| 9 import weakref | 8 import weakref |
| 10 | 9 |
| 11 from roundup.anypy.html import html_escape | 10 from roundup.anypy.html import html_escape |
| 12 | 11 |
| 13 import roundup.instance | 12 import roundup.instance |
| 17 | 16 |
| 18 from roundup.cgi.client import BinaryFieldStorage | 17 from roundup.cgi.client import BinaryFieldStorage |
| 19 | 18 |
| 20 BaseHTTPRequestHandler = http_.server.BaseHTTPRequestHandler | 19 BaseHTTPRequestHandler = http_.server.BaseHTTPRequestHandler |
| 21 DEFAULT_ERROR_MESSAGE = http_.server.DEFAULT_ERROR_MESSAGE | 20 DEFAULT_ERROR_MESSAGE = http_.server.DEFAULT_ERROR_MESSAGE |
| 21 | |
| 22 | 22 |
| 23 class Headers(object): | 23 class Headers(object): |
| 24 """ Idea more or less stolen from the 'apache.py' in same directory. | 24 """ Idea more or less stolen from the 'apache.py' in same directory. |
| 25 Except that wsgi stores http headers in environment. | 25 Except that wsgi stores http headers in environment. |
| 26 """ | 26 """ |
| 34 n = name.replace('-', '_').upper() | 34 n = name.replace('-', '_').upper() |
| 35 if n == 'CONTENT_TYPE': | 35 if n == 'CONTENT_TYPE': |
| 36 return n | 36 return n |
| 37 return 'HTTP_' + n | 37 return 'HTTP_' + n |
| 38 | 38 |
| 39 def get(self, name, default = None): | 39 def get(self, name, default=None): |
| 40 return self.environ.get(self.mangle_name(name), default) | 40 return self.environ.get(self.mangle_name(name), default) |
| 41 getheader = get | 41 getheader = get |
| 42 | |
| 42 | 43 |
| 43 class Writer(object): | 44 class Writer(object): |
| 44 '''Perform a start_response if need be when we start writing.''' | 45 '''Perform a start_response if need be when we start writing.''' |
| 45 def __init__(self, request): | 46 def __init__(self, request): |
| 46 self.request = request #weakref.ref(request) | 47 self.request = request #weakref.ref(request) |
| 48 | |
| 47 def write(self, data): | 49 def write(self, data): |
| 48 f = self.request.get_wfile() | 50 f = self.request.get_wfile() |
| 49 self.write = lambda data: f(bs2b(data)) | 51 self.write = lambda data: f(bs2b(data)) |
| 50 return self.write(data) | 52 return self.write(data) |
| 51 | 53 |
| 54 | |
| 52 class RequestDispatcher(object): | 55 class RequestDispatcher(object): |
| 53 def __init__(self, home, debug=False, timing=False, lang=None): | 56 def __init__(self, home, debug=False, timing=False, lang=None): |
| 54 assert os.path.isdir(home), '%r is not a directory'%(home,) | 57 assert os.path.isdir(home), '%r is not a directory' % (home,) |
| 55 self.home = home | 58 self.home = home |
| 56 self.debug = debug | 59 self.debug = debug |
| 57 self.timing = timing | 60 self.timing = timing |
| 58 if lang: | 61 if lang: |
| 59 self.translator = TranslationService.get_translation(lang, | 62 self.translator = TranslationService.get_translation(lang, |
| 69 | 72 |
| 70 request.wfile = Writer(request) | 73 request.wfile = Writer(request) |
| 71 request.__wfile = None | 74 request.__wfile = None |
| 72 request.headers = Headers(environ) | 75 request.headers = Headers(environ) |
| 73 | 76 |
| 74 if environ ['REQUEST_METHOD'] == 'OPTIONS': | 77 if environ['REQUEST_METHOD'] == 'OPTIONS': |
| 75 if environ["PATH_INFO"][:5] == "/rest": | 78 if environ["PATH_INFO"][:5] == "/rest": |
| 76 # rest does support options | 79 # rest does support options |
| 77 # This I hope will result in self.form=None | 80 # This I hope will result in self.form=None |
| 78 environ['CONTENT_LENGTH'] = 0 | 81 environ['CONTENT_LENGTH'] = 0 |
| 79 else: | 82 else: |
| 81 message, explain = BaseHTTPRequestHandler.responses[code] | 84 message, explain = BaseHTTPRequestHandler.responses[code] |
| 82 request.start_response([('Content-Type', 'text/html'), | 85 request.start_response([('Content-Type', 'text/html'), |
| 83 ('Connection', 'close')], code) | 86 ('Connection', 'close')], code) |
| 84 request.wfile.write(s2b(DEFAULT_ERROR_MESSAGE % locals())) | 87 request.wfile.write(s2b(DEFAULT_ERROR_MESSAGE % locals())) |
| 85 return [] | 88 return [] |
| 86 | 89 |
| 87 tracker = roundup.instance.open(self.home, not self.debug) | 90 tracker = roundup.instance.open(self.home, not self.debug) |
| 88 | 91 |
| 89 # need to strip the leading '/' | 92 # need to strip the leading '/' |
| 90 environ["PATH_INFO"] = environ["PATH_INFO"][1:] | 93 environ["PATH_INFO"] = environ["PATH_INFO"][1:] |
| 91 if request.timing: | 94 if request.timing: |
| 92 environ["CGI_SHOW_TIMING"] = request.timing | 95 environ["CGI_SHOW_TIMING"] = request.timing |
| 93 | 96 |
| 94 form = BinaryFieldStorage(fp=environ['wsgi.input'], environ=environ) | 97 form = BinaryFieldStorage(fp=environ['wsgi.input'], environ=environ) |
| 95 | 98 |
| 96 if environ ['REQUEST_METHOD'] in ("OPTIONS", "DELETE"): | 99 if environ['REQUEST_METHOD'] in ("OPTIONS", "DELETE"): |
| 97 # these methods have no data. When we init tracker.Client | 100 # these methods have no data. When we init tracker.Client |
| 98 # set form to None and request.rfile to None to get a | 101 # set form to None and request.rfile to None to get a |
| 99 # properly initialized empty form. | 102 # properly initialized empty form. |
| 100 form = None | 103 form = None |
| 101 request.rfile = None | 104 request.rfile = None |
| 102 | 105 |
| 103 client = tracker.Client(tracker, request, environ, form, | 106 client = tracker.Client(tracker, request, environ, form, |
| 104 request.translator) | 107 request.translator) |
| 105 try: | 108 try: |
| 106 client.main() | 109 client.main() |
| 107 except roundup.cgi.client.NotFound: | 110 except roundup.cgi.client.NotFound: |
| 108 request.start_response([('Content-Type', 'text/html')], 404) | 111 request.start_response([('Content-Type', 'text/html')], 404) |
| 109 request.wfile.write(s2b('Not found: %s'%html_escape(client.path))) | 112 request.wfile.write(s2b('Not found: %s' % |
| 113 html_escape(client.path))) | |
| 110 | 114 |
| 111 # all body data has been written using wfile | 115 # all body data has been written using wfile |
| 112 return [] | 116 return [] |
| 113 | 117 |
| 114 def start_response(self, headers, response_code): | 118 def start_response(self, headers, response_code): |
| 115 """Set HTTP response code""" | 119 """Set HTTP response code""" |
| 116 message, explain = BaseHTTPRequestHandler.responses[response_code] | 120 message, explain = BaseHTTPRequestHandler.responses[response_code] |
| 117 self.__wfile = self.__start_response('%d %s'%(response_code, | 121 self.__wfile = self.__start_response('%d %s' % (response_code, |
| 118 message), headers) | 122 message), headers) |
| 119 | 123 |
| 120 def get_wfile(self): | 124 def get_wfile(self): |
| 121 if self.__wfile is None: | 125 if self.__wfile is None: |
| 122 raise ValueError('start_response() not called') | 126 raise ValueError('start_response() not called') |
| 123 return self.__wfile | 127 return self.__wfile |
| 124 |
