static string escape_str(const string& s)
{
- int len = escape_json_attr_len(s.c_str(), s.size());
- char escaped[len];
- escape_json_attr(s.c_str(), s.size(), escaped);
- return string(escaped);
+ int len = escape_json_attr_len(s.c_str(), s.size());
+ std::string escaped(len, 0);
+ escape_json_attr(s.c_str(), s.size(), escaped.data());
+ return escaped;
}
static int write_obj_instance_entry(cls_method_context_t hctx, struct rgw_bucket_dir_entry& instance_entry, const string& instance_idx)
void JSONFormatter::print_quoted_string(std::string_view s)
{
- int len = escape_json_attr_len(s.data(), s.size());
- char escaped[len];
- escape_json_attr(s.data(), s.size(), escaped);
- m_ss << '\"' << escaped << '\"';
+ m_ss << '\"' << json_stream_escaper(s.data()) << '\"';
}
void JSONFormatter::print_name(const char *name)
[this](char c) { return this->to_lower_underscore(c); });
print_spaces();
- m_ss << "<" << e << ">" << escape_xml_str(s.data()) << "</" << e << ">";
+ m_ss << "<" << e << ">" << xml_stream_escaper(s.data()) << "</" << e << ">";
if (m_pretty)
m_ss << "\n";
}
std::string attrs_str;
get_attrs_str(&attrs, attrs_str);
print_spaces();
- m_ss << "<" << e << attrs_str << ">" << escape_xml_str(s.data()) << "</" << e << ">";
+ m_ss << "<" << e << attrs_str << ">" << xml_stream_escaper(s.data()) << "</" << e << ">";
if (m_pretty)
m_ss << "\n";
}
if (ns) {
m_ss << "<" << e << " xmlns=\"" << ns << "\">" << buf << "</" << e << ">";
} else {
- m_ss << "<" << e << ">" << escape_xml_str(buf) << "</" << e << ">";
+ m_ss << "<" << e << ">" << xml_stream_escaper(buf) << "</" << e << ">";
}
if (m_pretty)
void XMLFormatter::finish_pending_string()
{
if (!m_pending_string_name.empty()) {
- m_ss << escape_xml_str(m_pending_string.str().c_str())
+ m_ss << xml_stream_escaper(m_pending_string.str())
<< "</" << m_pending_string_name << ">";
m_pending_string_name.clear();
m_pending_string.str(std::string());
}
}
-std::string XMLFormatter::escape_xml_str(std::string_view str)
-{
- size_t len = escape_xml_attr_len(str.data());
- std::vector<char> escaped(len, '\0');
- escape_xml_attr(str.data(), &escaped[0]);
- return std::string(&escaped[0]);
-}
-
char XMLFormatter::to_lower_underscore(char c) const
{
if (m_underscored && c == ' ') {
void open_section_in_ns(const char *name, const char *ns, const FormatterAttrs *attrs);
void finish_pending_string();
void print_spaces();
- static std::string escape_xml_str(std::string_view str);
void get_attrs_str(const FormatterAttrs *attrs, std::string& attrs_str);
char to_lower_underscore(char c) const;
#include <string>
#include <string.h> // for strdup
+#include "common/escape.h"
+
// -----------------------
namespace ceph {
void HTMLFormatter::dump_string(const char *name, std::string_view s)
{
- dump_template(name, escape_xml_str(s.data()));
+ dump_template(name, xml_stream_escaper(s.data()));
}
void HTMLFormatter::dump_string_with_attrs(const char *name, std::string_view s, const FormatterAttrs& attrs)
std::string attrs_str;
get_attrs_str(&attrs, attrs_str);
print_spaces();
- m_ss << "<li>" << e << ": " << escape_xml_str(s.data()) << attrs_str << "</li>";
+ m_ss << "<li>" << e << ": " << xml_stream_escaper(s.data()) << attrs_str << "</li>";
if (m_pretty)
m_ss << "\n";
}
std::string e(name);
print_spaces();
if (ns) {
- m_ss << "<li xmlns=\"" << ns << "\">" << e << ": " << escape_xml_str(buf) << "</li>";
+ m_ss << "<li xmlns=\"" << ns << "\">" << e << ": " << xml_stream_escaper(buf) << "</li>";
} else {
- m_ss << "<li>" << e << ": " << escape_xml_str(buf) << "</li>";
+ m_ss << "<li>" << e << ": " << xml_stream_escaper(buf) << "</li>";
}
if (m_pretty)
class HTMLHelper : public XMLFormatter {
public:
static std::string escape(const std::string& unescaped_str) {
- return escape_xml_str(unescaped_str.c_str());
+ int len = escape_xml_attr_len(unescaped_str.c_str());
+ std::string escaped(len, 0);
+ escape_xml_attr(unescaped_str.c_str(), escaped.data());
+ return escaped;
}
};
ss << R"(<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 )"
<< R"(Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">)";
- ss << "<html><head><title>Listing of " << HTMLHelper::escape(dir_path)
+ ss << "<html><head><title>Listing of " << xml_stream_escaper(dir_path)
<< "</title>";
if (! css_path.empty()) {
ss << "</head><body>";
- ss << R"(<h1 id="title">Listing of )" << HTMLHelper::escape(dir_path) << "</h1>"
+ ss << R"(<h1 id="title">Listing of )" << xml_stream_escaper(dir_path) << "</h1>"
<< R"(<table id="listing">)"
<< R"(<tr id="heading">)"
<< R"(<th class="colname">Name</th>)"
if (op_ret == 0) {
dump_time(s, "LastModified", &mtime);
- std::string etag_str = etag.to_str();
+ std::string etag_str = etag.c_str();
if (! etag_str.empty()) {
s->formatter->dump_string("ETag", std::move(etag_str));
}