Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions betfairlightweight/streaming/betfairstream.py
Original file line number Diff line number Diff line change
Expand Up @@ -240,10 +240,10 @@ def _receive_all(self) -> Optional[str]:
"""Whilst socket is running receives data from socket,
till CRLF is detected.
"""
(data, part) = ("", "")
data = b""
crlf_bytes = bytes(self.__CRLF, encoding=self.__encoding)

while self._running and part[-2:] != crlf_bytes:
while self._running and not data.endswith(crlf_bytes):
try:
part = self._socket.recv(self.buffer_size)
except (socket.timeout, socket.error) as e:
Expand All @@ -264,8 +264,8 @@ def _receive_all(self) -> Optional[str]:
else:
return # 165, prevents error if stop is called mid recv

data += part.decode(self.__encoding)
return data
data += part
return data.decode(self.__encoding)

def _data(self, received_data: str) -> None:
"""Sends data to listener, if False is returned; socket
Expand Down
31 changes: 31 additions & 0 deletions tests/test_betfairstream.py
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,37 @@ def test_receive_all(self):
mock_socket.recv.assert_called_with(self.buffer_size)
assert data == data_return_value.decode("utf-8")

def test_receive_part_split(self):
part1 = b'{"op":"ccm","desc":"England v NZ \xe2'
part2 = b'\x80\x94 Test"}\r\n'
expected = part1 + part2

mock_socket = mock.Mock()
mock_socket.recv.side_effect = [part1, part2]
self.betfair_stream._socket = mock_socket
self.betfair_stream._running = True

data = self.betfair_stream._receive_all()

assert data == expected.decode("utf-8")
assert mock_socket.recv.call_count == 2
mock_socket.recv.assert_called_with(self.buffer_size)

def test_receive_crlf_split(self):
part1 = b'{"op":"status"}\r'
part2 = b"\n"
expected = part1 + part2

mock_socket = mock.Mock()
mock_socket.recv.side_effect = [part1, part2]
self.betfair_stream._socket = mock_socket
self.betfair_stream._running = True

data = self.betfair_stream._receive_all()

assert data == expected.decode("utf-8")
assert mock_socket.recv.call_count == 2

@mock.patch("betfairlightweight.streaming.betfairstream.BetfairStream.stop")
def test_receive_all_closed(self, mock_stop):
mock_socket = mock.Mock()
Expand Down
Loading