aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--netlib/tcp.py21
-rw-r--r--test/test_tcp.py35
2 files changed, 38 insertions, 18 deletions
diff --git a/netlib/tcp.py b/netlib/tcp.py
index 40bd4bde..556f97ac 100644
--- a/netlib/tcp.py
+++ b/netlib/tcp.py
@@ -355,20 +355,13 @@ class TCPServer:
while not self.__shutdown_request:
r, w, e = select.select([self.socket], [], [], poll_interval)
if self.socket in r:
- try:
- request, client_address = self.socket.accept()
- except socket.error:
- return
- try:
- t = threading.Thread(
- target = self.request_thread,
- args = (request, client_address)
- )
- t.setDaemon(1)
- t.start()
- except:
- self.handle_error(request, client_address)
- request.close()
+ request, client_address = self.socket.accept()
+ t = threading.Thread(
+ target = self.request_thread,
+ args = (request, client_address)
+ )
+ t.setDaemon(1)
+ t.start()
finally:
self.__shutdown_request = False
self.__is_shut_down.set()
diff --git a/test/test_tcp.py b/test/test_tcp.py
index 6ff42072..f12a131b 100644
--- a/test/test_tcp.py
+++ b/test/test_tcp.py
@@ -20,10 +20,7 @@ class EchoHandler(tcp.BaseHandler):
def handle(self):
v = self.rfile.readline()
- if v.startswith("echo"):
- self.wfile.write(v)
- elif v.startswith("error"):
- raise ValueError("Testing an error.")
+ self.wfile.write(v)
self.wfile.flush()
@@ -69,6 +66,35 @@ class TestServer(test.ServerTestBase):
assert c.rfile.readline() == testval
+
+class FinishFailHandler(tcp.BaseHandler):
+ def handle(self):
+ v = self.rfile.readline()
+ self.wfile.write(v)
+ self.wfile.flush()
+ o = mock.MagicMock()
+ self.wfile.close()
+ self.rfile.close()
+ self.close = mock.MagicMock(side_effect=socket.error)
+
+
+class TestFinishFail(test.ServerTestBase):
+ """
+ This tests a difficult-to-trigger exception in the .finish() method of
+ the handler.
+ """
+ handler = FinishFailHandler
+ def test_disconnect_in_finish(self):
+ testval = "echo!\n"
+ c = tcp.TCPClient("127.0.0.1", self.port)
+ c.connect()
+ c.wfile.write("foo\n")
+ c.wfile.flush()
+ c.rfile.read(4)
+ h = self.last_handler
+ h.finish()
+
+
class TestDisconnect(test.ServerTestBase):
handler = EchoHandler
def test_echo(self):
@@ -317,3 +343,4 @@ class TestFileLike:
expected = s.first_byte_timestamp
s.readline()
assert s.first_byte_timestamp == expected
+