# Meow HTTP Server
[TOC]
## Basic Architecture
### Server.py
```python
import socket
from router import Router
class Banner:
HEADER = '\033[5m'
BLUE = '\033[94m'
GREEN = '\033[92m'
WARNING = '\033[93m'
FAIL = '\033[91m'
ENDC = '\033[0m'
CHERRY_BLOSSOM = '\033[1;35m'
def __init__(self):
self.meowBanner()
def meowBanner(self):
content = "Welcome, MeowHttpServer. ^O^"
contentColor = self.ENDC + self.CHERRY_BLOSSOM + content + self.ENDC + self.HEADER
countLength = len(content)
if countLength % 2 != 0:content = content + " "
countLenth2 = countLength // 2
spaceNum = 24 - countLenth2
# print("Number of characters:", countLength)
print(self.HEADER)
print("#"*50)
print("#"+" "*48+"#")
print("#" + " "*spaceNum + contentColor+ " "*spaceNum + "#")
print("#"+" "*48+"#")
print("#"*50)
print(self.ENDC)
print(self.WARNING + "-> Author: Meowhecker\n" + self.ENDC)
def server():
serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serverSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1) # Once Deamon stop -> release socket Port
serverSocket.bind(('0.0.0.0', 80))
serverSocket.listen(20)
print("Server Start http://127.0.0.1:80")
while 1:
# Receive Connection From Client !
clientSocket, addr = serverSocket.accept()
print("Receive Connection from ", addr)
# Handle Cleint request
requestHandler(clientSocket)
serverSocket.close()
def requestHandler(clientSocket):
router = Router()
#Receive Data from Client
clientTcpPayload = clientSocket.recv(1024).decode()
clientRequestLines = clientTcpPayload.split('\r\n')
#Extract Frist Line in HTTP Request
clientRequestFristLine = clientRequestLines[0]
print("Request Path = ",clientRequestFristLine)
#Assign Method / PATH / Version
clientRequestMethod = clientRequestFristLine.split(' ')[0]
clientRequestPath = clientRequestFristLine.split(' ')[1]
clientRequestVersion = clientRequestFristLine.split(' ')[2]
#router
serverResponse = router.route(clientRequestPath)
clientSocket.sendall(serverResponse.encode())
clientSocket.close()
banner=Banner()
server()
```
### Router.py
```python
#router.py
import os
from view import View
# Current Path
currentDirPath = os.path.dirname(os.path.abspath(__file__))
print(currentDirPath)
class Router():
def __init__(self):
self.data = {
"name": "meowhecker",
"email": "meowhecker@meow.com"
}
self.currentDirPath = os.path.dirname(os.path.abspath(__file__))
def route(self,reqPath):
if reqPath == "/":
templatePath = os.path.join(self.currentDirPath,"views","index.html")
return View.render(templatePath,self.data)
else:
return self.notFound()
def notFound(self):
return "<h1>404 Not Found ~ Meow</h1>"
```
### View.py
```python
#view.py
class View:
@staticmethod # Method, attribute allow directly invoke Without creating Instance
def render(templatePath, data=None):
print(data)
renderContent = ""
with open(templatePath, 'r') as template:
templateContent = template.read() # (Strings)
if data :
renderContent = templateContent.format(**data) # Template {name} -> name
else :
renderContent = templateContent
return renderContent
```