@@ -564,26 +564,39 @@ def _decompress_data(self, payload):
564
564
565
565
return False , payload
566
566
567
- def parse (self , raw_content , find_org_cb , find_partner_cb , find_message_cb = None ):
567
+ def parse (
568
+ self ,
569
+ raw_content ,
570
+ find_org_cb = None ,
571
+ find_partner_cb = None ,
572
+ find_message_cb = None ,
573
+ find_org_partner_cb = None ,
574
+ ):
568
575
"""Function parses the RAW AS2 message; decrypts, verifies and
569
576
decompresses it and extracts the payload.
570
577
571
578
:param raw_content:
572
579
A byte string of the received HTTP headers followed by the body.
573
580
574
581
:param find_org_cb:
575
- A callback the returns an Organization object if exists. The
582
+ A conditional callback the returns an Organization object if exists. The
576
583
as2-to header value is passed as an argument to it.
577
584
578
585
:param find_partner_cb:
579
- A callback the returns an Partner object if exists. The
586
+ A conditional callback the returns a Partner object if exists. The
580
587
as2-from header value is passed as an argument to it.
581
588
582
589
:param find_message_cb:
583
- An optional callback the returns an Message object if exists in
590
+ An optional callback the returns a Message object if exists in
584
591
order to check for duplicates. The message id and partner id is
585
592
passed as arguments to it.
586
593
594
+ :param find_org_partner_cb:
595
+ A conditional callback that return Organization object and
596
+ Partner object if exist. The as2-to and as2-from header value
597
+ are passed as an argument to it. Must be provided
598
+ when find_org_cb and find_org_partner_cb is None.
599
+
587
600
:return:
588
601
A three element tuple containing (status, (exception, traceback)
589
602
, mdn). The status is a string indicating the status of the
@@ -592,6 +605,18 @@ def parse(self, raw_content, find_org_cb, find_partner_cb, find_message_cb=None)
592
605
the partner did not request it.
593
606
"""
594
607
608
+ # Validate passed arguments
609
+ if not any (
610
+ [
611
+ find_org_cb and find_partner_cb and not find_org_partner_cb ,
612
+ find_org_partner_cb and not find_partner_cb and not find_org_cb ,
613
+ ]
614
+ ):
615
+ raise TypeError (
616
+ "Incorrect arguments passed: either find_org_cb and find_partner_cb "
617
+ "or only find_org_partner_cb must be passed."
618
+ )
619
+
595
620
# Parse the raw MIME message and extract its content and headers
596
621
status , detailed_status , exception , mdn = "processed" , None , (None , None ), None
597
622
self .payload = parse_mime (raw_content )
@@ -605,12 +630,16 @@ def parse(self, raw_content, find_org_cb, find_partner_cb, find_message_cb=None)
605
630
try :
606
631
# Get the organization and partner for this transmission
607
632
org_id = unquote_as2name (as2_headers ["as2-to" ])
608
- self .receiver = find_org_cb (org_id )
633
+ partner_id = unquote_as2name (as2_headers ["as2-from" ])
634
+ if find_org_partner_cb :
635
+ self .receiver , self .sender = find_org_partner_cb (org_id , partner_id )
636
+ elif find_org_cb and find_partner_cb :
637
+ self .receiver = find_org_cb (org_id )
638
+ self .sender = find_partner_cb (partner_id )
639
+
609
640
if not self .receiver :
610
641
raise PartnerNotFound (f"Unknown AS2 organization with id { org_id } " )
611
642
612
- partner_id = unquote_as2name (as2_headers ["as2-from" ])
613
- self .sender = find_partner_cb (partner_id )
614
643
if not self .sender :
615
644
raise PartnerNotFound (f"Unknown AS2 partner with id { partner_id } " )
616
645
0 commit comments