Source code for transloadit.request

import hashlib
import hmac
import json
import copy
from datetime import datetime, timedelta

import requests
from six import b

from .response import as_response


[docs]class Request(object): """ Transloadit tailored HTTP Request object. :Attributes: - transloadit (<translaodit.client.Transloadit>): An instance of the Transloadit class. :Constructor Args: - transloadit (<transloadit.client.Transloadit>) """ HEADERS = {'User-Agent': 'Transloadit Python SDK'} def __init__(self, transloadit): self.transloadit = transloadit
[docs] @as_response def get(self, path, params=None): """ Makes a HTTP GET request. :Args: - path (str): URL path to which the request should be made. - params (Optional[dict]): Optional params to send along with the request. Return an instance of <transloadit.response.Response> """ return requests.get(self._get_full_url(path), params=self._to_payload(params), headers=self.HEADERS)
[docs] @as_response def post(self, path, data=None, extra_data=None, files=None): """ Makes a HTTP POST request. :Args: - path (str): URL path to which the request should be made. - data (Optional[dict]): The body of the request. This would be stored under the 'params' field. - extra_data (Optional[dict]): This is also added to the body of the request but not under the 'params' field. - files (Optional[dict]): Files to upload with the request. This should be a key, value pair of field name and file stream respectively. Return an instance of <transloadit.response.Response> """ data = self._to_payload(data) if extra_data: data.update(extra_data) return requests.post(self._get_full_url(path), data=data, files=files, headers=self.HEADERS)
[docs] @as_response def put(self, path, data=None): """ Makes a HTTP PUT request. :Args: - path (str): URL path to which the request should be made. - data (Optional[dict]): The body of the request. Return an instance of <transloadit.response.Response> """ data = self._to_payload(data) return requests.put(self._get_full_url(path), data=data, headers=self.HEADERS)
[docs] @as_response def delete(self, path, data=None): """ Makes a HTTP DELETE request. :Args: - path (str): URL path to which the request should be made. - data (Optional[dict]): The body of the request. Return an instance of <transloadit.response.Response> """ data = self._to_payload(data) return requests.delete(self._get_full_url(path), data=data, headers=self.HEADERS)
def _to_payload(self, data): data = copy.deepcopy(data or {}) expiry = timedelta(seconds=self.transloadit.duration) + datetime.utcnow() data['auth'] = { 'key': self.transloadit.auth_key, 'expires': expiry.strftime("%Y/%m/%d %H:%M:%S+00:00") } json_data = json.dumps(data) return {'params': json_data, 'signature': self._sign_data(json_data)} def _sign_data(self, message): return hmac.new(b(self.transloadit.auth_secret), message.encode('utf-8'), hashlib.sha1).hexdigest() def _get_full_url(self, url): if url.startswith(('http://', 'https://')): return url else: return self.transloadit.service + url