# HG changeset patch # User Matthew Wild # Date 1624973157 -3600 # Node ID 19cddf92fcc248f2d1ed39227c5fb5c1f9059290 # Parent 11e0a0a08da3b3db6e3500eec12b0621208d862f util.dbuffer: Fix bugs, remove multi-char support (more complex than first thought) Character sequences could be split across chunk boundaries. Would require a bunch of code to make that work reliably. Only apply front_consumed on first chunk, and adjust buffer_pos accordingly. diff -r 11e0a0a08da3 -r 19cddf92fcc2 spec/util_dbuffer_spec.lua --- a/spec/util_dbuffer_spec.lua Tue Jun 29 13:48:14 2021 +0100 +++ b/spec/util_dbuffer_spec.lua Tue Jun 29 14:25:57 2021 +0100 @@ -57,27 +57,6 @@ assert.equal(nil, b:read_until("\n")); assert.equal("and more", b:read_chunk()); end); - - it("works with multi-character sequences", function () - local b = dbuffer.new(); - b:write("hello\r\n"); - b:write("world"); - b:write("\r\n"); - b:write("\r\n\r\n"); - b:write("stuff"); - b:write("more\r\nand more"); - - assert.equal(nil, b:read_until(".")); - assert.equal(nil, b:read_until("%")); - assert.equal("hello\r\n", b:read_until("\r\n")); - assert.equal("world\r\n", b:read_until("\r\n")); - assert.equal("\r\n", b:read_until("\r\n")); - assert.equal("\r\n", b:read_until("\r\n")); - assert.equal("stu", b:read(3)); - assert.equal("ffmore\r\n", b:read_until("\r\n")); - assert.equal(nil, b:read_until("\r\n")); - assert.equal("and more", b:read_chunk()); - end); end); describe(":discard", function () diff -r 11e0a0a08da3 -r 19cddf92fcc2 util/dbuffer.lua --- a/util/dbuffer.lua Tue Jun 29 13:48:14 2021 +0100 +++ b/util/dbuffer.lua Tue Jun 29 14:25:57 2021 +0100 @@ -80,12 +80,12 @@ function dbuffer_methods:read_until(char) local buffer_pos = 0; for i, chunk in self.items:items() do - local start = 1 + self.front_consumed; + local start = 1 + ((i == 1) and self.front_consumed or 0); local char_pos = chunk:find(char, start, true); if char_pos then - return self:read(buffer_pos + (char_pos - start) + #char); + return self:read(1 + buffer_pos + char_pos - start); end - buffer_pos = buffer_pos + #chunk; + buffer_pos = buffer_pos + #chunk - (start - 1); end return nil; end