4
4
"""
5
5
`adafruit_httpserver.server.HTTPServer`
6
6
====================================================
7
- * Author(s): Dan Halbert
7
+ * Author(s): Dan Halbert, Michał Pokusa
8
8
"""
9
9
10
10
try :
11
11
from typing import Callable , Protocol
12
12
except ImportError :
13
13
pass
14
14
15
- from errno import EAGAIN , ECONNRESET
15
+ from errno import EAGAIN , ECONNRESET , ETIMEDOUT
16
16
17
17
from .methods import HTTPMethod
18
18
from .request import HTTPRequest
@@ -31,6 +31,7 @@ def __init__(self, socket_source: Protocol) -> None:
31
31
in CircuitPython or the `socket` module in CPython.
32
32
"""
33
33
self ._buffer = bytearray (1024 )
34
+ self ._timeout = 0
34
35
self .route_handlers = {}
35
36
self ._socket_source = socket_source
36
37
self ._sock = None
@@ -100,6 +101,7 @@ def poll(self):
100
101
try :
101
102
conn , _ = self ._sock .accept ()
102
103
with conn :
104
+ conn .settimeout (self ._timeout )
103
105
length , _ = conn .recvfrom_into (self ._buffer )
104
106
105
107
request = HTTPRequest (raw_request = self ._buffer [:length ])
@@ -154,3 +156,29 @@ def request_buffer_size(self) -> int:
154
156
@request_buffer_size .setter
155
157
def request_buffer_size (self , value : int ) -> None :
156
158
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