@@ -196,7 +196,7 @@ def init_from_dict(self, data: dict):
196196 if FIELD_RESULT in data :
197197 self .result = data .get (FIELD_RESULT )
198198 if FIELD_ERROR_MESSAGE in data :
199- self .error_message = data .get (FIELD_ERROR_MESSAGE )
199+ self .error_message = data .get (FIELD_ERROR_MESSAGE ). decode ()
200200
201201
202202class MessageBodyV1 (AbstractMessageBody ):
@@ -338,6 +338,20 @@ def get_application_data_bytes(self, application_data: ApplicationData, asn1_too
338338 application_data_bytes = bytes ()
339339 return application_data_bytes
340340
341+ @staticmethod
342+ def validate_dispatcher_message_size (dispatcher_message_size , netto_message_size ):
343+ # The API sometimes provides a wrong dispatcher_message_length value
344+ # Normally the body size is about 120 bytes
345+ # A value below 50 is very unlikely.
346+ if dispatcher_message_size > 50 :
347+ dispatcher_message_bytes_to_read = dispatcher_message_size
348+ else :
349+ LOG .debug (f'Calculated message size { int (netto_message_size )} does not match '
350+ + f'with header size information { dispatcher_message_size } . Using calculated size.' )
351+ # This will fail if the message contains application data. In this case we cannot tell the body size
352+ dispatcher_message_bytes_to_read = int (netto_message_size )
353+ return dispatcher_message_bytes_to_read
354+
341355
342356class MessageCoderV1 (AbstractMessageCoder ):
343357 def __init__ (self , asn_files_dir : str ):
@@ -378,16 +392,28 @@ def encode_request(self, message: MessageV1) -> str:
378392 return result .upper ()
379393
380394 def decode_response (self , message : str , decoded_message : MessageV1 ) -> None :
395+ LOG .debug (f'Message length in bytes: { len (message [5 :]) / 2 } ' )
381396 buffered_message_bytes = io .BytesIO (bytes .fromhex (message [5 :]))
382397
398+ header = decoded_message .header
383399 header_bytes = buffered_message_bytes .read (self .header_length )
384- decoded_message .header .protocol_version = int (header_bytes [0 ])
385- decoded_message .header .security_context = int (header_bytes [1 ])
386- decoded_message .header .dispatcher_message_length = int (header_bytes [2 ])
387- decoded_message .header .dispatcher_body_encoding = int (header_bytes [3 ])
400+ header .protocol_version = int (header_bytes [0 ])
401+ LOG .debug (f'Protocol version: { header .protocol_version } ' )
402+ header .security_context = int (header_bytes [1 ])
403+ header .dispatcher_message_length = int (header_bytes [2 ])
404+ LOG .debug (f'Dispatcher message length: { header .dispatcher_message_length } ' )
405+ header .dispatcher_body_encoding = int (header_bytes [3 ])
388406
389- dispatcher_message_bytes = buffered_message_bytes .read (
390- decoded_message .header .dispatcher_message_length - self .header_length )
407+ netto_message_size = len (message [5 :]) / 2 - self .header_length
408+ LOG .debug (f'Message size without header: { netto_message_size } ' )
409+
410+ dispatcher_message_size = header .dispatcher_message_length - self .header_length
411+ LOG .debug (f'Dispatcher message bytes: { dispatcher_message_size } ' )
412+
413+ dispatcher_message_bytes_to_read = AbstractMessageCoder .validate_dispatcher_message_size (
414+ dispatcher_message_size , netto_message_size )
415+
416+ dispatcher_message_bytes = buffered_message_bytes .read (dispatcher_message_bytes_to_read )
391417 message_body = decoded_message .body
392418 message_body_dict = self .asn1_tool_uper .decode (message_body .asn_type , dispatcher_message_bytes )
393419 message_body .init_from_dict (message_body_dict )
@@ -477,16 +503,8 @@ def decode_response(self, message: str, decoded_message: MessageV2) -> None:
477503 dispatcher_message_size = header .dispatcher_message_length - self .header_length
478504 LOG .debug (f'Dispatcher message bytes: { dispatcher_message_size } ' )
479505
480- # The API sometimes provides a wrong dispatcher_message_length value
481- # Normally the body size is about 120 bytes
482- # A value below 50 is very unlikely.
483- if dispatcher_message_size > 50 :
484- dispatcher_message_bytes_to_read = dispatcher_message_size
485- else :
486- LOG .debug (f'Calculated message size { int (netto_message_size )} does not match '
487- + f'with header size information { dispatcher_message_size } . Using calculated size.' )
488- # This will fail if the message contains application data. In this case we cannot tell the body size
489- dispatcher_message_bytes_to_read = int (netto_message_size )
506+ dispatcher_message_bytes_to_read = AbstractMessageCoder .validate_dispatcher_message_size (
507+ dispatcher_message_size , netto_message_size )
490508
491509 dispatcher_message_bytes = buffered_message_bytes .read (dispatcher_message_bytes_to_read )
492510 message_body_dict = self .asn1_tool_uper .decode ('MPDispatcherBody' , dispatcher_message_bytes )
0 commit comments