-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
4 changed files
with
125 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
<h1>Test</h1> | ||
<h1>Test {{ Webserver_IP_ADDRESS }}</h1> | ||
|
||
<script> | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
# webserver.py Simple Threading HTTP Server | ||
import sys; sys.dont_write_bytecode = True | ||
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer | ||
|
||
class RedirectHandler(BaseHTTPRequestHandler): | ||
def do_GET(self): | ||
#html_content = """ | ||
#<head> | ||
# <title>Custom Title</title> | ||
#</head> | ||
#""" | ||
#self.wfile.write(html_content.encode('utf-8')) | ||
|
||
|
||
if self.path == '/': | ||
self.send_response(200), self.send_header('Content-type', 'text/html'), self.end_headers() | ||
|
||
from pathlib import Path | ||
self.wfile.write(open(Path(__file__).parent / 'index.html', 'rb').read()) | ||
|
||
if self.path == '/favicon.ico': | ||
self.send_response(200), self.send_header('Content-type', 'image/x-icon'), self.end_headers() | ||
favicon_base64 = ( | ||
"""AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAA | ||
gAAAAAAAAAAAAAAAEAAAAAAAAABXqw4AAAAAAGCuJwBmvSQAtd6YAPHw7ABp | ||
visAccwuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAERERERER | ||
ERERERJndiEREREQd3d3dwERERd3J3d3cRERd3JSd3d3ERF3JVUnd3cRE3dV | ||
VVJ3dzEXd1V0VSd3cRd3d3dFUndxF3d3d3RVd3ERd3d3d0d3ERF3d3d3d3cR | ||
ERd3d3d3cREREXd3d3cRERERF3d3cRERERERERERERH//wAA+B8AAOAHAADg | ||
BwAAwAMAAMADAACAAQAAgAEAAIABAACAAQAAwAMAAMADAADgBwAA8A8AAPgf | ||
AAD//wAA | ||
""") | ||
import base64 | ||
self.wfile.write(base64.b64decode(favicon_base64)) | ||
|
||
if self.path == '/Get_WebServer_Public_IP': | ||
self.send_response(200), self.send_header('Content-type', 'text/plain'), self.end_headers() | ||
import urllib.request | ||
webserver_public_ip = urllib.request.urlopen('https://api.ipify.org').read().decode() | ||
self.wfile.write(webserver_public_ip.encode('utf-8')) | ||
|
||
if self.path == '/list_paths': | ||
self.send_response(200), self.send_header('Content-type', 'text/plain'), self.end_headers() | ||
self.wfile.write(get_self_paths_json(RedirectHandler).encode('utf-8')) | ||
|
||
def start_webserver(server_class=ThreadingHTTPServer, handler_class=RedirectHandler, ip='localhost', port=80): | ||
from threading import Thread | ||
|
||
server_address = (ip, port) | ||
|
||
def serve(httpd = server_class(server_address, handler_class)): | ||
httpd.serve_forever() | ||
|
||
return ip, port, Thread(target=serve, daemon=True).start() | ||
|
||
def inspect_self_paths(handler_class): | ||
import inspect | ||
import re | ||
paths = [] | ||
for method_name in dir(handler_class): | ||
if method_name.startswith('do_'): | ||
method = getattr(handler_class, method_name) | ||
if callable(method): | ||
method_source = inspect.getsource(method) | ||
self_path_matches = re.findall(r'self\.path\s*==\s*[\'"]([^\'"]+)[\'"]', method_source) | ||
paths.extend(self_path_matches) | ||
return sorted(set(paths)) | ||
|
||
def list_all_self_paths(): | ||
import inspect | ||
import re | ||
|
||
paths = inspect_self_paths(RedirectHandler) | ||
print("All self.path values:") | ||
for path in paths: | ||
print(path) | ||
|
||
|
||
def get_self_paths_json(handler_class): | ||
import json | ||
paths = inspect_self_paths(handler_class) | ||
return json.dumps({"paths": paths}) | ||
|
||
if __name__ == '__main__': | ||
list_all_self_paths() | ||
|
||
ip, port, server_thread = start_webserver() | ||
print(f"[Webserver] Server started at {ip}:{port}") | ||
import webserver_Exit_Threads_Signaling | ||
import webserver_Main_Thread_Keep_Alive | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
import re | ||
import inspect | ||
|
||
def render_template(template_file, **kwargs): | ||
# Read the template from file | ||
with open(template_file, 'r') as file: | ||
template_string = file.read() | ||
|
||
# Get the calling frame | ||
frame = inspect.currentframe().f_back | ||
|
||
# Combine local variables from the calling scope with passed kwargs | ||
variables = {**frame.f_locals, **kwargs} | ||
|
||
def replace_var(match): | ||
var_name = match.group(1) | ||
return str(variables.get(var_name, f'{{{{ {var_name} }}}}')) | ||
|
||
rendered_content = re.sub(r'\{\{ (\w+) \}\}', replace_var, template_string) | ||
return rendered_content | ||
|
||
|