64 lines
1.6 KiB
Python
64 lines
1.6 KiB
Python
|
from http.server import BaseHTTPRequestHandler, HTTPServer
|
||
|
from http.client import HTTPMessage
|
||
|
import requests
|
||
|
from config.main_local import pool
|
||
|
from daemon.SimpleDaemon import Daemon
|
||
|
|
||
|
hostName = "localhost"
|
||
|
serverPort = 9000
|
||
|
|
||
|
class FrontDemoDaemon(Daemon):
|
||
|
def run(self):
|
||
|
webServer = HTTPServer((hostName, serverPort), MyServer)
|
||
|
print(f"Server started http://{hostName}:{serverPort}")
|
||
|
|
||
|
try:
|
||
|
webServer.serve_forever()
|
||
|
except KeyboardInterrupt:
|
||
|
pass
|
||
|
|
||
|
webServer.server_close()
|
||
|
print("Http server stopped.")
|
||
|
|
||
|
|
||
|
class MyServer(BaseHTTPRequestHandler):
|
||
|
def do_GET(self):
|
||
|
host = get_host_from_headers(self.headers)
|
||
|
subdomain = get_subdomain(host)
|
||
|
port = get_port(subdomain)
|
||
|
|
||
|
url = 'http://localhost:{port}{path}'.format(path=self.path, port=port)
|
||
|
response = requests.get(url)
|
||
|
|
||
|
self.send_response(200)
|
||
|
self.send_header("Content-type", response.headers.get("Content-type"))
|
||
|
self.end_headers()
|
||
|
self.wfile.write(bytes(response.text, "utf-8"))
|
||
|
|
||
|
|
||
|
def get_host_from_headers(headers: HTTPMessage):
|
||
|
for item in headers.items():
|
||
|
if item[0] == "Host":
|
||
|
return item[1]
|
||
|
|
||
|
return None
|
||
|
|
||
|
def get_subdomain(host: str):
|
||
|
res = host.split(sep=".", maxsplit=-1)
|
||
|
if res[0]:
|
||
|
return res[0]
|
||
|
|
||
|
return None
|
||
|
|
||
|
def get_port(subdomain: str):
|
||
|
for item in pool:
|
||
|
if item[0] == subdomain:
|
||
|
return item[1]
|
||
|
|
||
|
return None
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
with FrontDemoDaemon('/tmp/front-demo-daemon.pid', error_log_file='/var/log/front-demo-daemon.txt') as front:
|
||
|
front.process_command()
|