Files
amq-adapter-python/amqp/adapter/clever_swarm_adapter.py
T

72 lines
2.8 KiB
Python

import logging
from typing import Dict, List
from aiohttp import ClientSession, ClientResponse
from amqp.config.amq_configuration import AMQConfiguration
from amqp.model.model import AMQMessage, AMQResponse
class CleverSwarmAdapter:
def __init__(self, amq_configuration: AMQConfiguration, session: ClientSession = None):
self.amq_configuration = amq_configuration
self.session = session
self.service_host = self.amq_configuration.dispatch.service_host
self.service_port = self.amq_configuration.dispatch.service_port
def on_message(self, amq_message) -> AMQResponse:
pass
async def handle(self, message: AMQMessage) -> ClientResponse:
method = message.method.lower()
if method == 'get':
return await self.get(message)
elif method == 'put':
return await self.put(message)
elif method == 'post':
return await self.post(message)
elif method == 'head':
return await self.head(message)
elif method == 'delete':
return await self.delete(message)
else:
raise ValueError(f"Unexpected HTTP method: {message.method}")
async def get(self, message: AMQMessage) -> ClientResponse:
url = f"http://{self.service_host}:{self.service_port}{message.path}"
headers = {**message.headers, **message.trace_info}
logging.info(f" [*] SEND HEADERS out: {', '.join(f'{k}={v}' for k, v in headers.items())}, REQ={url}")
return await self.session.get(url, headers=headers)
async def put(self, message: AMQMessage) -> ClientResponse:
return await self.handle_possible_form(
self.session.put(
f"http://{self.service_host}:{self.service_port}{message.path}",
data=message.body,
headers={**message.headers, **message.trace_info},
)
)
async def post(self, message: AMQMessage) -> ClientResponse:
return await self.handle_possible_form(
self.session.post(
f"http://{self.service_host}:{self.service_port}{message.path}",
data=message.body,
headers={**message.headers, **message.trace_info},
)
)
async def handle_possible_form(self, request_coroutine) -> ClientResponse:
return await request_coroutine
async def head(self, message: AMQMessage) -> ClientResponse:
raise NotImplementedError
async def delete(self, message: AMQMessage) -> ClientResponse:
raise NotImplementedError
def get_content_type(self, message_headers: Dict[str, List[str]]) -> str:
for header, values in message_headers.items():
if header.lower() == 'content-type':
return values[0].split(';')[0]
return 'application/json'