diff options
author | Arne Juul <arnej@vespa.ai> | 2023-11-06 09:49:15 +0000 |
---|---|---|
committer | Arne Juul <arnej@vespa.ai> | 2023-11-06 11:43:58 +0000 |
commit | 601f631c07eeb3aa4f10e264955156d12549a5cf (patch) | |
tree | 4aaa5b4b46bd9ef0d7526aab753cd00c4dcf9be7 | |
parent | 036ec7b3f7a4ff3ff8b4ef7cbeabdfbfc1f72e27 (diff) |
escape binary characters
-rw-r--r-- | searchlib/src/vespa/searchlib/engine/proto_converter.cpp | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/searchlib/src/vespa/searchlib/engine/proto_converter.cpp b/searchlib/src/vespa/searchlib/engine/proto_converter.cpp index 59e4b6e99f8..1fd8ff1e628 100644 --- a/searchlib/src/vespa/searchlib/engine/proto_converter.cpp +++ b/searchlib/src/vespa/searchlib/engine/proto_converter.cpp @@ -15,6 +15,26 @@ namespace search::engine { namespace { +std::string escape_message(const vespalib::string &item) { + static const char hexdigits[] = "0123456789ABCDEF"; + std::string r; + r.reserve(item.size()); + for (char c : item) { + if (c == '\\') { + r.push_back(c); + r.push_back(c); + } else if (c < 32 || c > 127) { + r.push_back('\\'); + r.push_back('x'); + r.push_back(hexdigits[0xF & (c >> 4)]); + r.push_back(hexdigits[0xF & c]); + } else { + r.push_back(c); + } + } + return r; +} + template <typename T> vespalib::string make_sort_spec(const T &sorting) { vespalib::string spec; @@ -166,7 +186,7 @@ ProtoConverter::search_reply_to_proto(const SearchReply &reply, ProtoSearchReply reply.my_issues->for_each_message([&](const vespalib::string &err_msg) { auto *err_obj = proto.add_errors(); - err_obj->set_message(err_msg); + err_obj->set_message(escape_message(err_msg)); }); } } @@ -223,7 +243,7 @@ ProtoConverter::docsum_reply_to_proto(const DocsumReply &reply, ProtoDocsumReply reply.issues().for_each_message([&](const vespalib::string &err_msg) { auto *err_obj = proto.add_errors(); - err_obj->set_message(err_msg); + err_obj->set_message(escape_message(err_msg)); }); } } |