aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNguyễn Gia Phong <cnx@loang.net>2025-06-19 11:02:53 +0900
committerNguyễn Gia Phong <cnx@loang.net>2025-06-19 11:02:53 +0900
commita4ee50e312a8342c9a907119d091778379bfe0cb (patch)
treecd059bf9356ec2c8e36e0648adc690a68d41c6f8
parent8ce9b9a84b7e05610b7dca71c3f29ba955fc78fd (diff)
downloadscadere-a4ee50e312a8342c9a907119d091778379bfe0cb.tar.gz
Avoid premature flushing0.1.1
The HTTP headers are nowhere near filling the buffer, and our naïve backpressure implementation is not effective anyway References: bd2898d5182e ("Relieve backpressure")
-rw-r--r--src/scadere/listen.py44
1 files changed, 19 insertions, 25 deletions
diff --git a/src/scadere/listen.py b/src/scadere/listen.py
index 3c44407..1ae7281 100644
--- a/src/scadere/listen.py
+++ b/src/scadere/listen.py
@@ -69,27 +69,24 @@ def supported_http_version(version):
return False
-async def write_status(writer, http_version, status):
+def write_status(writer, http_version, status):
"""Write the given HTTP status line."""
status = f'HTTP/{http_version} {status.value} {status.phrase}\r\n'
writer.write(status.encode())
- await writer.drain()
-async def write_content_type(writer, content_type):
+def write_content_type(writer, content_type):
"""Write the given HTTP content type."""
writer.write(f'Content-Type: {content_type}\r\n'.encode())
- await writer.drain()
-async def describe_status(writer, status, http_version='1.1'):
+def describe_status(writer, status, http_version='1.1'):
"""Write a HTTP/1.1 response including status description."""
- await write_status(writer, http_version, status)
+ write_status(writer, http_version, status)
content = f'{status.description}\n'.encode()
- await write_content_type(writer, 'text/plain')
+ write_content_type(writer, 'text/plain')
writer.write(f'Content-Length: {len(content)}\r\n\r\n'.encode())
writer.write(content)
- await writer.drain()
def body(not_before, not_after, hostname, port, number, string):
@@ -217,20 +214,18 @@ def unparsed_page(*args):
xml_declaration=True, default_namespace=None)
-async def write_xml(writer, http_version, application, func, *args):
+def write_xml(writer, http_version, application, func, *args):
"""Write given document as XML."""
try:
content = func(*args).encode()
except Exception: # pragma: no cover
- await describe_status(writer, HTTPStatus.INTERNAL_SERVER_ERROR,
- http_version)
+ describe_status(writer, HTTPStatus.INTERNAL_SERVER_ERROR, http_version)
raise
else:
- await write_status(writer, http_version, HTTPStatus.OK)
- await write_content_type(writer, f'application/{application}+xml')
+ write_status(writer, http_version, HTTPStatus.OK)
+ write_content_type(writer, f'application/{application}+xml')
writer.write(f'Content-Length: {len(content)}\r\n\r\n'.encode())
writer.write(content)
- await writer.drain()
async def handle(certs, base_url, reader, writer, title=None):
@@ -239,11 +234,11 @@ async def handle(certs, base_url, reader, writer, title=None):
try:
request = await reader.readuntil(b'\r\n')
except Exception:
- await describe_status(writer, HTTPStatus.BAD_REQUEST)
+ describe_status(writer, HTTPStatus.BAD_REQUEST)
return
if not request.startswith(b'GET '):
- await describe_status(writer, HTTPStatus.METHOD_NOT_ALLOWED)
+ describe_status(writer, HTTPStatus.METHOD_NOT_ALLOWED)
return
try:
@@ -253,8 +248,7 @@ async def handle(certs, base_url, reader, writer, title=None):
if not supported_http_version(http_version):
raise ValueError
except ValueError:
- await describe_status(writer,
- HTTPStatus.HTTP_VERSION_NOT_SUPPORTED)
+ describe_status(writer, HTTPStatus.HTTP_VERSION_NOT_SUPPORTED)
return
try:
@@ -270,18 +264,18 @@ async def handle(certs, base_url, reader, writer, title=None):
if title is None:
title = certs.name
except Exception: # pragma: no cover
- await describe_status(writer, HTTPStatus.INTERNAL_SERVER_ERROR,
- http_version)
+ describe_status(writer, HTTPStatus.INTERNAL_SERVER_ERROR,
+ http_version)
raise
if url_parts.path == urlsplit(base_url).path: # Atom feed
- await write_xml(writer, http_version, 'atom', unparsed_feed,
- base_url, title, mtime, summaries, domains)
+ write_xml(writer, http_version, 'atom', unparsed_feed,
+ base_url, title, mtime, summaries, domains)
elif url_parts.path in lookup: # accessible Atom entry's link/ID
- await write_xml(writer, http_version, 'xhtml', unparsed_page,
- lookup.get(url_parts.path))
+ write_xml(writer, http_version, 'xhtml', unparsed_page,
+ lookup.get(url_parts.path))
else:
- await describe_status(writer, HTTPStatus.NOT_FOUND, http_version)
+ describe_status(writer, HTTPStatus.NOT_FOUND, http_version)
finally:
assert writer.can_write_eof()
writer.write_eof()