From 3170cfddfd2910e4a4f3a10aa612dd0c422835d9 Mon Sep 17 00:00:00 2001 From: Adam Kelly Date: Tue, 17 May 2022 17:00:49 +0100 Subject: [PATCH 1/2] Change request handling to use split instead of regular expressions. The regular expression fails with a stack overflow for paths of more than 135 characters. The splits also appears to be much faster. Co-authored-by: Shae Erisson --- adafruit_httpserver.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/adafruit_httpserver.py b/adafruit_httpserver.py index c904373..340d0d6 100644 --- a/adafruit_httpserver.py +++ b/adafruit_httpserver.py @@ -26,7 +26,6 @@ from errno import EAGAIN, ECONNRESET import os -import re __version__ = "0.0.0-auto.0" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_HTTPServer.git" @@ -60,8 +59,6 @@ def __str__(self): class _HTTPRequest: - _REQUEST_RE = re.compile(r"(\S+)\s+(\S+)\s") - def __init__( self, path: str = "", method: str = "", raw_request: bytes = None ) -> None: @@ -70,12 +67,12 @@ def __init__( self.method = method else: # Parse request data from raw request - match = self._REQUEST_RE.match(raw_request.decode("utf8")) - if match: - self.path = match.group(2) - self.method = match.group(1) - else: - raise ValueError("Unparseable raw_request:", raw_request) + request_text = raw_request.decode('utf8') + first_line = request_text[:request_text.find('\n')] + try: + (self.method, self.path, _httpversion) = first_line.split() + except ValueError: + raise ValueError("Unparseable raw_request: ", raw_request) def __hash__(self) -> int: return hash(self.method) ^ hash(self.path) From bfbcf1cdcc7df82c9e69758fdedcd735f73e57f2 Mon Sep 17 00:00:00 2001 From: Adam Kelly Date: Tue, 17 May 2022 17:20:38 +0100 Subject: [PATCH 2/2] Linting and formatting. --- adafruit_httpserver.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/adafruit_httpserver.py b/adafruit_httpserver.py index 340d0d6..ae2f75a 100644 --- a/adafruit_httpserver.py +++ b/adafruit_httpserver.py @@ -67,12 +67,12 @@ def __init__( self.method = method else: # Parse request data from raw request - request_text = raw_request.decode('utf8') - first_line = request_text[:request_text.find('\n')] + request_text = raw_request.decode("utf8") + first_line = request_text[: request_text.find("\n")] try: (self.method, self.path, _httpversion) = first_line.split() - except ValueError: - raise ValueError("Unparseable raw_request: ", raw_request) + except ValueError as exc: + raise ValueError("Unparseable raw_request: ", raw_request) from exc def __hash__(self) -> int: return hash(self.method) ^ hash(self.path)