Пример #1
0
 def run(self):
     util.inject_logger(self)
     util.fork(self.blocking_run)
Пример #2
0
def make_request_handler(router, rpc_class):

    rpc = rpc_class(router)

    class ReqestHandler(BaseHTTPRequestHandler):

        _acceptable_content_types = ['application/json']
        _required_keys = ['id', 'method', 'params']

        _jsonrpc_version = '1.0'

        _json_blank_response =  {'result' : None, 'error' : None, 'id' : None}
        _json_invalid_request = {'error' : -32600, 'id' : None}
        _json_parse_error = {'error' : -32700, 'id' : None}
        _json_no_such_method = {'error' : -32601, 'id' : None}
        _json_internal_error = {'error' : -32603, 'id' : None}
        
        def _parse_json(self):
            size = self.headers.getheader('Content-Length',0)
            try:
                size = int(size)
                if size > 0:
                    data = self.rfile.read(size)
                    self.json = json.loads(data)
                    return True
            except:
                self.send_error(400)
                
            
        def _check_keys(self):
            for k in self._required_keys:
                if k not in self.json:
                    return False
            return True

        def do_GET(self):
            self.send_error(400)

        def do_POST(self):
            if self.path == '/rpc':
                if self.headers.getheader('Content-Type','').lower() in self._acceptable_content_types:
                    if self._parse_json():
                        if self._check_keys():
                            j = dict(self._json_blank_response)
                            method = self.json['method']
                            params = self.json['params']
                            if rpc.has_method(method):
                                rpc_method = rpc.get_method(method)
                                try:
                                    if isinstance(params, dict):
                                        j['result'] = rpc_method(**params)
                                    elif isinstance(params, list):
                                        j['result'] = rpc_method(*params)
                                    else:
                                        raise Exception()
                                except Exception as e:
                                    self._log.error(e)
                                    j = dict(self._json_internal_error)
                            else:
                                j = dict(self._json_no_such_method)                                    
                            j['id'] = self.json['id']
                        else:
                            j = dict(self._json_invalid_request)
                    else:
                        j = dict(self._json_parse_error)
                    j['jsonrpc'] = self._jsonrpc_version
                    body = json.dumps(j)
                    self.send_response(200)
                    self.send_header('Content-Type',self._acceptable_content_types[0])
                    self.send_header('Content-Length', len(body))
                    self.end_headers()
                    self.wfile.write(body)
                    
            else:
                self.send_response(404,'NOT FOUND')

    util.inject_logger(ReqestHandler,'JsonRPC')
    return ReqestHandler