From 8d55322316687cf98b8046af21c0f6f40ebfc544 Mon Sep 17 00:00:00 2001 From: michalpokusa <72110769+michalpokusa@users.noreply.github.com> Date: Thu, 1 Feb 2024 15:41:13 +0000 Subject: [PATCH 1/2] Updated CPython example to use port 5000 by default and added explanation for that --- examples/httpserver_cpython.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/httpserver_cpython.py b/examples/httpserver_cpython.py index 77860f3..292b931 100644 --- a/examples/httpserver_cpython.py +++ b/examples/httpserver_cpython.py @@ -19,4 +19,6 @@ def base(request: Request): return Response(request, "Hello from the CircuitPython HTTP Server!") -server.serve_forever("0.0.0.0") +# Ports below 1024 are reserved for root user only. +# If you want to run this example on a port below 1024, you need to run it as root (or with `sudo`). +server.serve_forever("0.0.0.0", 5000) From 6944481170a075b423fd07a91d2055bbbd20ca0f Mon Sep 17 00:00:00 2001 From: michalpokusa <72110769+michalpokusa@users.noreply.github.com> Date: Thu, 1 Feb 2024 15:45:13 +0000 Subject: [PATCH 2/2] Added reuse behaviour for CPython --- adafruit_httpserver/server.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/adafruit_httpserver/server.py b/adafruit_httpserver/server.py index fbf3d0c..f103b2c 100644 --- a/adafruit_httpserver/server.py +++ b/adafruit_httpserver/server.py @@ -210,9 +210,15 @@ def start(self, host: str, port: int = 80) -> None: self._sock = self._socket_source.socket( self._socket_source.AF_INET, self._socket_source.SOCK_STREAM ) - self._sock.bind((host, port)) - self._sock.listen(10) - self._sock.setblocking(False) # Non-blocking socket + try: + # Only for CPython, prevents "Address already in use" error + self._sock.setsockopt( + self._socket_source.SOL_SOCKET, self._socket_source.SO_REUSEADDR, 1 + ) + finally: + self._sock.bind((host, port)) + self._sock.listen(10) + self._sock.setblocking(False) # Non-blocking socket if self.debug: _debug_started_server(self)