Skip to content

Commit eaea81d

Browse files
committed
Added HTTPServer.socket_timeout
1 parent 0fe7bd7 commit eaea81d

File tree

1 file changed

+30
-2
lines changed

1 file changed

+30
-2
lines changed

adafruit_httpserver/server.py

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@
44
"""
55
`adafruit_httpserver.server.HTTPServer`
66
====================================================
7-
* Author(s): Dan Halbert
7+
* Author(s): Dan Halbert, Michał Pokusa
88
"""
99

1010
try:
1111
from typing import Callable, Protocol
1212
except ImportError:
1313
pass
1414

15-
from errno import EAGAIN, ECONNRESET
15+
from errno import EAGAIN, ECONNRESET, ETIMEDOUT
1616

1717
from .methods import HTTPMethod
1818
from .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

Comments
 (0)