This is an automated email from the ASF dual-hosted git repository. swebb2066 pushed a commit to branch html_layout_fix in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git
commit d617f0c00dc9d39b9afe2f7a6c8336fe1ec42a1d Author: Stephen Webb <[email protected]> AuthorDate: Fri Jul 11 12:31:14 2025 +1000 Emit '"' instead of '"' in XML and html attributes --- src/main/cpp/htmllayout.cpp | 2 +- src/main/cpp/transform.cpp | 24 ++++++++++++++++++++++++ src/main/cpp/xmllayout.cpp | 20 ++++++++++---------- src/main/include/log4cxx/helpers/transform.h | 7 +++++++ 4 files changed, 42 insertions(+), 11 deletions(-) diff --git a/src/main/cpp/htmllayout.cpp b/src/main/cpp/htmllayout.cpp index c2411ece..f0aceea0 100644 --- a/src/main/cpp/htmllayout.cpp +++ b/src/main/cpp/htmllayout.cpp @@ -127,7 +127,7 @@ void HTMLLayout::format(LogString& output, output.append(LOG4CXX_EOL); output.append(LOG4CXX_STR("<td title=\"")); - output.append(event->getLoggerName()); + Transform::appendEscapingQuote(output, event->getLoggerName()); output.append(LOG4CXX_STR(" logger\">")); Transform::appendEscapingTags(output, event->getLoggerName()); output.append(LOG4CXX_STR("</td>")); diff --git a/src/main/cpp/transform.cpp b/src/main/cpp/transform.cpp index 6cc7ca77..b467a6ed 100644 --- a/src/main/cpp/transform.cpp +++ b/src/main/cpp/transform.cpp @@ -130,3 +130,27 @@ void Transform::appendEscapingCDATA( buf.append(input, start, input.length() - start); } +void Transform::appendEscapingQuote( + LogString& buf, const LogString& input) +{ + if (input.empty()) + return; + logchar quote { 0x22 /* " */ }; + size_t start = 0; + size_t index = input.find(quote, start); + + while (index != input.npos) + { + if (start < index) + buf.append(input, start, index - start); + buf.append(LOG4CXX_STR(""")); + start = index + 1; + if (start < input.size()) + index = input.find(quote, start); + else + index = input.npos; + } + + if (start < input.size()) + buf.append(input, start, input.size() - start); +} diff --git a/src/main/cpp/xmllayout.cpp b/src/main/cpp/xmllayout.cpp index 0b7fe073..35904a9d 100644 --- a/src/main/cpp/xmllayout.cpp +++ b/src/main/cpp/xmllayout.cpp @@ -80,13 +80,13 @@ void XMLLayout::format(LogString& output, { output.reserve(m_priv->expectedPatternLength + event->getMessage().size()); output.append(LOG4CXX_STR("<log4j:event logger=\"")); - Transform::appendEscapingTags(output, event->getLoggerName()); + Transform::appendEscapingQuote(output, event->getLoggerName()); output.append(LOG4CXX_STR("\" timestamp=\"")); StringHelper::toString(event->getTimeStamp() / 1000L, p, output); output.append(LOG4CXX_STR("\" level=\"")); - Transform::appendEscapingTags(output, event->getLevel()->toString()); + Transform::appendEscapingQuote(output, event->getLevel()->toString()); output.append(LOG4CXX_STR("\" thread=\"")); - Transform::appendEscapingTags(output, event->getThreadName()); + Transform::appendEscapingQuote(output, event->getThreadName()); output.append(LOG4CXX_STR("\">")); output.append(LOG4CXX_EOL); @@ -112,13 +112,13 @@ void XMLLayout::format(LogString& output, output.append(LOG4CXX_STR("<log4j:locationInfo class=\"")); const LocationInfo& locInfo = event->getLocationInformation(); LOG4CXX_DECODE_CHAR(className, locInfo.getClassName()); - Transform::appendEscapingTags(output, className); + Transform::appendEscapingQuote(output, className); output.append(LOG4CXX_STR("\" method=\"")); LOG4CXX_DECODE_CHAR(method, locInfo.getMethodName()); - Transform::appendEscapingTags(output, method); + Transform::appendEscapingQuote(output, method); output.append(LOG4CXX_STR("\" file=\"")); LOG4CXX_DECODE_CHAR(fileName, locInfo.getFileName()); - Transform::appendEscapingTags(output, fileName); + Transform::appendEscapingQuote(output, fileName); output.append(LOG4CXX_STR("\" line=\"")); StringHelper::toString(locInfo.getLineNumber(), p, output); output.append(LOG4CXX_STR("\"/>")); @@ -142,9 +142,9 @@ void XMLLayout::format(LogString& output, if (event->getMDC(key, value)) { output.append(LOG4CXX_STR("<log4j:data name=\"")); - Transform::appendEscapingTags(output, key); + Transform::appendEscapingQuote(output, key); output.append(LOG4CXX_STR("\" value=\"")); - Transform::appendEscapingTags(output, value); + Transform::appendEscapingQuote(output, value); output.append(LOG4CXX_STR("\"/>")); output.append(LOG4CXX_EOL); } @@ -157,9 +157,9 @@ void XMLLayout::format(LogString& output, if (event->getProperty(key, value)) { output.append(LOG4CXX_STR("<log4j:data name=\"")); - Transform::appendEscapingTags(output, key); + Transform::appendEscapingQuote(output, key); output.append(LOG4CXX_STR("\" value=\"")); - Transform::appendEscapingTags(output, value); + Transform::appendEscapingQuote(output, value); output.append(LOG4CXX_STR("\"/>")); output.append(LOG4CXX_EOL); } diff --git a/src/main/include/log4cxx/helpers/transform.h b/src/main/include/log4cxx/helpers/transform.h index 4ae67aac..09ae0119 100644 --- a/src/main/include/log4cxx/helpers/transform.h +++ b/src/main/include/log4cxx/helpers/transform.h @@ -54,6 +54,13 @@ class LOG4CXX_EXPORT Transform */ static void appendEscapingCDATA( LogString& buf, const LogString& input); + + /** + * Add \c input to \c buf with double quote characters replaced with <b>&quot;</b>. + * + * @param buf output stream holding the XML data to this point. + */ + static void appendEscapingQuote(LogString& buf, const LogString& input); }; // class Transform } // namespace helpers } //namespace log4cxx
