Move sessioncontroller from previous chaind-eth to session module
This commit is contained in:
parent
b77aafc7bc
commit
8c2905b801
@ -1,2 +1,18 @@
|
||||
class TxSourceError(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class NothingToDoError(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class ClientGoneError(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class ClientBlockError(BlockingIOError):
|
||||
pass
|
||||
|
||||
|
||||
class ClientInputError(ValueError):
|
||||
pass
|
||||
|
108
chaind/session.py
Normal file
108
chaind/session.py
Normal file
@ -0,0 +1,108 @@
|
||||
# standard imports
|
||||
import os
|
||||
import socket
|
||||
import logging
|
||||
import stat
|
||||
|
||||
# external imports
|
||||
from hexathon import strip_0x
|
||||
|
||||
# local imports
|
||||
from chaind.error import (
|
||||
NothingToDoError,
|
||||
ClientGoneError,
|
||||
ClientBlockError,
|
||||
ClientInputError,
|
||||
)
|
||||
|
||||
logg = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class SessionController:
|
||||
|
||||
def __init__(self, config, adapter, processor):
|
||||
self.dead = False
|
||||
os.makedirs(os.path.dirname(config.get('SESSION_SOCKET_PATH')), exist_ok=True)
|
||||
try:
|
||||
os.unlink(config.get('SESSION_SOCKET_PATH'))
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
self.socket_path = config.get('SESSION_SOCKET_PATH')
|
||||
|
||||
self.srv = socket.socket(family=socket.AF_UNIX, type=socket.SOCK_STREAM)
|
||||
self.srv.bind(config.get('SESSION_SOCKET_PATH'))
|
||||
self.srv.listen(2)
|
||||
self.srv.settimeout(float(config.get('SESSION_DISPATCH_DELAY')))
|
||||
self.processor = processor
|
||||
self.chain_spec = config.get('CHAIN_SPEC')
|
||||
self.adapter = adapter
|
||||
|
||||
|
||||
def shutdown(self, signo, frame):
|
||||
if self.dead:
|
||||
return
|
||||
self.dead = True
|
||||
if signo != None:
|
||||
logg.info('closing on {}'.format(signo))
|
||||
else:
|
||||
logg.info('explicit shutdown')
|
||||
sockname = self.srv.getsockname()
|
||||
self.srv.close()
|
||||
try:
|
||||
os.unlink(sockname)
|
||||
except FileNotFoundError:
|
||||
logg.warning('socket file {} already gone'.format(sockname))
|
||||
|
||||
|
||||
def get_connection(self):
|
||||
return self.srv.accept()
|
||||
|
||||
|
||||
def process(self, conn):
|
||||
r = self.processor(self.chain_spec, self.adapter, conn)
|
||||
if r > 0:
|
||||
self.srv.settimeout(0.1)
|
||||
else:
|
||||
self.srv.settimeout(4.0)
|
||||
|
||||
|
||||
def get(self):
|
||||
srvs = None
|
||||
try:
|
||||
logg.debug('getting connection')
|
||||
(srvs, srvs_addr) = self.get_connection()
|
||||
except OSError as e:
|
||||
try:
|
||||
fi = os.stat(self.socket_path)
|
||||
except FileNotFoundError:
|
||||
logg.error('socket is gone')
|
||||
raise ClientGoneError()
|
||||
if not stat.S_ISSOCK(fi.st_mode):
|
||||
logg.error('entity on socket path is not a socket')
|
||||
raise ClientGoneError()
|
||||
if srvs == None:
|
||||
logg.debug('timeout (remote socket is none)')
|
||||
raise NothingToDoError()
|
||||
|
||||
self.srv.settimeout(0.1)
|
||||
srvs.settimeout(0.1)
|
||||
data_in = None
|
||||
try:
|
||||
data_in = srvs.recv(1048576)
|
||||
except BlockingIOError as e:
|
||||
logg.debug('block io error: {}'.format(e))
|
||||
|
||||
if data_in == None:
|
||||
raise ClientBlockError()
|
||||
|
||||
data = None
|
||||
try:
|
||||
data_in_str = data_in.decode('utf-8')
|
||||
data_hex = strip_0x(data_in_str.rstrip())
|
||||
data = bytes.fromhex(data_hex)
|
||||
except ValueError:
|
||||
logg.error('invalid input "{}"'.format(data_in_str))
|
||||
raise ClientInputError()
|
||||
|
||||
logg.info('recv {} bytes'.format(len(data)))
|
||||
return data
|
@ -12,7 +12,6 @@ from xdg.BaseDirectory import (
|
||||
save_config_path,
|
||||
)
|
||||
|
||||
|
||||
class Environment:
|
||||
|
||||
def __init__(self, domain=None, session=None, env={}):
|
||||
|
Loading…
Reference in New Issue
Block a user