def _create_handler_class(rules, always_rules):
class _Handler(BaseHTTPRequestHandler):
known_methods = set()
@classmethod
def add_method(cls, method):
'''
Adds a handler function for HTTP method provided
'''
if method in cls.known_methods:
return
func = lambda self: cls._handle(self, method)
setattr(cls, 'do_' + method, func)
cls.known_methods.add(method)
def _read_body(self):
if 'content-length' in self.headers:
length = int(self.headers['content-length'])
return self.rfile.read(length) if length > 0 else None
return None
def _respond(self, response):
self.send_response(response.code)
for key, value in response.headers.items():
self.send_header(key, value)
self.end_headers()
if response.bytes:
self.wfile.write(response.bytes)
def _handle(self, method):
body = self._read_body()
rule = self._respond_with_rules(method, body, rules)
if rule:
rules.remove(rule)
return
always_rule = self._respond_with_rules(method, body, always_rules)
if always_rule:
return
return self.send_error(
500, 'No matching rule found for ' + self.requestline + ' body ' + str(body))
def _respond_with_rules(self, method, body, rules):
matching_rules = [r for r in rules if r.matches(method, self.path, dict(self.headers), body)]
if matching_rules:
rule = matching_rules[0]
self._respond(rule.response)
return rule
return None
for rule in rules:
_Handler.add_method(rule.method)
return _Handler
评论列表
文章目录