Software /
code /
prosody
Changeset
12220:25b853e64d83
util.format: Skip control code escaping when doing full serialization
Fixes that a multi-line string ended up "like\
\9this" instead of "like\nthis" as can be demonstrated by somehow
initiating a connection to a HTTP server.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Thu, 27 Jan 2022 21:14:22 +0100 |
parents | 12219:0a44def211fa |
children | 12221:056b7920b686 |
files | spec/util_format_spec.lua util/format.lua |
diffstat | 2 files changed, 8 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/spec/util_format_spec.lua Thu Jan 27 16:23:26 2022 +0100 +++ b/spec/util_format_spec.lua Thu Jan 27 21:14:22 2022 +0100 @@ -37,6 +37,11 @@ end) end + it("escapes multi-line strings", function () + assert.equal("Hello\n\tWorld", format("%s", "Hello\nWorld")) + assert.equal("\"Hello\\nWorld\"", format("%q", "Hello\nWorld")) + end) + -- Tests generated with loops! describe("nil", function () describe("to %c", function () @@ -561,8 +566,8 @@ describe("to %q", function () it("works", function () assert.equal("\"hello\"", format("%q", "hello")) - assert.equal("\"foo \226\144\129\226\144\130\226\144\131 bar\"", format("%q", "foo \001\002\003 bar")) - assert.equal("\"nödåtgärd\"", format("%q", "n\195\182d\195\165tg\195\164rd")) + assert.equal("\"foo \\001\\002\\003 bar\"", format("%q", "foo \001\002\003 bar")) + assert.equal("\"n\\195\\182d\\195\\165tg\\195\\164rd\"", format("%q", "n\195\182d\195\165tg\195\164rd")) assert.equal("\"n\\195\\182d\\195\\165tg\\195\"", format("%q", "n\195\182d\195\165tg\195")) end); end);
--- a/util/format.lua Thu Jan 27 16:23:26 2022 +0100 +++ b/util/format.lua Thu Jan 27 21:14:22 2022 +0100 @@ -108,7 +108,7 @@ if t == "string" and option ~= "p" then if not valid_utf8(arg) then option = "q"; - else + elseif option ~= "q" then -- gets fully escaped in the next block args[i] = arg:gsub("[%z\1-\8\11-\31\127]", control_symbols):gsub("\n\t?", "\n\t"); return spec; end