-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHTTPServer.py
More file actions
73 lines (54 loc) · 1.94 KB
/
Copy pathHTTPServer.py
File metadata and controls
73 lines (54 loc) · 1.94 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
from .enums import RequestType
from .TCPServer import TCPServer
class HTTPRequest:
_tcpServer = None
_writer = None
message = None
def __init__(self, httpMessage, tcpServer):
self.message = httpMessage
self._writer = httpMessage.writer
self._tcpServer = tcpServer
async def Reply(self, httpResponse):
await self._tcpServer.Reply(httpResponse, self._writer)
class RegisteredPath:
_path = None
_requestType = None
_func = None
def __init__(self, path, requestType, func):
self._path = path
self._requestType = requestType
self._func = func
async def Execute(self, httpRequest):
await self._func(httpRequest)
def GetPath(self):
return self._path
def GetType(self):
return self._requestType
# TODO: Implement Less Rigid Path Matching
def MatchPath(path1, path2):
if path1 == "" or path1 == "/":
if path2 == "" or path2 == "/":
return True
elif path1 == path2:
return True
class Server:
_ipAddress = None
_port = None
_tcpServer = None
_registeredPaths = []
def __init__(self, port=80, ipAddress="127.0.0.1"):
self._ipAddress = ipAddress
self._port = port
self._tcpServer = TCPServer(self._port, self._ipAddress, -1)
def Listen(self):
self._tcpServer.Listen(self.RequestHandler)
def Register(self, path, requestType, func):
registeredPath = RegisteredPath(path, requestType, func)
self._registeredPaths.append(registeredPath)
async def RequestHandler(self, httpMessage):
for registeredPath in self._registeredPaths:
if registeredPath.GetType() == httpMessage.type:
if MatchPath(registeredPath.GetPath(), httpMessage.path):
httpRequest = HTTPRequest(httpMessage, self._tcpServer)
await registeredPath.Execute(httpRequest)
return