Skip to content

Commit

Permalink
add the basic usage documentation
Browse files Browse the repository at this point in the history
  • Loading branch information
abhishekram committed Jun 12, 2019
1 parent 972fa7d commit fbafaf0
Showing 1 changed file with 79 additions and 1 deletion.
80 changes: 79 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,85 @@ A pure python library for building and parsing message as part of the AS2 messag
* Parsing a received MIME data and identifying if it as a Message or MDN.
* Decompress, Decrypt and Verify Signature of the received payload.
* Verify Signature of the received MDN and extract original message status.



## Basic Usage

Let us take a look at how we can use this library for building and parsing of AS2 Messages.

### Setup

* First we would need to setup an organization and a partner
```python
from pyas2lib.as2 import Organization, Partner

my_org = Organization(
as2_name='my_unique_id', # Unique AS2 Id for this organization
sign_key=b'signature_key_bytes', # PEM/DER encoded private key for signature
sign_key_pass='password', # Password private key for signature
decrypt_key=b'decrypt_key_bytes', # PEM/DER encoded private key for decryption
decrypt_key_pass='password' # Password private key for decryption
)

a_partner = Partner(
as2_name='partner_unique_id', # Unique AS2 Id of your partner
sign=True, # Set to true for signing the message
verify_cert=b'verify_cert_bytes', # PEM/DER encoded certificate for verifying partner signatures
encrypt=True, # Set to true for encrypting the message
encrypt_cert=b'encrypt_cert_bytes', # PEM/DER encoded certificate for encrypting messages
mdn_mode='SYNC', # Expect to receive synchronous MDNs from this partner
mdn_digest_alg='sha256' # Expect signed MDNs to be returned by this partner
)

```

### Sending a message to your partner

* The partner is now setup we can build and AS2 message
```python
from pyas2lib.as2 import Message

msg = Message(sender=my_org, receiver=a_partner)
msg.build(b'data_to_transmit')

```
* The message is built and now `msg.content` holds the message body and `message.header` dictionary holds the message headers. These need to be passed to any http library for HTTP POSTing to the partner.
* We expect synchronous MDNs so we need to process the response to our HTTP POST
```python
from pyas2lib.as2 import Mdn

msg_mdn = Mdn() # Initialize an Mdn object

# Call the parse method with the HTTP response headers + content and a function that returns the related `pyas2lib.as2.Messsage` object.
status, detailed_status = msg_mdn.parse(b'response_data_with_headers', find_message_func)
```
* We parse the response mdn to get the status and detailed status of the message that was transmitted.

### Receiving a message from your partner

* We need to setup and HTTP server with an endpoint for receiving POST requests fro your partner.
* When a requests is received we need to first check if this is an Async MDN
```python
from pyas2lib.as2 import Mdn

msg_mdn = Mdn() # Initialize an Mdn object
# Call the parse method with the HTTP request headers + content and a function the returns the related `pyas2lib.as2.Messsage` object.
status, detailed_status = msg_mdn.parse(request_body, find_message_fumc)
```
* If this is an Async MDN it will return the status of the original message.
* In case the request is not an MDN then `pyas2lib.exceptions.MDNNotFound` is raised, which needs to be catched and parse the request as a message.
```python
from pyas2lib.as2 import Message

msg = Message()
# Call the parse method with the HTTP request headers + content, a function to return the the related `pyas2lib.as2.Organization` object, a function to return the `pyas2lib.as2.Partner` object and a function to check for duplicates.
status, exception, mdn = msg.parse(
request_body, find_organization, find_partner, check_duplicate_msg)
```
* The parse function returns a 3 element tuple; the status of parsing, exception if any raised during parsing and an `pyas2lib.as2.Mdn` object for the message.
* If the `mdn.mdn_mode` is `SYNC` then the `mdn.content` and `mdn.header` must be returned in the response.
* If the `mdn.mdn_mode` is `ASYNC` then the mdn must be saved for later processing.

## Contribute

1. Check for open issues or open a fresh issue to start a discussion around a feature idea or a bug.
Expand Down

0 comments on commit fbafaf0

Please sign in to comment.