Add a socket read timeout to abort incomplete requests (Fixes #99)
This commit is contained in:
@@ -43,11 +43,13 @@ try:
|
|||||||
except ImportError:
|
except ImportError:
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
socket_timeout_error = OSError
|
||||||
try:
|
try:
|
||||||
import usocket as socket
|
import usocket as socket
|
||||||
except ImportError:
|
except ImportError:
|
||||||
try:
|
try:
|
||||||
import socket
|
import socket
|
||||||
|
socket_timeout_error = socket.timeout
|
||||||
except ImportError: # pragma: no cover
|
except ImportError: # pragma: no cover
|
||||||
socket = None
|
socket = None
|
||||||
|
|
||||||
@@ -300,6 +302,11 @@ class Request():
|
|||||||
#: Request.max_readline = 16 * 1024 # 16KB lines allowed
|
#: Request.max_readline = 16 * 1024 # 16KB lines allowed
|
||||||
max_readline = 2 * 1024
|
max_readline = 2 * 1024
|
||||||
|
|
||||||
|
#: Specify a suggested read timeout to use when reading the request. Set to
|
||||||
|
#: 0 to disable the use of a timeout. This timeout should be considered a
|
||||||
|
#: suggestion only, as some platforms may not support it.
|
||||||
|
socket_read_timeout = 0.1
|
||||||
|
|
||||||
class G:
|
class G:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -1085,6 +1092,9 @@ class Microdot():
|
|||||||
return f
|
return f
|
||||||
|
|
||||||
def handle_request(self, sock, addr):
|
def handle_request(self, sock, addr):
|
||||||
|
if Request.socket_read_timeout and \
|
||||||
|
hasattr(sock, 'settimeout'): # pragma: no cover
|
||||||
|
sock.settimeout(Request.socket_read_timeout)
|
||||||
if not hasattr(sock, 'readline'): # pragma: no cover
|
if not hasattr(sock, 'readline'): # pragma: no cover
|
||||||
stream = sock.makefile("rwb")
|
stream = sock.makefile("rwb")
|
||||||
else:
|
else:
|
||||||
@@ -1095,6 +1105,9 @@ class Microdot():
|
|||||||
try:
|
try:
|
||||||
req = Request.create(self, stream, addr, sock)
|
req = Request.create(self, stream, addr, sock)
|
||||||
res = self.dispatch_request(req)
|
res = self.dispatch_request(req)
|
||||||
|
except socket_timeout_error as exc: # pragma: no cover
|
||||||
|
if exc.errno and exc.errno != 60:
|
||||||
|
print_exception(exc) # not a timeout
|
||||||
except Exception as exc: # pragma: no cover
|
except Exception as exc: # pragma: no cover
|
||||||
print_exception(exc)
|
print_exception(exc)
|
||||||
try:
|
try:
|
||||||
|
|||||||
Reference in New Issue
Block a user