network: Respond to messages before closing connections
This makes a connection tell the actor to stop the connection, instead of stopping it itself. This is preferable, because other messages sent to the actor that is not processed yet, may now send data to the client. E.g. it makes this work: $ echo status | nc localhost 6600
This commit is contained in:
parent
203b13aad7
commit
d62ad966af
@ -267,7 +267,8 @@ class Connection(object):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
if not data:
|
if not data:
|
||||||
self.stop('Client most likely disconnected.')
|
self.actor_ref.tell({'close': True})
|
||||||
|
self.disable_recv()
|
||||||
return True
|
return True
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -348,6 +349,10 @@ class LineProtocol(pykka.ThreadingActor):
|
|||||||
|
|
||||||
def on_receive(self, message):
|
def on_receive(self, message):
|
||||||
"""Handle messages with new data from server."""
|
"""Handle messages with new data from server."""
|
||||||
|
if 'close' in message:
|
||||||
|
self.connection.stop('Client most likely disconnected.')
|
||||||
|
return
|
||||||
|
|
||||||
if 'received' not in message:
|
if 'received' not in message:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@ -416,7 +416,8 @@ class ConnectionTest(unittest.TestCase):
|
|||||||
|
|
||||||
self.assertTrue(network.Connection.recv_callback(
|
self.assertTrue(network.Connection.recv_callback(
|
||||||
self.mock, sentinel.fd, gobject.IO_IN))
|
self.mock, sentinel.fd, gobject.IO_IN))
|
||||||
self.mock.stop.assert_called_once_with(any_unicode)
|
self.mock.actor_ref.tell.assert_called_once_with({'close': True})
|
||||||
|
self.mock.disable_recv.assert_called_once_with()
|
||||||
|
|
||||||
def test_recv_callback_recoverable_error(self):
|
def test_recv_callback_recoverable_error(self):
|
||||||
self.mock.sock = Mock(spec=socket.SocketType)
|
self.mock.sock = Mock(spec=socket.SocketType)
|
||||||
|
|||||||
@ -8,6 +8,8 @@ import unittest
|
|||||||
|
|
||||||
from mopidy.utils import network
|
from mopidy.utils import network
|
||||||
|
|
||||||
|
from tests import any_unicode
|
||||||
|
|
||||||
|
|
||||||
class LineProtocolTest(unittest.TestCase):
|
class LineProtocolTest(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
@ -33,6 +35,14 @@ class LineProtocolTest(unittest.TestCase):
|
|||||||
network.LineProtocol.__init__(self.mock, sentinel.connection)
|
network.LineProtocol.__init__(self.mock, sentinel.connection)
|
||||||
self.assertEqual(delimiter, self.mock.delimiter)
|
self.assertEqual(delimiter, self.mock.delimiter)
|
||||||
|
|
||||||
|
def test_on_receive_close_calls_stop(self):
|
||||||
|
self.mock.connection = Mock(spec=network.Connection)
|
||||||
|
self.mock.recv_buffer = ''
|
||||||
|
self.mock.parse_lines.return_value = []
|
||||||
|
|
||||||
|
network.LineProtocol.on_receive(self.mock, {'close': True})
|
||||||
|
self.mock.connection.stop.assert_called_once_with(any_unicode)
|
||||||
|
|
||||||
def test_on_receive_no_new_lines_adds_to_recv_buffer(self):
|
def test_on_receive_no_new_lines_adds_to_recv_buffer(self):
|
||||||
self.mock.connection = Mock(spec=network.Connection)
|
self.mock.connection = Mock(spec=network.Connection)
|
||||||
self.mock.recv_buffer = ''
|
self.mock.recv_buffer = ''
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user