Source code for actingweb.aw_proxy

from __future__ import absolute_import
from builtins import str
from builtins import object
import json
from actingweb import trust
import logging
try:
    from urllib.parse import urlencode as urllib_urlencode
except ImportError:
    from urllib import urlencode as urllib_urlencode


[docs]class AwProxy(object): """ Proxy to other trust peers to execute RPC style calls Initialise with either trust_target to target a specific existing trust or use peer_target for simplicity to use the trust established with the peer. """ def __init__(self, trust_target=None, peer_target=None, config=None): self.config = config self.last_response_code = 0 self.last_response_message = 0 self.last_location = None if trust_target and trust_target.trust: self.trust = trust_target self.actorid = trust_target.id elif peer_target and peer_target["id"]: self.actorid = peer_target["id"] self.trust = None if peer_target["peerid"]: self.trust = trust.Trust( actor_id=self.actorid, peerid=peer_target["peerid"], config=self.config).get() if not self.trust or len(self.trust) == 0: self.trust = None
[docs] def get_resource(self, path=None, params=None): if not path or len(path) == 0: return None if not params: params = {} if not self.trust or not self.trust["baseuri"] or not self.trust["secret"]: return None url = self.trust["baseuri"].strip('/') + '/' + path.strip('/') if params: url = url + '?' + urllib_urlencode(params) headers = {'Authorization': 'Bearer ' + self.trust["secret"], } logging.debug( 'Getting trust peer resource at (' + url + ')') try: if self.config.env == 'appengine': response = self.config.module["urlfetch"].fetch( url=url, method=self.config.module["urlfetch"].GET, headers=headers ) else: response = self.config.module["urlfetch"].get( url=url, headers=headers ) self.last_response_code = response.status_code self.last_response_message = response.content except (self.config.module["urlfetch"].UrlfetchException, self.config.module["urlfetch"].URLError, self.config.module["urlfetch"].Timeout, self.config.module["urlfetch"].TooManyRedirects): logging.debug('Not able to get peer resource') self.last_response_code = 408 return { 'error': { 'code': 408, 'message': 'Unable to communciate with trust peer service.', }, } logging.debug('Get trust peer resource POST response:(' + str(response.status_code) + ') ' + str(response.content)) if response.status_code < 200 or response.status_code > 299: logging.info('Not able to get trust peer resource.') try: result = json.loads(response.content.decode('utf-8', 'ignore')) except (TypeError, ValueError, KeyError): logging.debug("Not able to parse response when getting resource at(" + url + ")") result = {} return result
[docs] def create_resource(self, path=None, params=None): if not path or len(path) == 0: return None if not params: params = {} if not self.trust or not self.trust["baseuri"] or not self.trust["secret"]: return None data = json.dumps(params) headers = {'Authorization': 'Bearer ' + self.trust["secret"], 'Content-Type': 'application/json', } url = self.trust["baseuri"].strip('/') + '/' + path.strip('/') logging.debug( 'Creating trust peer resource at (' + url + ') with data(' + str(data) + ')') try: if self.config.env == 'appengine': response = self.config.module["urlfetch"].fetch( url=url, method=self.config.module["urlfetch"].POST, payload=data, headers=headers ) else: response = self.config.module["urlfetch"].fetch( url=url, data=data, headers=headers ) self.last_response_code = response.status_code self.last_response_message = response.content except (self.config.module["urlfetch"].UrlfetchException, self.config.module["urlfetch"].URLError, self.config.module["urlfetch"].Timeout, self.config.module["urlfetch"].TooManyRedirects): logging.debug('Not able to create new peer resource') self.last_response_code = 408 return { 'error': { 'code': 408, 'message': 'Unable to communciate with trust peer service.', }, } if 'Location' in response.headers: self.last_location = response.headers['Location'] else: self.last_location = None logging.debug('Create trust peer resource POST response:(' + str(response.status_code) + ') ' + str(response.content)) if response.status_code < 200 or response.status_code > 299: logging.warning('Not able to create new trust peer resource.') try: result = json.loads(response.content.decode('utf-8', 'ignore')) except (TypeError, ValueError, KeyError): logging.debug("Not able to parse response when creating resource at(" + url + ")") result = {} return result
[docs] def change_resource(self, path=None, params=None): if not path or len(path) == 0: return None if not params: params = {} if not self.trust or not self.trust["baseuri"] or not self.trust["secret"]: return None data = json.dumps(params) headers = {'Authorization': 'Bearer ' + self.trust["secret"], 'Content-Type': 'application/json', } url = self.trust["baseuri"].strip('/') + '/' + path.strip('/') logging.debug( 'Changing trust peer resource at (' + url + ') with data(' + str(data) + ')') try: if self.config.env == 'appengine': response = self.config.module["urlfetch"].fetch( url=url, method=self.config.module["urlfetch"].PUT, payload=data, headers=headers ) else: response = self.config.module["urlfetch"].put( url=url, data=data, headers=headers ) self.last_response_code = response.status_code self.last_response_message = response.content except (self.config.module["urlfetch"].UrlfetchException, self.config.module["urlfetch"].URLError, self.config.module["urlfetch"].Timeout, self.config.module["urlfetch"].TooManyRedirects): logging.debug('Not able to change peer resource') self.last_response_code = 408 return { 'error': { 'code': 408, 'message': 'Unable to communciate with trust peer service.', }, } logging.debug('Change trust peer resource PUT response:(' + str(response.status_code) + ') ' + str(response.content)) if response.status_code < 200 or response.status_code > 299: logging.warning('Not able to change trust peer resource.') try: result = json.loads(response.content.decode('utf-8', 'ignore')) except (TypeError, ValueError, KeyError): logging.debug("Not able to parse response when changing resource at(" + url + ")") result = {} return result
[docs] def delete_resource(self, path=None): if not path or len(path) == 0: return None if not self.trust or not self.trust["baseuri"] or not self.trust["secret"]: return None headers = {'Authorization': 'Bearer ' + self.trust["secret"], } url = self.trust["baseuri"].strip('/') + '/' + path.strip('/') logging.debug( 'Deleting trust peer resource at (' + url + ')') try: if self.config.env == 'appengine': response = self.config.module["urlfetch"].fetch( url=url, method=self.config.module["urlfetch"].DELETE, headers=headers ) else: response = self.config.module["urlfetch"].delete( url=url, headers=headers ) self.last_response_code = response.status_code self.last_response_message = response.content except (self.config.module["urlfetch"].UrlfetchException, self.config.module["urlfetch"].URLError, self.config.module["urlfetch"].Timeout, self.config.module["urlfetch"].TooManyRedirects): logging.debug('Not able to delete peer resource') self.last_response_code = 408 return { 'error': { 'code': 408, 'message': 'Unable to communciate with trust peer service.', }, } logging.debug('Delete trust peer resource POST response:(' + str(response.status_code) + ') ' + str(response.content)) if response.status_code < 200 or response.status_code > 299: logging.warning('Not able to delete trust peer resource.') return False return True