This repository was archived by the owner on Sep 28, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhttp_server.py
75 lines (59 loc) · 2.55 KB
/
http_server.py
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
import os
import json
import env_config
from kafka_producer import producer
from http.server import BaseHTTPRequestHandler
from urllib.parse import urlparse,parse_qs
from exceptions import TopicException,ProducerException,AvroException
class RequestHandler(BaseHTTPRequestHandler):
logger = None
def do_HEAD(self):
self.send_header('Content-Type','application/json')
self.send_header('Access-Control-Allow-Origin','*')
self.send_header('Access-Control-Allow-Methods','POST,OPTIONS')
self.end_headers()
def send_message(self,status=200,msg={}):
self.send_response(status)
self.do_HEAD()
self.wfile.write(json.dumps(msg).encode())
def send_error(self,status,error_msg=''):
self.send_message(status,{"msg":"failed","error":error_msg})
def do_OPTIONS(self):
self.send_response(204)
self.do_HEAD()
return
def do_POST(self):
# get request data
post_body = self.rfile.read(int(self.headers['Content-Length']))
data = {}
try:
data = json.loads(post_body.decode('utf8'))
except json.JSONDecodeError as err:
self.logger.error("error decoding JSON",error=err)
self.send_error(400,"JSON Err: {}".format(err))
return
# parse the query param
parsed_path = urlparse(self.path)
event_name = parse_qs(parsed_path.query)
if 'name' not in event_name.keys():
self.logger.error("incorrect param specified",param=event_name,path=parsed_path.path)
self.send_error(400,"incorrect param specified")
return
# send the message to kafka producer
topic = event_name["name"][0]
try:
producer.produce(topic,value=data)
except TopicException as e:
self.send_error(400,'{} :{}'.format(e.args[0],topic))
self.logger.error(e.args[0],topic_name=topic,exception_class=e.__class__)
return
except AvroException as e:
self.send_error(422,'{} , topic:{}'.format(e.message,topic))
self.logger.error(e.message,error=e.expression,topic_name=topic,exception_class=e.expression.__class__)
return
except ProducerException as e:
self.send_error(500,'internal error: {}'.format(e.message))
self.logger.fatal(e.message,error=e.expression,exception_class=e.expression.__class__)
os._exit(1)
self.send_message(200,{"msg":"success"})
return