|
@@ -9,22 +9,19 @@
|
|
|
#include "symbols.hh"
|
|
|
using namespace li;
|
|
|
|
|
|
-
|
|
|
-std::string escape_html_entities(const std::string& data)
|
|
|
+template <typename B>
|
|
|
+void escape_html_entities(B& buffer, const std::string& data)
|
|
|
{
|
|
|
- std::string buffer;
|
|
|
- buffer.reserve(data.size());
|
|
|
for(size_t pos = 0; pos != data.size(); ++pos) {
|
|
|
switch(data[pos]) {
|
|
|
- case '&': buffer.append("&"); break;
|
|
|
- case '\"': buffer.append("""); break;
|
|
|
- case '\'': buffer.append("'"); break;
|
|
|
- case '<': buffer.append("<"); break;
|
|
|
- case '>': buffer.append(">"); break;
|
|
|
- default: buffer.append(&data[pos], 1); break;
|
|
|
+ case '&': buffer << "&"; break;
|
|
|
+ case '\"': buffer << """; break;
|
|
|
+ case '\'': buffer << "'"; break;
|
|
|
+ case '<': buffer << "<"; break;
|
|
|
+ case '>': buffer << ">"; break;
|
|
|
+ default: buffer << data[pos]; break;
|
|
|
}
|
|
|
}
|
|
|
- return std::move(buffer);
|
|
|
}
|
|
|
|
|
|
int main(int argc, char* argv[]) {
|
|
@@ -118,15 +115,20 @@ int main(int argc, char* argv[]) {
|
|
|
std::sort(table.begin(), table.end(),
|
|
|
[] (const fortune& a, const fortune& b) { return a.message < b.message; });
|
|
|
|
|
|
- std::stringstream ss;
|
|
|
-
|
|
|
+ char b[100000];
|
|
|
+ li::output_buffer ss(b, sizeof(b));
|
|
|
+
|
|
|
ss << "<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>";
|
|
|
for(auto& f : table)
|
|
|
- ss << "<tr><td>" << f.id << "</td><td>" << escape_html_entities(f.message) << "</td></tr>";
|
|
|
+ {
|
|
|
+ ss << "<tr><td>" << f.id << "</td><td>";
|
|
|
+ escape_html_entities(ss, f.message);
|
|
|
+ ss << "</td></tr>";
|
|
|
+ }
|
|
|
ss << "</table></body></html>";
|
|
|
|
|
|
response.set_header("Content-Type", "text/html; charset=utf-8");
|
|
|
- response.write(ss.str());
|
|
|
+ response.write(ss.to_string_view());
|
|
|
};
|
|
|
|
|
|
http_serve(my_api, port, s::nthreads = nprocs);
|