Creating your own HTTP Layer

The HTTP layer is the mechanism by which notifications are sent to the target inbox. The HTTP layer is designed to be customisable, so that you can use your own HTTP library, or build in custom authentication routines.

The HTTP layer interface and default implementation can be found in coarnotify.http.

To use a custom HTTP layer, you provide this at the time of creating the client:

from coarnotify.client import COARNotifyClient
from my_custom_http_layer import MyCustomHTTPLayer

client = COARNotifyClient(http_layer=MyCustomHTTPLayer())

Implementing HTTP layer with authentication

To add authentication to your http layer, one way of doing this would be to extend the existing requests based implementation to layer the authentication on top.

from coarnotify.http import RequestsHttpLayer
from requests import HTTPBasicAuth

class AuthRequestsHTTPLayer(RequestsHttpLayer):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.auth_token = HTTPBasicAuth('username', 'password')

    def post(self, url: str, data: str, headers: dict=None, *args, **kwargs) -> 'RequestsHttpResponse':
        return super().post(url, data, headers=headers, auth=self.auth_token, *args, **kwargs)

    def get(self, url: str, headers: dict=None, *args, **kwargs) -> 'RequestsHttpResponse':
        return super().get(url, data, headers=headers, auth=self.auth_token, *args, **kwargs)

Implementing HTTP layer with alternative library

If your application already relies on another HTTP library, you can implement the HTTP layer using that library instead.

from coarnotify.http import HttpLayer, HttpResponse
from my_http_library import MyHttpLibrary


class MyCustomHTTPLayer(HttpLayer):

    def post(self, url: str, data: str, headers: dict=None, *args, **kwargs) -> 'CustomHttpResponse':
        resp = my_http_library.make_request("POST", url, data, headers=headers, *args, **kwargs)
        return CustomHttpResponse(resp)

    def get(self, url: str, headers: dict=None, *args, **kwargs) -> 'CustomHttpResponse':
        resp = my_http_library.make_request("GET", url, data, headers=headers, *args, **kwargs)
        return CustomHttpResponse(resp)


class CustomHttpResponse(HttpResponse):
    def __init__(self, resp: my_http_library.Response):
        self._resp = resp

    def header(self, header_name: str) -> str:
        return self._resp.get_response_header(header_name)

    @property
    def status_code(self) -> int:
        return self._resp.get_status_code()