Source code for transloadit.request

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

import requests

from .response import as_response
from . import __version__

TIMEOUT = 60


[docs] class Request: """ Transloadit tailored HTTP Request object. :Attributes: - transloadit (<translaodit.client.Transloadit>): An instance of the Transloadit class. :Constructor Args: - transloadit (<transloadit.client.Transloadit>) """ HEADERS = {"Transloadit-Client": "python-sdk:" + __version__} 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, timeout=TIMEOUT, )
[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, timeout=TIMEOUT, )
[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, timeout=TIMEOUT, )
[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, timeout=TIMEOUT, )
def _to_payload(self, data): data = copy.deepcopy(data or {}) expiry = datetime.now(timezone.utc) + timedelta(seconds=self.transloadit.duration) 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): hash_string = hmac.new( self.transloadit.auth_secret.encode("utf-8"), message.encode("utf-8"), hashlib.sha384 ).hexdigest() return f"sha384:{hash_string}" def _get_full_url(self, url): if url.startswith(("http://", "https://")): return url else: return self.transloadit.service + url