From f97db45bbe6072ae08c56773ba49eb9f5b779725 Mon Sep 17 00:00:00 2001 From: Antonin ENFRUN Date: Thu, 12 Nov 2020 18:03:58 +0100 Subject: [PATCH 1/3] wsgiserver: implement parse_headers, add 500 Internal Server Error when the wsgi application misbehaves, and make sure nobody think we can handle keep-alive requests. --- .../adafruit_esp32spi_wsgiserver.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/adafruit_esp32spi/adafruit_esp32spi_wsgiserver.py b/adafruit_esp32spi/adafruit_esp32spi_wsgiserver.py index c869575..1510363 100644 --- a/adafruit_esp32spi/adafruit_esp32spi_wsgiserver.py +++ b/adafruit_esp32spi/adafruit_esp32spi_wsgiserver.py @@ -31,7 +31,6 @@ import io import gc from micropython import const -from adafruit_requests import parse_headers import adafruit_esp32spi.adafruit_esp32spi_socket as socket _the_interface = None # pylint: disable=invalid-name @@ -46,6 +45,18 @@ def set_interface(iface): NO_SOCK_AVAIL = const(255) + +def parse_headers(client): + headers = {} + while True: + line = str(client.readline(), "utf-8") + if not line: + break + title, content = line.split(':', 1) + headers[title.strip().lower()] = content.strip() + return headers + + # pylint: disable=invalid-name class WSGIServer: """ @@ -99,7 +110,7 @@ def finish_response(self, result): :param string result: the data string to send back in the response to the client. """ try: - response = "HTTP/1.1 {0}\r\n".format(self._response_status) + response = "HTTP/1.1 {0}\r\n".format(self._response_status or "500 ISE") for header in self._response_headers: response += "{0}: {1}\r\n".format(*header) response += "\r\n" @@ -159,7 +170,7 @@ def _start_response(self, status, response_headers): ex ("header-name", "header value") """ self._response_status = status - self._response_headers = [("Server", "esp32WSGIServer")] + response_headers + self._response_headers = [("Server", "esp32WSGIServer"), ("Connection", "close")] + response_headers def _get_environ(self, client): """ From c54ec1f9f79d93aa59cce610cd6c94e4d83bf1de Mon Sep 17 00:00:00 2001 From: Antonin ENFRUN Date: Thu, 12 Nov 2020 18:55:31 +0100 Subject: [PATCH 2/3] blackd --- adafruit_esp32spi/adafruit_esp32spi_wsgiserver.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/adafruit_esp32spi/adafruit_esp32spi_wsgiserver.py b/adafruit_esp32spi/adafruit_esp32spi_wsgiserver.py index 1510363..698f220 100644 --- a/adafruit_esp32spi/adafruit_esp32spi_wsgiserver.py +++ b/adafruit_esp32spi/adafruit_esp32spi_wsgiserver.py @@ -52,7 +52,7 @@ def parse_headers(client): line = str(client.readline(), "utf-8") if not line: break - title, content = line.split(':', 1) + title, content = line.split(":", 1) headers[title.strip().lower()] = content.strip() return headers @@ -170,7 +170,10 @@ def _start_response(self, status, response_headers): ex ("header-name", "header value") """ self._response_status = status - self._response_headers = [("Server", "esp32WSGIServer"), ("Connection", "close")] + response_headers + self._response_headers = [ + ("Server", "esp32WSGIServer"), + ("Connection", "close"), + ] + response_headers def _get_environ(self, client): """ From 03954197d1b4e15e7fab5c8b8e5e141c7f755398 Mon Sep 17 00:00:00 2001 From: Antonin ENFRUN Date: Thu, 12 Nov 2020 19:58:32 +0100 Subject: [PATCH 3/3] documentation --- adafruit_esp32spi/adafruit_esp32spi_wsgiserver.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/adafruit_esp32spi/adafruit_esp32spi_wsgiserver.py b/adafruit_esp32spi/adafruit_esp32spi_wsgiserver.py index 698f220..8d74965 100644 --- a/adafruit_esp32spi/adafruit_esp32spi_wsgiserver.py +++ b/adafruit_esp32spi/adafruit_esp32spi_wsgiserver.py @@ -47,6 +47,10 @@ def set_interface(iface): def parse_headers(client): + """ + Parses the header portion of an HTTP request from the socket. + Expects first line of HTTP request to have been read already. + """ headers = {} while True: line = str(client.readline(), "utf-8")