atomresponder/media_atom.py (49 lines of code) (raw):

import requests import logging import hashlib import hmac from datetime import datetime import base64 import requests from time import mktime from urllib.parse import urlparse from pprint import pformat logger = logging.getLogger(__name__) class HttpError(Exception): def __init__(self, uri, code, content, sent_headers, response_headers): self.code = code self.uri = uri self.content = content self.request_headers = sent_headers self.response_headers = response_headers def __str__(self): return "HTTP error {code} accessing {uri}".format(code=self.code, uri=self.uri) def get_token(uri, secret, override_time=None): from email.utils import formatdate if override_time: dt = override_time else: dt = datetime.now() httpdate = formatdate(timeval=mktime(dt.timetuple()),localtime=False,usegmt=True) url_parts = urlparse(uri) string_to_sign = "{0}\n{1}".format(httpdate, url_parts.path) logger.debug("string_to_sign: " + string_to_sign) hm = hmac.new(secret.encode('UTF-8'), string_to_sign.encode('UTF-8'), hashlib.sha256) return "HMAC {0}".format(base64.b64encode(hm.digest()).decode('UTF-8')), httpdate def request_atom_resend(atomid, host, secret): """ Message the media atom tool to request that the atom is resynced :param options: :return: """ uri = "https://{host}/api/pluto/resend/{id}".format(host=host, id=atomid) logger.debug("uri is " + uri) authtoken, httpdate = get_token(uri, secret) logger.debug(authtoken) headers = { 'X-Gu-Tools-HMAC-Date': httpdate, 'X-Gu-Tools-HMAC-Token': authtoken } logger.debug(headers) response = requests.post(uri,headers=headers) logger.debug("Server returned {0}".format(response.status_code)) logger.debug(pformat(response.headers)) if response.status_code==200: logger.debug(pformat(response.json())) else: raise HttpError(uri,response.status_code, response.text, headers, response.headers)