44"""
55`adafruit_httpserver.server.HTTPServer`
66====================================================
7- * Author(s): Dan Halbert
7+ * Author(s): Dan Halbert, Michał Pokusa
88"""
99
1010try :
1111 from typing import Callable , Protocol
1212except ImportError :
1313 pass
1414
15- from errno import EAGAIN , ECONNRESET
15+ from errno import EAGAIN , ECONNRESET , ETIMEDOUT
1616
1717from .methods import HTTPMethod
1818from .request import HTTPRequest
@@ -31,6 +31,7 @@ def __init__(self, socket_source: Protocol) -> None:
3131 in CircuitPython or the `socket` module in CPython.
3232 """
3333 self ._buffer = bytearray (1024 )
34+ self ._timeout = 0
3435 self .route_handlers = {}
3536 self ._socket_source = socket_source
3637 self ._sock = None
@@ -100,6 +101,7 @@ def poll(self):
100101 try :
101102 conn , _ = self ._sock .accept ()
102103 with conn :
104+ conn .settimeout (self ._timeout )
103105 length , _ = conn .recvfrom_into (self ._buffer )
104106
105107 request = HTTPRequest (raw_request = self ._buffer [:length ])
@@ -154,3 +156,29 @@ def request_buffer_size(self) -> int:
154156 @request_buffer_size .setter
155157 def request_buffer_size (self , value : int ) -> None :
156158 self ._buffer = bytearray (value )
159+
160+ @property
161+ def socket_timeout (self ) -> int :
162+ """
163+ Timeout after which the socket will stop waiting for more incoming data.
164+ When exceeded, raises `OSError` with `errno.ETIMEDOUT`.
165+
166+ Default timeout is 0, which means socket is in non-blocking mode.
167+
168+ Example::
169+
170+ server = HTTPServer(pool)
171+ server.socket_timeout = 3
172+
173+ server.serve_forever(str(wifi.radio.ipv4_address))
174+ """
175+ return self ._timeout
176+
177+ @socket_timeout .setter
178+ def socket_timeout (self , value : int ) -> None :
179+ if isinstance (value , (int , float )) and value >= 0 :
180+ self ._timeout = value
181+ else :
182+ raise TypeError (
183+ "HTTPServer.socket_timeout must be a non-negative numeric value."
184+ )
0 commit comments