#include <stdlib.h>
#include <string>
#include <string.h> // for strdup
+#include <boost/container/small_vector.hpp>
+#include <utility> // for std::cmp_greater_equal
#include "common/escape.h"
void HTMLFormatter::dump_format_va(std::string_view name, const char *ns, bool quoted, const char *fmt, va_list ap)
{
- char buf[LARGE_SIZE];
- size_t len = vsnprintf(buf, LARGE_SIZE, fmt, ap);
+ auto buf = boost::container::small_vector<char, LARGE_SIZE>{
+ LARGE_SIZE, boost::container::default_init};
+
+ va_list ap_copy;
+ va_copy(ap_copy, ap);
+ size_t len = vsnprintf(buf.data(), buf.size(), fmt, ap);
+ va_end(ap_copy);
+
+ if(std::cmp_greater_equal(len, buf.size())){
+ buf.resize(len + 1, boost::container::default_init);
+ vsnprintf(buf.data(), buf.size(), fmt, ap_copy);
+ }
std::string e(name);
print_spaces();
if (ns) {
m_ss << "<li xmlns=\"" << ns << "\">" << e << ": "
- << xml_stream_escaper(std::string_view(buf, len)) << "</li>";
+ << xml_stream_escaper(std::string_view(buf.data(), len)) << "</li>";
} else {
m_ss << "<li>" << e << ": "
- << xml_stream_escaper(std::string_view(buf, len)) << "</li>";
+ << xml_stream_escaper(std::string_view(buf.data(), len)) << "</li>";
}
if (m_pretty)
add_ceph_unittest(unittest_xmlformatter)
target_link_libraries(unittest_xmlformatter ceph-common)
+add_executable(unittest_htmlformatter
+ test_htmlformatter.cc
+ )
+add_ceph_unittest(unittest_htmlformatter)
+target_link_libraries(unittest_htmlformatter ceph-common)
+
# unittest_bit_vector
add_executable(unittest_bit_vector
test_bit_vector.cc
--- /dev/null
+#include "gtest/gtest.h"
+
+#include "common/HTMLFormatter.h"
+#include <sstream>
+#include <string>
+
+using namespace ceph;
+
+TEST(htmlformatter, dump_format_large_item)
+{
+ std::stringstream sout;
+ HTMLFormatter formatter(false);
+
+ std::string base_url("http://example.com");
+ std::string bucket_name("bucket");
+ std::string object_key(1024, 'a');
+
+ formatter.dump_format("Location", "%s/%s/%s", base_url.c_str(), bucket_name.c_str(), object_key.c_str());
+
+ formatter.flush(sout);
+
+ std::string uri = base_url + "/" + bucket_name + "/" + object_key;
+ std::string expected_output = "<li>Location: " + uri + "</li>";
+
+ EXPECT_EQ(expected_output, sout.str());
+}
\ No newline at end of file