-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathserver.py
148 lines (128 loc) · 5.39 KB
/
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
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
## This is the REST API server. I've tried to make it pretty flexible,
## so it supports both URI path segments and query strings and always returns
## JSON-formatted data. I've separated the URIs into the following format:
# http://server:port/api_version/[client|peer]/[operation]/[data]. Feel
# free to test this by running 'python server.py' and using the Curl
# utility like so: 'curl localhost:8000/apiv01/client/get/test' or whatever.
import threading
from util import PeerInfo
import http.server
import json
import re, cgi
myHandlers = None
myNetHandlers = None
myDB = None
def setLinks(handlers,netHandlers,db):
global myHandlers
global myNetHandlers
global myDB
myHandlers = handlers
myDB = db
myNetHandlers = netHandlers
print("LINKS ARE SET")
class RESTHandler(http.server.BaseHTTPRequestHandler):
def success(self):
self.send_response(200)
self.send_header("Content-type", "application/json")
self.end_headers()
def failure(self):
self.send_response(400)
self.send_header("Content-type", "application/json")
self.end_headers()
def do_HEAD(self):
"""Reply with OK and send headers"""
self.send_response(200)
self.send_header("Content-type", "application/json")
self.end_headers()
def do_GET(self):
"""
Holy boilerplate, Batman!
"""
k = self.path.split('/')[1]
if k in myHandlers.keys():
myLogic = myHandlers[k]
#self.wfile.write(b"HTTP/1.1 200 OK\n")
if myNetHandlers[k] is not None and myNetHandlers[k](self):
return
if None != re.search(k+'/client/seek/*', self.path):
self.success()
recordID = self.path.split('/')[-1]
result = myLogic.seek(recordID)
answer = bytes(str(result),"UTF-8")
self.wfile.write(answer)
elif None != re.search(k+'/peer/seek/*', self.path):
self.success()
recordID = self.path.split('/')[-1]
result = myLogic.seek(recordID)
answer = bytes(str(result),"UTF-8")
self.wfile.write(answer)
elif None != re.search(k+'/client/get/*', self.path):
self.success()
recordID = self.path.split('/')[-1]
result = myDB.get(recordID)
if result:
answer = bytes(result)
self.wfile.write(answer)
elif None != re.search(k+'/client/poll/*/*', self.path):
self.success()
recordID = self.path.split('/')[-2]
t = float(self.path.split('/')[-1])
result = json.dumps(myDB.poll(recordID,t))
if result:
answer = bytes(result,"UTF-8")
self.wfile.write(answer)
elif None != re.search(k+'/peer/getPeers*', self.path):
self.success()
recordID = self.path.split('/')[-1]
result_list = myLogic.getPeers()
result = map(str,result_list)
answer = "[%s]"%",".join(result)
self.wfile.write(bytes(answer,"UTF-8"))
elif None != re.search(k+'/peer/getmyIP*', self.path):
self.success()
self.wfile.write(bytes(self.client_address[0],"UTF-8"))
elif None != re.search(k+'/peer/ping*', self.path):
self.success()
self.wfile.write(b'\"PONG\"')
elif None != re.search(k+'/peer/info*', self.path):
self.success()
self.wfile.write(bytes(str(myLogic.info),"UTF-8"))
else:
self.failure()
def do_POST(self):
k = self.path.split('/')[1]
if k in myHandlers.keys():
myLogic = myHandlers[k]
#self.wfile.write(b"HTTP/1.1 200 OK\n")
if None != re.search(k+'/client/store/*', self.path):
self.success()
contentLen = int(self.headers.get_all('content-length')[0])
data = self.rfile.read(contentLen)
recordID = self.path.split('/')[-1]
myDB.store(recordID,data)
elif None != re.search(k+'/client/post/*', self.path):
self.success()
contentLen = int(self.headers.get_all('content-length')[0])
data = self.rfile.read(contentLen)
recordID = self.path.split('/')[-1]
myDB.post(recordID,str(data,"UTF-8"))
elif None != re.search(k+'/peer/notify*', self.path):
self.success()
#print(self.path)
contentLen = int(self.headers.get_all('content-length')[0])
data = self.rfile.read(contentLen)
#data = self.rfile.read()
#print("NOTIFIED",data)
jsonDict = json.loads(str(data,"UTF-8"))
addr = jsonDict["addr"]
hashID = jsonDict["id"]
loc = jsonDict["loc"]
myLogic.getNotified(PeerInfo(hashID,addr,loc))
self.wfile.write(b"[]")
else:
self.failure()
def log_message(self, format, *args):
return
def getThread(ip='0.0.0.0',port=8000):
server = http.server.HTTPServer((ip,port), RESTHandler)
return threading.Thread(target=server.serve_forever)