def do_forward_request_network(port, method, path, data, headers, target_url=None): # TODO: enable per-service endpoints, to allow deploying in distributed settings target_url = target_url or "%s://%s:%s" % (config.get_protocol(), LOCALHOST, port) url = "%s%s" % (target_url, path) response = requests.request( method, url, data=data, headers=headers, verify=False, stream=True, allow_redirects=False ) return response
def auth_keys_from_connection(connection: Dict): headers = {} auth_type = connection.get("AuthorizationType").upper() auth_parameters = connection.get("AuthParameters") if auth_type == AUTH_BASIC: basic_auth_parameters = auth_parameters.get("BasicAuthParameters", {}) username = basic_auth_parameters.get("Username", "") password = basic_auth_parameters.get("Password", "") auth = "Basic " + to_str( base64.b64encode("{}:{}".format(username, password).encode("ascii"))) headers.update({"authorization": auth}) if auth_type == AUTH_API_KEY: api_key_parameters = auth_parameters.get("ApiKeyAuthParameters", {}) api_key_name = api_key_parameters.get("ApiKeyName", "") api_key_value = api_key_parameters.get("ApiKeyValue", "") headers.update({api_key_name: api_key_value}) if auth_type == AUTH_OAUTH: oauth_parameters = auth_parameters.get("OAuthParameters", {}) oauth_method = oauth_parameters.get("HttpMethod") oauth_http_parameters = oauth_parameters.get("OAuthHttpParameters", {}) oauth_endpoint = oauth_parameters.get("AuthorizationEndpoint", "") query_object = list_of_parameters_to_object( oauth_http_parameters.get("QueryStringParameters", [])) oauth_endpoint = add_query_params_to_url(oauth_endpoint, query_object) client_parameters = oauth_parameters.get("ClientParameters", {}) client_id = client_parameters.get("ClientID", "") client_secret = client_parameters.get("ClientSecret", "") oauth_body = list_of_parameters_to_object( oauth_http_parameters.get("BodyParameters", [])) oauth_body.update({ "client_id": client_id, "client_secret": client_secret }) oauth_header = list_of_parameters_to_object( oauth_http_parameters.get("HeaderParameters", [])) oauth_result = requests.request( method=oauth_method, url=oauth_endpoint, data=json.dumps(oauth_body), headers=oauth_header, ) oauth_data = json.loads(oauth_result.text) token_type = oauth_data.get("token_type", "") access_token = oauth_data.get("access_token", "") auth_header = "{} {}".format(token_type, access_token) headers.update({"authorization": auth_header}) return headers
def do_forward_request_network(port, method, path, data, headers, target_url=None): # TODO: enable per-service endpoints, to allow deploying in distributed settings target_url = target_url or f"{config.get_protocol()}://{LOCALHOST}:{port}" url = f"{target_url}{path}" return requests.request( method, url, data=data, headers=headers, verify=False, stream=True, allow_redirects=False, )
def send_event_to_api_destination(target_arn, event, http_parameters: Optional[Dict] = None): """Send an event to an EventBridge API destination See https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-api-destinations.html""" # ARN format: ...:api-destination/{name}/{uuid} region = target_arn.split(":")[3] api_destination_name = target_arn.split(":")[-1].split("/")[1] events_client = connect_to_service("events", region_name=region) destination = events_client.describe_api_destination( Name=api_destination_name) # get destination endpoint details method = destination.get("HttpMethod", "GET") endpoint = destination.get("InvocationEndpoint") state = destination.get("ApiDestinationState") or "ACTIVE" LOG.debug('Calling EventBridge API destination (state "%s"): %s %s', state, method, endpoint) headers = { # default headers AWS sends with every api destination call "User-Agent": "Amazon/EventBridge/ApiDestinations", "Content-Type": "application/json; charset=utf-8", "Range": "bytes=0-1048575", "Accept-Encoding": "gzip,deflate", "Connection": "close", } endpoint = add_api_destination_authorization(destination, headers, event) if http_parameters: endpoint = add_http_parameters(http_parameters, endpoint, headers, event) result = requests.request(method=method, url=endpoint, data=json.dumps(event or {}), headers=headers) if result.status_code >= 400: LOG.debug("Received code %s forwarding events: %s %s", result.status_code, method, endpoint) if result.status_code == 429 or 500 <= result.status_code <= 600: pass # TODO: retry logic (only retry on 429 and 5xx response status)