72 lines
2.8 KiB
Python
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'
|