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

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