Skip to content

Commit

Permalink
more tests, hopefully last fix
Browse files Browse the repository at this point in the history
deleting a flag/token was leaving an empty space at the end of the
request
  • Loading branch information
dormando committed Mar 7, 2024
1 parent da1cfbe commit d54420f
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 4 deletions.
11 changes: 9 additions & 2 deletions proxy_request.c
Original file line number Diff line number Diff line change
Expand Up @@ -522,6 +522,11 @@ int mcp_request_render(mcp_request_t *rq, int idx, const char flag, const char *
}
memcpy(p, &pr->request[pr->tokens[idx+1]], pr->tokens[pr->ntokens] - pr->tokens[idx+1]);
p += pr->tokens[pr->ntokens] - pr->tokens[idx+1];
} else {
// If we removed something from the end we might've left some spaces.
while (*(p-1) == ' ') {
p--;
}
}

memcpy(p, "\r\n\0", 3);
Expand Down Expand Up @@ -924,8 +929,10 @@ int mcplib_request_flag_set(lua_State *L) {
size_t tlen = 0;
const char *token = _mcp_request_check_flag_token(L, 3, tostring, &tlen);

if (x > 0 && token != NULL) {
// Do nothing if flag already exists and we have no token
if (x > 0) {
// TODO: do nothing if:
// flag exists in request, without token, and we're not setting a
// token.
if (mcp_request_render(rq, x, flag, token, tlen) != 0) {
lua_pushboolean(L, 0);
return 1;
Expand Down
22 changes: 22 additions & 0 deletions t/proxyrequest.lua
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,28 @@ function mcp_config_routes(p)
else
return "HD\r\n"
end
elseif k == "setflag" then
-- technically protocol invalid but should work.
if r:flag_set("O") then
return rctx:enqueue_and_wait(r, h)
else
return "HD\r\n"
end
end

-- don't need full set of tests anymore since this function reuses
-- the code for add/set.
if k == "repl1" then
r:flag_replace("F", "O", "foo")
return rctx:enqueue_and_wait(r, h)
elseif k == "repl2" then
r:flag_replace("F", "O")
return rctx:enqueue_and_wait(r, h)
end

if k == "del1" then
r:flag_del("O")
return rctx:enqueue_and_wait(r, h)
end
end
end})
Expand Down
57 changes: 55 additions & 2 deletions t/proxyrequest.t
Original file line number Diff line number Diff line change
Expand Up @@ -71,16 +71,69 @@ subtest 'req:flag_set()' => sub {
$t->clear();

$t->c_send("mg setexist N50 Oexists\r\n");
$t->be_recv(0, "mg setexist N50 Ooverwrite\r\n", "O overwritten");
$t->be_recv(0, "mg setexist N50 Ooverwrite\r\n", "O set at end");
$t->be_send(0, "HD\r\n");
$t->c_recv_be();
$t->clear();

$t->c_send("mg setexist N50 Oexists T73 c\r\n");
$t->be_recv(0, "mg setexist N50 Ooverwrite T73 c\r\n", "O overwritten");
$t->be_recv(0, "mg setexist N50 Ooverwrite T73 c\r\n", "O set in middle");
$t->be_send(0, "HD\r\n");
$t->c_recv_be();
$t->clear();

$t->c_send("mg setflag N50 Oexists T73 c\r\n");
$t->be_recv(0, "mg setflag N50 O T73 c\r\n", "O overwritten without token");
$t->be_send(0, "HD\r\n");
$t->c_recv_be();
$t->clear();
};

subtest 'req:flag_replace()' => sub {
$t->c_send("mg repl1 N50 F1234 T73\r\n");
$t->be_recv(0, "mg repl1 N50 Ofoo T73\r\n");
$t->be_send(0, "HD\r\n");
$t->c_recv_be('got repl1 test response');
$t->clear();

$t->c_send("mg repl2 N50 F5678 T73\r\n");
$t->be_recv(0, "mg repl2 N50 O T73\r\n");
$t->be_send(0, "HD\r\n");
$t->c_recv_be('got repl2 test response');
$t->clear();

$t->c_send("mg repl1 F\r\n");
$t->be_recv(0, "mg repl1 Ofoo\r\n");
$t->be_send(0, "HD\r\n");
$t->c_recv_be('got repl1 F response');
$t->clear();
};

subtest 'req:flag_del()' => sub {
$t->c_send("mg del1 N50 Oremove T80\r\n");
$t->be_recv(0, "mg del1 N50 T80\r\n");
$t->be_send(0, "HD\r\n");
$t->c_recv_be('got del1 middle removal');
$t->clear();

$t->c_send("mg del1 N51 T81 Oremove\r\n");
$t->be_recv(0, "mg del1 N51 T81\r\n");
$t->be_send(0, "HD\r\n");
$t->c_recv_be('got del1 end removal');
$t->clear();

$t->c_send("mg del1 Oremove N52 T82\r\n");
$t->be_recv(0, "mg del1 N52 T82\r\n");
$t->be_send(0, "HD\r\n");
$t->c_recv_be('got del1 front removal');
$t->clear();

$t->c_send("mg del1 O N52 T82\r\n");
$t->be_recv(0, "mg del1 N52 T82\r\n");
$t->be_send(0, "HD\r\n");
$t->c_recv_be('got del1 tokenless removal');
$t->clear();

};

done_testing();

0 comments on commit d54420f

Please sign in to comment.