Pull response parsing inside of _send_request().

This commit is contained in:
Solderpunk 2023-11-14 08:56:39 +01:00
parent 7f1aa5cbf3
commit 01da844141
1 changed files with 20 additions and 17 deletions

37
av98.py
View File

@ -423,7 +423,7 @@ Slow internet connection? Use 'set timeout' to be more patient.""")
# Send request to server
try:
address, f = self._send_request(gi)
status, meta, address, f = self._send_request(gi)
except Exception as err:
if isinstance(err, socket.gaierror):
self.log["dns_failures"] += 1
@ -435,21 +435,6 @@ Slow internet connection? Use 'set timeout' to be more patient.""")
self.log["timeouts"] += 1
raise err
# Spec dictates <META> should not exceed 1024 bytes,
# so maximum valid header length is 1027 bytes.
header = f.readline(1027)
header = header.decode("UTF-8")
if not header or header[-1] != '\n':
raise RuntimeError("Received invalid header from server!")
header = header.strip()
ui_out.debug("Response header: %s." % header)
# Validate header
status, meta = header.split(maxsplit=1) if header[2:].strip() else (header[:2], "")
if len(meta) > 1024 or len(status) != 2 or not status.isnumeric():
f.close()
raise RuntimeError("Received invalid header from server!")
# Update redirect loop/maze escaping state
if not status.startswith("3"):
self.previous_redirectors = set()
@ -641,7 +626,25 @@ Slow internet connection? Use 'set timeout' to be more patient.""")
# Send request and wrap response in a file descriptor
ui_out.debug("Sending %s<CRLF>" % gi.url)
s.sendall((gi.url + CRLF).encode("UTF-8"))
return address, s.makefile(mode = "rb")
# Read back response
f = s.makefile(mode = "rb")
# Spec dictates <META> should not exceed 1024 bytes,
# so maximum valid header length is 1027 bytes.
header = f.readline(1027)
header = header.decode("UTF-8")
if not header or header[-1] != '\n':
raise RuntimeError("Received invalid header from server!")
header = header.strip()
ui_out.debug("Response header: %s." % header)
# Validate header
status, meta = header.split(maxsplit=1) if header[2:].strip() else (header[:2], "")
if len(meta) > 1024 or len(status) != 2 or not status.isnumeric():
f.close()
raise RuntimeError("Received invalid header from server!")
return status, meta, address, f
def _get_addresses(self, host, port):
# DNS lookup - will get IPv4 and IPv6 records if IPv6 is enabled