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;
struct ITraceLogFormatter {
virtual const char* getExtension() = 0;
virtual const char* getHeader() = 0; // Called when starting a new file
virtual const char* getFooter() = 0; // Called when ending a file
virtual std::string formatEvent(const TraceEventFields&) = 0; // Called for each event
virtual const char* getExtension() const = 0;
virtual const char* getHeader() const = 0; // Called when starting a new file
virtual const char* getFooter() const = 0; // Called when ending a file
virtual std::string formatEvent(const TraceEventFields&) const = 0; // Called for each event
virtual void addref() = 0;
virtual void delref() = 0;

View File

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

View File

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

View File

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

View File

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