From 1a68343596ffb53a4feb58348964afbba9e387e0 Mon Sep 17 00:00:00 2001 From: dormando Date: Tue, 28 Feb 2023 18:55:27 -0800 Subject: proxy: fix trailingdata error with ascii multiget One of the side effects of pre-warming all of the tests I did with multiget, and not having done a second round on the unit tests, is that we somehow never tried an ascii multiget against a damn miss. Easy to test, easy to fix. --- proxy_network.c | 5 +++++ t/proxyunits.t | 15 +++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/proxy_network.c b/proxy_network.c index 0334971..e18516f 100644 --- a/proxy_network.c +++ b/proxy_network.c @@ -1037,6 +1037,11 @@ static int proxy_backend_drive_machine(mcp_backend_t *be) { if (p->ascii_multiget && r->resp.type == MCMC_RESP_END) { // Ascii multiget hack mode; consume END's + be->rbufused -= r->resp.reslen; + if (be->rbufused > 0) { + memmove(be->rbuf, be->rbuf+r->resp.reslen, be->rbufused); + } + be->state = mcp_backend_next; break; } diff --git a/t/proxyunits.t b/t/proxyunits.t index 5d46d1c..b9b98a6 100644 --- a/t/proxyunits.t +++ b/t/proxyunits.t @@ -362,6 +362,21 @@ check_version($ps); is(scalar <$ps>, "$key\r\n", "multiget value $key"); } is(scalar <$ps>, "END\r\n", "final END from multiget"); + + # Test multiget workaround with misses (known bug) + print $ps $cmd; + is(scalar <$be>, "get /b/c\r\n", "multiget breakdown c"); + is(scalar <$be>, "get /b/b\r\n", "multiget breakdown b"); + is(scalar <$be>, "get /b/a\r\n", "multiget breakdown a"); + + print $be "END\r\nEND\r\nEND\r\n"; + is(scalar <$ps>, "END\r\n", "final END from multiget"); + + # If bugged, the backend will have closed. + print $ps "get /b/a\r\n"; + is(scalar <$be>, "get /b/a\r\n", "get works after empty multiget"); + print $be "END\r\n"; + is(scalar <$ps>, "END\r\n", "end after empty multiget"); } check_version($ps); -- cgit v1.2.1