Skip to content

Commit 090b5b1

Browse files
authored
Merge pull request #28 from jimi-c/better_malformed_directive_handling
Better malformed directive handling
2 parents 36e2fe5 + c567d06 commit 090b5b1

3 files changed

Lines changed: 35 additions & 4 deletions

File tree

receptor/__main__.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import datetime
33
import logging
44
import logging.config
5+
import sys
56

67
from .config import ReceptorConfig
78
from .receptor import Receptor
@@ -11,7 +12,11 @@
1112

1213
def main(args=None):
1314

14-
config = ReceptorConfig(args)
15+
try:
16+
config = ReceptorConfig(args)
17+
except Exception as e:
18+
logger.error("An error occured while validating the configuration options:\n%s" % (str(e),))
19+
sys.exit(1)
1520

1621
logging.config.dictConfig(
1722
{
@@ -38,7 +43,11 @@ def main(args=None):
3843
}
3944
)
4045

41-
config.go()
46+
try:
47+
config.go()
48+
except Exception as e:
49+
logger.error("An error occured while running receptor:\n%s" % (str(e),))
50+
sys.exit(1)
4251

4352

4453
if __name__ == '__main__':

receptor/connection.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import asyncio
2-
import logging
32
import json
3+
import logging
4+
45
from . import exceptions
56
from .messages import envelope, directive
67
from .exceptions import ReceptorBufferError
@@ -75,7 +76,20 @@ async def handle_message(self, msg):
7576
else:
7677
# other namespace/work directives
7778
await self.receptor.work_manager.handle(outer_env.inner_obj)
79+
except ValueError:
80+
logger.error("error in handle_message: Invalid directive -> '%s'. Sending failure response back." % (outer_env.inner_obj.directive,))
81+
err_resp = outer_env.inner_obj.make_response(
82+
receptor=self.receptor,
83+
recipient=outer_env.inner_obj.sender,
84+
payload="An invalid directive ('%s') was specified." % (outer_env.inner_obj.directive,),
85+
in_response_to=outer_env.inner_obj.message_id,
86+
serial=outer_env.inner_obj.serial + 1,
87+
ttl=15,
88+
code=1,
89+
)
90+
await self.receptor.router.send(err_resp)
7891
except Exception as e:
92+
logger.error("error in handle_message: '%s'. Sending failure response back." % (str(e),))
7993
err_resp = outer_env.inner_obj.make_response(
8094
receptor=self.receptor,
8195
recipient=outer_env.inner_obj.sender,

receptor/entrypoints.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
import time
66

77
from .receptor import Receptor
8-
from . import node
98
from . import controller
9+
from . import exceptions
10+
from . import node
1011

1112
logger = logging.getLogger(__name__)
1213

@@ -53,6 +54,13 @@ def run_as_send(config):
5354
logger.info(f'Sending a {config.send_directive} directive to {config.send_recipient}.')
5455
sock = controller.connect_to_socket(config.send_socket_path)
5556
try:
57+
if config.send_directive in (None, ''):
58+
raise exceptions.UnknownDirective("The directive cannot be left out when using send.")
59+
else:
60+
try:
61+
left, right = config.send_directive.split(':', 1)
62+
except ValueError:
63+
raise exceptions.UnknownDirective("Invalid directive format (%s). Directives must be in the form `action:method`." % (config.send_directive,))
5664
response = controller.send_directive(config.send_directive, config.send_recipient, config.send_payload, sock)
5765
sys.stdout.buffer.write(response + b"\n")
5866
sys.stdout.flush()

0 commit comments

Comments
 (0)