From 30e8e23d7cf666c406901d85a59d16401dca67ab Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Sun, 4 Mar 2012 21:27:42 -0500 Subject: Simplify llleap_test.cpp plugin by reading individual characters. While we're accumulating the 'length:' prefix, the present socket-based logic reads 20 characters, then reads 'length' more, then discards any excess (in case the whole 'length:data' packet ends up being less than 20 characters). That's probably a bug: whatever characters follow that packet, however short it may be, are probably the 'length:' prefix of the next packet. We probably only get away with it because we probably never send packets that short. Earlier llleap_test.cpp plugin logic still read 20 characters, then, if there were any left after the present packet, cached them as the start of the next packet. This is probably more correct, but complicated. Easier just to read individual characters until we've seen 'length:', then try for exactly the specified length over however many reads that requires. --- indra/llcommon/tests/llleap_test.cpp | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/indra/llcommon/tests/llleap_test.cpp b/indra/llcommon/tests/llleap_test.cpp index 677f4830ea..73d7217608 100644 --- a/indra/llcommon/tests/llleap_test.cpp +++ b/indra/llcommon/tests/llleap_test.cpp @@ -101,32 +101,25 @@ namespace tut " sys.path.insert(0,\n" " os.path.join(mydir, os.pardir, os.pardir, 'lib', 'python'))\n" " from indra.base import llsd\n" - "LEFTOVER = ''\n" "class ProtocolError(Exception):\n" " pass\n" "def get():\n" - " global LEFTOVER\n" - " hdr = LEFTOVER\n" - " if ':' not in hdr:\n" - " hdr += sys.stdin.read(20)\n" + " hdr = ''\n" + " while ':' not in hdr and len(hdr) < 20:\n" + " hdr += sys.stdin.read(1)\n" " if not hdr:\n" " sys.exit(0)\n" - " parts = hdr.split(':', 1)\n" - " if len(parts) != 2:\n" + " if not hdr.endswith(':'):\n" " raise ProtocolError('Expected len:data, got %r' % hdr)\n" " try:\n" - " length = int(parts[0])\n" + " length = int(hdr[:-1])\n" " except ValueError:\n" - " raise ProtocolError('Non-numeric len %r' % parts[0])\n" - " del parts[0]\n" - " received = len(parts[0])\n" + " raise ProtocolError('Non-numeric len %r' % hdr[:-1])\n" + " parts = []\n" + " received = 0\n" " while received < length:\n" " parts.append(sys.stdin.read(length - received))\n" " received += len(parts[-1])\n" - " if received > length:\n" - " excess = length - received\n" - " LEFTOVER = parts[-1][excess:]\n" - " parts[-1] = parts[-1][:excess]\n" " data = ''.join(parts)\n" " assert len(data) == length\n" " try:\n" -- cgit v1.2.3