]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
rgw: rework json/xml escape usage follow #19806
authorfang yuxiang <fang.yuxiang@eisoo.com>
Tue, 9 Jan 2018 02:47:54 +0000 (10:47 +0800)
committerfang yuxiang <fang.yuxiang@eisoo.com>
Thu, 22 Feb 2018 06:55:28 +0000 (14:55 +0800)
Signed-off-by: fang yuxiang fang.yuxiang@eisoo.com
src/cls/rgw/cls_rgw.cc
src/common/Formatter.cc
src/common/Formatter.h
src/common/HTMLFormatter.cc
src/rgw/rgw_formats.cc
src/rgw/rgw_rest_s3.cc

index 9f004c519736719c0b1e4fc5343bff45c8be927f..919fec1fbe8c45b0886ad2ef3cc6d64e47300a81 100644 (file)
@@ -994,10 +994,10 @@ static void update_olh_log(struct rgw_bucket_olh_entry& olh_data_entry, OLHLogOp
 
 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)
index 3375cb792c390eda4edff3c6ae155de84b140fb9..d0cc2d2aeda8c2972ae7249160cde0e84d6920cb 100644 (file)
@@ -163,10 +163,7 @@ void JSONFormatter::print_comma(json_formatter_stack_entry_d& entry)
 
 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)
@@ -450,7 +447,7 @@ void XMLFormatter::dump_string(const char *name, std::string_view s)
       [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";
 }
@@ -464,7 +461,7 @@ void XMLFormatter::dump_string_with_attrs(const char *name, std::string_view s,
   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";
 }
@@ -489,7 +486,7 @@ void XMLFormatter::dump_format_va(const char* name, const char *ns, bool quoted,
   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)
@@ -545,7 +542,7 @@ void XMLFormatter::open_section_in_ns(const char *name, const char *ns, const Fo
 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());
@@ -564,14 +561,6 @@ void XMLFormatter::print_spaces()
   }
 }
 
-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 == ' ') {
index 6cfe60dac04a156c8fab3850cc5ddfc989b76903..8cfcc0b0a773139933151b59385e11d5617b34a3 100644 (file)
@@ -169,7 +169,6 @@ namespace ceph {
     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;
 
index c096ec5ceea6403c5b2d2f56dfdc9640a1554fe9..5889566d74c40775f15450fd5487f548a9ffe5cf 100644 (file)
@@ -24,6 +24,8 @@
 #include <string>
 #include <string.h>     // for strdup
 
+#include "common/escape.h"
+
 // -----------------------
 namespace ceph {
 
@@ -109,7 +111,7 @@ void HTMLFormatter::dump_float(const char *name, double d)
 
 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)
@@ -118,7 +120,7 @@ void HTMLFormatter::dump_string_with_attrs(const char *name, std::string_view s,
   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";
 }
@@ -139,9 +141,9 @@ void HTMLFormatter::dump_format_va(const char* name, const char *ns, bool quoted
   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)
index 0803a614ff85eccd68f66b0253f0e062b20c6a02..4c207078844dc0982fb1945fbdd00ea98a43a793 100644 (file)
@@ -287,7 +287,10 @@ void RGWFormatter_Plain::dump_value_int(const char *name, const char *fmt, ...)
 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;
   }
 };
 
@@ -298,7 +301,7 @@ void RGWSwiftWebsiteListingFormatter::generate_header(
   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()) {
@@ -315,7 +318,7 @@ void RGWSwiftWebsiteListingFormatter::generate_header(
 
   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>)"
index fce58c61a66566ed0f7037b529b9421e5ed93618..5c62d9423ef9fc5c5664e7c5a574df4f8447b82a 100644 (file)
@@ -2158,7 +2158,7 @@ void RGWCopyObj_ObjStore_S3::send_response()
 
   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));
     }