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)