|
23 | 23 | namespace modsecurity { |
24 | 24 |
|
25 | 25 |
|
26 | | -std::string RuleMessage::_details(const RuleMessage *rm) { |
27 | | - std::string msg; |
28 | | - |
29 | | - msg.append(" [file \"" + std::string(*rm->m_ruleFile.get()) + "\"]"); |
30 | | - msg.append(" [line \"" + std::to_string(rm->m_ruleLine) + "\"]"); |
31 | | - msg.append(" [id \"" + std::to_string(rm->m_ruleId) + "\"]"); |
32 | | - msg.append(" [rev \"" + rm->m_rev + "\"]"); |
33 | | - msg.append(" [msg \"" + rm->m_message + "\"]"); |
34 | | - msg.append(" [data \"" + utils::string::limitTo(200, rm->m_data) + "\"]"); |
35 | | - msg.append(" [severity \"" + |
36 | | - std::to_string(rm->m_severity) + "\"]"); |
37 | | - msg.append(" [ver \"" + rm->m_ver + "\"]"); |
38 | | - msg.append(" [maturity \"" + std::to_string(rm->m_maturity) + "\"]"); |
39 | | - msg.append(" [accuracy \"" + std::to_string(rm->m_accuracy) + "\"]"); |
| 26 | +inline void RuleMessage::_details(const RuleMessage *rm, std::string *msg) { |
| 27 | + *msg += " [file \"" + std::string(*rm->m_ruleFile.get()) + "\"]" \ |
| 28 | + " [line \"" + std::to_string(rm->m_ruleLine) + "\"]" \ |
| 29 | + " [id \"" + std::to_string(rm->m_ruleId) + "\"]" \ |
| 30 | + " [rev \"" + rm->m_rev + "\"]" \ |
| 31 | + " [msg \"" + rm->m_message + "\"]" \ |
| 32 | + " [data \"" + utils::string::limitTo(200, rm->m_data) + "\"]" \ |
| 33 | + " [severity \"" + std::to_string(rm->m_severity) + "\"]" \ |
| 34 | + " [ver \"" + rm->m_ver + "\"]" \ |
| 35 | + " [maturity \"" + std::to_string(rm->m_maturity) + "\"]" \ |
| 36 | + " [accuracy \"" + std::to_string(rm->m_accuracy) + "\"]"; |
| 37 | + |
40 | 38 | for (auto &a : rm->m_tags) { |
41 | | - msg.append(" [tag \"" + a + "\"]"); |
| 39 | + *msg += " [tag \"" + a + "\"]"; |
42 | 40 | } |
43 | | - msg.append(" [hostname \"" + *rm->m_serverIpAddress.get() \ |
44 | | - + "\"]"); |
45 | | - msg.append(" [uri \"" + utils::string::limitTo(200, *rm->m_uriNoQueryStringDecoded.get()) + "\"]"); |
46 | | - msg.append(" [unique_id \"" + rm->m_id + "\"]"); |
47 | | - msg.append(" [ref \"" + utils::string::limitTo(200, rm->m_reference) + "\"]"); |
48 | 41 |
|
49 | | - return msg; |
| 42 | + *msg += " [hostname \"" + *rm->m_serverIpAddress.get() + "\"]" \ |
| 43 | + " [uri \"" + *rm->m_uriNoQueryStringDecoded.get() + "\"]" \ |
| 44 | + " [unique_id \"" + *rm->m_id.get() + "\"]" \ |
| 45 | + " [ref \"" + utils::string::limitTo(200, rm->m_reference) + "\"]"; |
50 | 46 | } |
51 | 47 |
|
52 | 48 |
|
53 | | -std::string RuleMessage::_errorLogTail(const RuleMessage *rm) { |
54 | | - std::string msg; |
55 | | - |
56 | | - msg.append("[hostname \"" + *rm->m_serverIpAddress.get() + "\"]"); |
57 | | - msg.append(" [uri \"" + utils::string::limitTo(200, *rm->m_uriNoQueryStringDecoded.get()) + "\"]"); |
58 | | - msg.append(" [unique_id \"" + rm->m_id + "\"]"); |
59 | | - |
60 | | - return msg; |
| 49 | +inline void RuleMessage::_errorLogTail(const RuleMessage *rm, |
| 50 | + std::string *msg) { |
| 51 | + *msg += " [hostname \"" + *rm->m_serverIpAddress.get() + "\"]" \ |
| 52 | + " [uri \"" + utils::string::limitTo(200, |
| 53 | + *rm->m_uriNoQueryStringDecoded.get()) + "\"]" \ |
| 54 | + " [unique_id \"" + *rm->m_id.get() + "\"]"; |
61 | 55 | } |
62 | 56 |
|
63 | 57 |
|
64 | 58 | std::string RuleMessage::log(const RuleMessage *rm, int props, int code) { |
65 | 59 | std::string msg(""); |
| 60 | + msg.reserve(2048); |
66 | 61 |
|
67 | 62 | if (props & ClientLogMessageInfo) { |
68 | | - msg.append("[client " + std::string(*rm->m_clientIpAddress.get()) + "] "); |
| 63 | + msg += "[client " + std::string(*rm->m_clientIpAddress.get()) + "] "; |
69 | 64 | } |
70 | 65 |
|
71 | 66 | if (rm->m_isDisruptive) { |
72 | | - msg.append("ModSecurity: Access denied with code "); |
| 67 | + msg += "ModSecurity: Access denied with code "; |
73 | 68 | if (code == -1) { |
74 | | - msg.append("%d"); |
| 69 | + msg += "%d"; |
75 | 70 | } else { |
76 | | - msg.append(std::to_string(code)); |
| 71 | + msg += std::to_string(code); |
77 | 72 | } |
78 | | - msg.append(" (phase "); |
79 | | - msg.append(std::to_string(rm->m_rule->m_phase - 1) + "). "); |
| 73 | + msg += " (phase " + std::to_string(rm->m_rule->m_phase - 1) + "). "; |
80 | 74 | } else { |
81 | | - msg.append("ModSecurity: Warning. "); |
| 75 | + msg += "ModSecurity: Warning. "; |
82 | 76 | } |
83 | 77 |
|
84 | | - msg.append(rm->m_match); |
85 | | - msg.append(_details(rm)); |
| 78 | + msg += (rm->m_match); |
| 79 | + _details(rm, &msg); |
86 | 80 |
|
87 | 81 | if (props & ErrorLogTailLogMessageInfo) { |
88 | | - msg.append(" " + _errorLogTail(rm)); |
| 82 | + _errorLogTail(rm, &msg); |
89 | 83 | } |
90 | 84 |
|
91 | 85 | return modsecurity::utils::string::toHexIfNeeded(msg); |
|
0 commit comments