Improve const-correctness of ITraceLogFormatter

This commit is contained in:
sfc-gh-tclinkenbeard 2021-10-19 17:22:02 -07:00 committed by Trevor Clinkenbeard
parent c615279807
commit 63b241c60b
5 changed files with 55 additions and 55 deletions

View File

@ -40,10 +40,10 @@ struct ITraceLogWriter {
class TraceEventFields; class TraceEventFields;
struct ITraceLogFormatter { struct ITraceLogFormatter {
virtual const char* getExtension() = 0; virtual const char* getExtension() const = 0;
virtual const char* getHeader() = 0; // Called when starting a new file virtual const char* getHeader() const = 0; // Called when starting a new file
virtual const char* getFooter() = 0; // Called when ending a file virtual const char* getFooter() const = 0; // Called when ending a file
virtual std::string formatEvent(const TraceEventFields&) = 0; // Called for each event virtual std::string formatEvent(const TraceEventFields&) const = 0; // Called for each event
virtual void addref() = 0; virtual void addref() = 0;
virtual void delref() = 0; virtual void delref() = 0;

View File

@ -31,55 +31,55 @@ void JsonTraceLogFormatter::delref() {
ReferenceCounted<JsonTraceLogFormatter>::delref(); ReferenceCounted<JsonTraceLogFormatter>::delref();
} }
const char* JsonTraceLogFormatter::getExtension() { const char* JsonTraceLogFormatter::getExtension() const {
return "json"; return "json";
} }
const char* JsonTraceLogFormatter::getHeader() { const char* JsonTraceLogFormatter::getHeader() const {
return ""; return "";
} }
const char* JsonTraceLogFormatter::getFooter() { const char* JsonTraceLogFormatter::getFooter() const {
return ""; return "";
} }
namespace { namespace {
void escapeString(std::stringstream& ss, const std::string& source) { void escapeString(std::ostringstream& oss, const std::string& source) {
for (auto c : source) { for (auto c : source) {
if (c == '"') { if (c == '"') {
ss << "\\\""; oss << "\\\"";
} else if (c == '\\') { } else if (c == '\\') {
ss << "\\\\"; oss << "\\\\";
} else if (c == '\n') { } else if (c == '\n') {
ss << "\\n"; oss << "\\n";
} else if (c == '\r') { } else if (c == '\r') {
ss << "\\r"; oss << "\\r";
} else if (isprint(c)) { } else if (isprint(c)) {
ss << c; oss << c;
} else { } else {
constexpr char hex[] = "0123456789abcdef"; constexpr char hex[] = "0123456789abcdef";
int x = int{ static_cast<uint8_t>(c) }; int x = int{ static_cast<uint8_t>(c) };
ss << "\\x" << hex[x / 16] << hex[x % 16]; oss << "\\x" << hex[x / 16] << hex[x % 16];
} }
} }
} }
} // namespace } // namespace
std::string JsonTraceLogFormatter::formatEvent(const TraceEventFields& fields) { std::string JsonTraceLogFormatter::formatEvent(const TraceEventFields& fields) const {
std::stringstream ss; std::ostringstream oss;
ss << "{ "; oss << "{ ";
for (auto iter = fields.begin(); iter != fields.end(); ++iter) { for (auto iter = fields.begin(); iter != fields.end(); ++iter) {
if (iter != fields.begin()) { if (iter != fields.begin()) {
ss << ", "; oss << ", ";
} }
ss << "\""; oss << "\"";
escapeString(ss, iter->first); escapeString(oss, iter->first);
ss << "\": \""; oss << "\": \"";
escapeString(ss, iter->second); escapeString(oss, iter->second);
ss << "\""; oss << "\"";
} }
ss << " }\r\n"; oss << " }\r\n";
return ss.str(); return std::move(oss).str();
} }

View File

@ -22,10 +22,10 @@
#include "flow/Trace.h" #include "flow/Trace.h"
struct JsonTraceLogFormatter final : public ITraceLogFormatter, ReferenceCounted<JsonTraceLogFormatter> { struct JsonTraceLogFormatter final : public ITraceLogFormatter, ReferenceCounted<JsonTraceLogFormatter> {
const char* getExtension() override; const char* getExtension() const override;
const char* getHeader() override; // Called when starting a new file const char* getHeader() const override; // Called when starting a new file
const char* getFooter() override; // Called when ending a file const char* getFooter() const override; // Called when ending a file
std::string formatEvent(const TraceEventFields&) override; // Called for each event std::string formatEvent(const TraceEventFields&) const override; // Called for each event
void addref() override; void addref() override;
void delref() override; void delref() override;

View File

@ -30,38 +30,38 @@ void XmlTraceLogFormatter::delref() {
ReferenceCounted<XmlTraceLogFormatter>::delref(); ReferenceCounted<XmlTraceLogFormatter>::delref();
} }
const char* XmlTraceLogFormatter::getExtension() { const char* XmlTraceLogFormatter::getExtension() const {
return "xml"; return "xml";
} }
const char* XmlTraceLogFormatter::getHeader() { const char* XmlTraceLogFormatter::getHeader() const {
return "<?xml version=\"1.0\"?>\r\n<Trace>\r\n"; return "<?xml version=\"1.0\"?>\r\n<Trace>\r\n";
} }
const char* XmlTraceLogFormatter::getFooter() { const char* XmlTraceLogFormatter::getFooter() const {
return "</Trace>\r\n"; return "</Trace>\r\n";
} }
void XmlTraceLogFormatter::escape(std::stringstream& ss, std::string source) { void XmlTraceLogFormatter::escape(std::ostringstream& oss, std::string source) const {
loop { loop {
int index = source.find_first_of(std::string({ '&', '"', '<', '>', '\r', '\n', '\0' })); int index = source.find_first_of(std::string({ '&', '"', '<', '>', '\r', '\n', '\0' }));
if (index == source.npos) { if (index == source.npos) {
break; break;
} }
ss << source.substr(0, index); oss << source.substr(0, index);
if (source[index] == '&') { if (source[index] == '&') {
ss << "&amp;"; oss << "&amp;";
} else if (source[index] == '"') { } else if (source[index] == '"') {
ss << "&quot;"; oss << "&quot;";
} else if (source[index] == '<') { } else if (source[index] == '<') {
ss << "&lt;"; oss << "&lt;";
} else if (source[index] == '>') { } else if (source[index] == '>') {
ss << "&gt;"; oss << "&gt;";
} else if (source[index] == '\n' || source[index] == '\r') { } else if (source[index] == '\n' || source[index] == '\r') {
ss << " "; oss << " ";
} else if (source[index] == '\0') { } else if (source[index] == '\0') {
ss << " "; oss << " ";
TraceEvent(SevWarnAlways, "StrippedIllegalCharacterFromTraceEvent") TraceEvent(SevWarnAlways, "StrippedIllegalCharacterFromTraceEvent")
.detail("Source", StringRef(source).printable()) .detail("Source", StringRef(source).printable())
.detail("Character", StringRef(source.substr(index, 1)).printable()); .detail("Character", StringRef(source.substr(index, 1)).printable());
@ -72,20 +72,20 @@ void XmlTraceLogFormatter::escape(std::stringstream& ss, std::string source) {
source = source.substr(index + 1); source = source.substr(index + 1);
} }
ss << source; oss << std::move(source);
} }
std::string XmlTraceLogFormatter::formatEvent(const TraceEventFields& fields) { std::string XmlTraceLogFormatter::formatEvent(const TraceEventFields& fields) const {
std::stringstream ss; std::ostringstream oss;
ss << "<Event "; oss << "<Event ";
for (auto itr : fields) { for (auto itr : fields) {
escape(ss, itr.first); escape(oss, itr.first);
ss << "=\""; oss << "=\"";
escape(ss, itr.second); escape(oss, itr.second);
ss << "\" "; oss << "\" ";
} }
ss << "/>\r\n"; oss << "/>\r\n";
return ss.str(); return std::move(oss).str();
} }

View File

@ -31,12 +31,12 @@ struct XmlTraceLogFormatter final : public ITraceLogFormatter, ReferenceCounted<
void addref() override; void addref() override;
void delref() override; void delref() override;
const char* getExtension() override; const char* getExtension() const override;
const char* getHeader() override; const char* getHeader() const override;
const char* getFooter() override; const char* getFooter() const override;
void escape(std::stringstream& ss, std::string source); void escape(std::ostringstream& oss, std::string source) const;
std::string formatEvent(const TraceEventFields& fields) override; std::string formatEvent(const TraceEventFields& fields) const override;
}; };
#endif #endif