AMQ adapter version w/o endpints for CleverSwarm integration
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
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'
|
||||
Reference in New Issue
Block a user