Skip to content

Commit f9d3096

Browse files
authored
[py] add a new ExtendedHandler in webserver.py (#14705)
1 parent bb3053b commit f9d3096

File tree

1 file changed

+36
-42
lines changed

1 file changed

+36
-42
lines changed

py/test/selenium/webdriver/common/webserver.py

+36-42
Original file line numberDiff line numberDiff line change
@@ -59,62 +59,56 @@ def updir():
5959

6060

6161
class HtmlOnlyHandler(BaseHTTPRequestHandler):
62-
"""Http handler."""
62+
"""Handler for HTML responses and JSON files."""
63+
64+
def _serve_page(self, page_number):
65+
"""Serve a dynamically generated HTML page."""
66+
html = f"""<html><head><title>Page{page_number}</title></head>
67+
<body>Page number <span id="pageNumber">{page_number}</span>
68+
<p><a href="../xhtmlTest.html" target="_top">top</a></p>
69+
</body></html>"""
70+
return html.encode("utf-8")
71+
72+
def _serve_file(self, file_path):
73+
"""Serve a file from the HTML root directory."""
74+
with open(file_path, encoding="latin-1") as f:
75+
return f.read().encode("utf-8")
76+
77+
def _send_response(self, content_type="text/html"):
78+
"""Send a response."""
79+
self.send_response(200)
80+
self.send_header("Content-type", content_type)
81+
self.end_headers()
6382

6483
def do_GET(self):
6584
"""GET method handler."""
6685
try:
6786
path = self.path[1:].split("?")[0]
68-
if path[:5] == "page/":
69-
html = """<html><head><title>Page{page_number}</title></head>
70-
<body>Page number <span id=\"pageNumber\">{page_number}</span>
71-
<p><a href=\"../xhtmlTest.html\" target=\"_top\">top</a>
72-
</body></html>""".format(
73-
page_number=path[5:]
74-
)
75-
html = html.encode("utf-8")
87+
file_path = os.path.join(HTML_ROOT, path)
88+
if path.startswith("page/"):
89+
html = self._serve_page(path[5:])
90+
self._send_response("text/html")
91+
self.wfile.write(html)
92+
elif os.path.isfile(file_path):
93+
content_type = "application/json" if file_path.endswith(".json") else "text/html"
94+
content = self._serve_file(file_path)
95+
self._send_response(content_type)
96+
self.wfile.write(content)
7697
else:
77-
with open(os.path.join(HTML_ROOT, path), encoding="latin-1") as f:
78-
html = f.read().encode("utf-8")
79-
self.send_response(200)
80-
self.send_header("Content-type", "text/html")
81-
self.end_headers()
82-
self.wfile.write(html)
98+
self.send_error(404, f"File Not Found: {path}")
8399
except OSError:
84100
self.send_error(404, f"File Not Found: {path}")
85101

86102
def do_POST(self):
87103
"""POST method handler."""
88104
try:
89105
remaining_bytes = int(self.headers["content-length"])
90-
contents = ""
91-
line = self.rfile.readline()
92-
contents += line.decode("utf-8")
93-
remaining_bytes -= len(line)
94-
line = self.rfile.readline()
95-
contents += line.decode("utf-8")
96-
remaining_bytes -= len(line)
97-
fn = re.findall(r'Content-Disposition.*name="upload"; filename="(.*)"', line.decode("utf-8"))
98-
if not fn:
99-
self.send_error(500, f"File not found. {contents}")
106+
contents = self.rfile.read(remaining_bytes).decode("utf-8")
107+
fn_match = re.search(r'Content-Disposition.*name="upload"; filename="(.*)"', contents)
108+
if not fn_match:
109+
self.send_error(500, f"File not found in content. {contents}")
100110
return
101-
line = self.rfile.readline()
102-
remaining_bytes -= len(line)
103-
contents += line.decode("utf-8")
104-
line = self.rfile.readline()
105-
remaining_bytes -= len(line)
106-
contents += line.decode("utf-8")
107-
preline = self.rfile.readline()
108-
remaining_bytes -= len(preline)
109-
while remaining_bytes > 0:
110-
line = self.rfile.readline()
111-
remaining_bytes -= len(line)
112-
contents += line.decode("utf-8")
113-
114-
self.send_response(200)
115-
self.send_header("Content-type", "text/html")
116-
self.end_headers()
117-
111+
self._send_response("text/html")
118112
self.wfile.write(
119113
f"""<!doctype html>
120114
{contents}

0 commit comments

Comments
 (0)