Skip to content

Commit

Permalink
release: v0.6.13
Browse files Browse the repository at this point in the history
* Fixes request resend wrong decoding.
* Adds CommandNotFound exception.
* Catchs all exceptions when reading the request.

Co-Authored-by: Lauren-D <[email protected]>
  • Loading branch information
lauren-d committed Aug 26, 2021
1 parent 1f89cef commit e07fdd2
Show file tree
Hide file tree
Showing 7 changed files with 82 additions and 33 deletions.
12 changes: 12 additions & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,18 @@

Changes
=======
Version 0.6.13 (released 2021-08-25)

**Bug fix:**

* Fixes request resend wrong decoding.

**Minor change:**

* Adds CommandNotFound exception.
* Catchs all exceptions when reading the request.


Version 0.6.12 (released 2021-08-24)

**Bug fix:**
Expand Down
6 changes: 5 additions & 1 deletion invenio_sip2/actions/actions.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,8 +127,12 @@ def __str__(self):
def execute(self, message, client):
"""Execute action."""
last_response_message = client.last_response_message
request_msg = last_response_message.get('_sip2')
# strip the line terminator
request_msg = \
request_msg[:len(request_msg) - len(acs_system.line_terminator)]
return Message(
request=last_response_message.get('_sip2')
request=request_msg
)


Expand Down
15 changes: 11 additions & 4 deletions invenio_sip2/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
from flask import current_app
from pycountry import languages

from .errors import CommandNotFound
from .helpers import MessageTypeFixedField, MessageTypeVariableField
from .models import SelfcheckLanguage
from .proxies import current_sip2 as acs_system
Expand Down Expand Up @@ -88,10 +89,16 @@ def __init__(self, **kwargs):

if hasattr(self, 'request'):
self.message_text = self.request
self.message_type = acs_system.sip2_message_types.get_by_command(
self.message_text[:2]
)
self._parse_request()
try:
self.message_type = acs_system.sip2_message_types.\
get_by_command(self.message_text[:2])
self._parse_request()
except CommandNotFound as err:
description = '{err} - request: {request}'.format(
err=err.description,
request=self.message_text
)
raise CommandNotFound(message=description)

def __str__(self):
"""String representation of Message object."""
Expand Down
9 changes: 9 additions & 0 deletions invenio_sip2/errors.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,15 @@ def __init__(self, message=None, **kwargs):
super().__init__(**kwargs)


class CommandNotFound(Exception):
"""Command not found."""

def __init__(self, message=None, **kwargs):
"""Initialize exception."""
self.description = message
super().__init__(**kwargs)


# Server
class ServerMessageError(Exception):
"""Server message error."""
Expand Down
10 changes: 6 additions & 4 deletions invenio_sip2/ext.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@

from . import config, handlers
from .actions.actions import Action
from .errors import CommandNotFound
from .helpers import MessageTypeFixedField, MessageTypeVariableField
from .models import SupportedMessages
from .utils import convert_bool_to_char
Expand Down Expand Up @@ -282,10 +283,11 @@ def __init__(self, message_type_config):
self.message_types[command] = _MessageType(command, **message_type)

def get_by_command(self, command):
command = self.message_types.get(command)
if command:
return command
raise NotImplementedError
try:
return self.message_types[command]
except Exception:
err_msg = f"Command '{command}' not found"
raise CommandNotFound(message=err_msg)


class _MessageType(object):
Expand Down
61 changes: 38 additions & 23 deletions invenio_sip2/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
from flask import current_app

from .api import Message
from .errors import CommandNotFound
from .proxies import current_logger as logger
from .proxies import current_sip2
from .records.record import Client, Server
Expand Down Expand Up @@ -73,6 +74,12 @@ def run(self):
message = key.data
try:
message.process_events(mask)
except CommandNotFound as err:
logger.error(
err.description,
exc_info=True
)
message.close()
except RuntimeError as e:
logger.debug(
f'message cannot be processed: {e}',
Expand Down Expand Up @@ -181,34 +188,42 @@ def _read(self):
pass
else:
if data:
log_prefix = f'request from {self.client.terminal} ' \
f'({self.client.get("ip_address")}, ' \
f'{self.client.get("socket")})'
request_msg = data.decode(encoding=self.message_encoding)
# strip the line terminator
request_msg = \
request_msg[:len(request_msg) - len(self.line_terminator)]
self.request = Message(request=request_msg)

request = self.request.dumps() if logger.level == \
logging.DEBUG else request_msg

logger.info(f'request from {self.client.terminal} '
f'({self.client.get("ip_address")}, '
f'{self.client.get("socket")}): {request}')

if self.validate_message(request_msg):
self._recv_buffer += data
else:
logger.error(
f'invalid checksum for: {request_msg}',
exc_info=True
)
# prepare request selcheck resend message
self.response = Message(
message_type=current_sip2.sip2_message_types
.get_by_command('96')
)
# Set selector to listen for write events
self._set_selector_events_mask("w")
try:
self.request = Message(request=request_msg)
request = self.request.dumps() if logger.level == \
logging.DEBUG else request_msg

logger.info(f'{log_prefix}: {request}')

if self.validate_message(request_msg):
self._recv_buffer += data
else:
logger.error(
f'invalid checksum for: {request_msg}',
exc_info=True
)
# prepare request selcheck resend message
self.response = Message(
message_type=current_sip2.sip2_message_types
.get_by_command('96')
)
# Set selector to listen for write events
self._set_selector_events_mask("w")
except CommandNotFound as e:
raise CommandNotFound(
message='{prefix} - {description}'.format(
prefix=log_prefix, description=e.description))
except Exception as err:
logger.info('{prefix} - {request}'.format(
prefix=log_prefix, request=request_msg))
raise Exception(err)
else:
raise RuntimeError("Peer closed.")

Expand Down
2 changes: 1 addition & 1 deletion invenio_sip2/version.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,4 @@

from __future__ import absolute_import, print_function

__version__ = '0.6.12'
__version__ = '0.6.13'

0 comments on commit e07fdd2

Please sign in to comment.