-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsplitjoin.py
More file actions
111 lines (86 loc) · 3.64 KB
/
splitjoin.py
File metadata and controls
111 lines (86 loc) · 3.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import asyncio
import logging
import os
from datetime import datetime
import markdown
from aiohttp import web, ClientSession, BasicAuth, ClientResponseError
# noinspection PyUnusedLocal
async def handlehelp(request):
return web.Response(text=helpscreen, content_type="text/html")
async def handler(request):
req = await request.json()
timeout = req["timeout"]
tasks = []
reqheaders = request.headers
for header in reqheaders:
logging.info("Inbound Request Header %s : %s", header, reqheaders[header])
headers = dict(reqheaders)
del headers["Host"]
del headers["Content-Length"]
del headers["Connection"]
async with ClientSession() as session:
for query in req["queries"]:
task = asyncio.create_task(caller(session, query, timeout, headers))
tasks.append(task)
queries = await asyncio.gather(*tasks)
return web.json_response(queries)
async def caller(session, query, timeout, headers):
headers = dict(headers)
result = {"start": datetime.now().isoformat(sep=" ", timespec="auto")}
qid = query["id"]
result["id"] = qid
method = query["method"] if "method" in query else "POST"
if method != "POST" and method != "PUT" and "Content-Type" in headers:
del headers["Content-Type"]
logging.info("Query ID %s Deleted Content-Type", str(qid))
for header in headers:
logging.info("Copy Header to Query %s : %s", header, headers[header])
url = query["url"]
payload = query["payload"] if "payload" in query else None
params = query["params"] if "params" in query else None
auth = None
if "username" in query and "password" in query:
auth = BasicAuth(login=query["username"],
password=query["password"])
del headers["Authorization"]
logging.info("Query ID %s Deleted Authorization", str(qid))
qheaders = query["headers"] if "headers" in query else {}
for header in qheaders:
if header in headers:
del headers[header]
logging.info("Query ID %s Deleted %s", str(qid), header)
headers[header] = qheaders[header]
try:
async with session.request(method, url, json=payload, params=params, auth=auth, headers=headers,
timeout=timeout) as response:
if response.status < 200 or response.status > 299 or not response.content_type.endswith("json"):
logging.info("Query Response ID %s Not json", str(qid))
result["message"] = await response.text()
else:
result["response"] = await response.json()
result["headers"] = dict(response.headers)
result["status"] = response.status
except ClientResponseError as err:
result["status"] = err.status
result["message"] = err.message
logging.error("Query Response ID %s Returned Status %d Message : %s", str(qid), err.status, err.message)
result["end"] = datetime.now().isoformat(sep=' ', timespec="auto")
return result
def init_app():
app = web.Application()
app.add_routes([web.get('/{tail:.*}', handlehelp),
web.post('/{tail:.*}', handler)])
web.run_app(app)
global helpscreen
def init_helpscreen():
with open('README.md', 'r') as readmeFile:
global helpscreen
helpscreen = markdown.markdown(readmeFile.read())
def init_logging():
loglevel = os.getenv("LOGGING", "WARNING").upper()
numeric_log_level = getattr(logging, loglevel, logging.WARNING)
logging.basicConfig(level=numeric_log_level)
if __name__ == '__main__':
init_logging()
init_helpscreen()
init_app()