httpsrv.py 文件源码

python
阅读 20 收藏 0 点赞 0 评论 0

项目:httpsrv 作者: nyrkovalex 项目源码 文件源码
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
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号