2727#include < cctype>
2828#include < exception>
2929#include < set>
30- #include < sstream>
3130
3231#include < yaml-cpp/yaml.h>
3332
@@ -100,43 +99,36 @@ parse_legacy_line(swoc::TextView line)
10099 return result;
101100}
102101
103- // / Escape a string for YAML output if needed .
104- std::string
105- yaml_escape (std::string const &value )
102+ // / Emit a single SSLMultiCertEntry to a YAML::Emitter .
103+ void
104+ emit_entry (YAML::Emitter &emitter, config::SSLMultiCertEntry const &entry )
106105{
107- if (value.empty ()) {
108- return " \"\" " ;
109- }
106+ emitter << YAML::BeginMap;
110107
111- bool needs_quotes = false ;
112- if (value[0 ] == ' *' || value[0 ] == ' !' || value[0 ] == ' &' || value[0 ] == ' {' || value[0 ] == ' }' || value[0 ] == ' [' ||
113- value[0 ] == ' ]' || value[0 ] == ' ,' || value[0 ] == ' #' || value[0 ] == ' ?' || value[0 ] == ' -' || value[0 ] == ' :' ||
114- value[0 ] == ' >' || value[0 ] == ' |' || value[0 ] == ' @' || value[0 ] == ' `' || value[0 ] == ' "' || value[0 ] == ' \' ' ) {
115- needs_quotes = true ;
116- } else if (value.find (' :' ) != std::string::npos || value.find (' #' ) != std::string::npos) {
117- needs_quotes = true ;
118- } else if (value == " true" || value == " false" || value == " yes" || value == " no" || value == " null" || value == " True" ||
119- value == " False" || value == " Yes" || value == " No" || value == " Null" ) {
120- needs_quotes = true ;
121- }
108+ auto write_field = [&](char const *key, std::string const &value) {
109+ if (!value.empty ()) {
110+ emitter << YAML::Key << key << YAML::Value << value;
111+ }
112+ };
122113
123- if (needs_quotes) {
124- std::string escaped;
125- escaped.reserve (value.size () + 2 );
126- escaped += ' "' ;
127- for (char c : value) {
128- if (c == ' \\ ' ) {
129- escaped += " \\\\ " ;
130- } else if (c == ' "' ) {
131- escaped += " \\\" " ;
132- } else {
133- escaped += c;
134- }
114+ auto write_int_field = [&](char const *key, std::optional<int > const &value) {
115+ if (value.has_value ()) {
116+ emitter << YAML::Key << key << YAML::Value << value.value ();
135117 }
136- escaped += ' "' ;
137- return escaped;
138- }
139- return value;
118+ };
119+
120+ write_field (KEY_SSL_CERT_NAME, entry.ssl_cert_name );
121+ write_field (KEY_DEST_IP, entry.dest_ip );
122+ write_field (KEY_SSL_KEY_NAME, entry.ssl_key_name );
123+ write_field (KEY_SSL_CA_NAME, entry.ssl_ca_name );
124+ write_field (KEY_SSL_OCSP_NAME, entry.ssl_ocsp_name );
125+ write_field (KEY_SSL_KEY_DIALOG, entry.ssl_key_dialog );
126+ write_field (KEY_DEST_FQDN, entry.dest_fqdn );
127+ write_field (KEY_ACTION, entry.action );
128+ write_int_field (KEY_SSL_TICKET_ENABLED, entry.ssl_ticket_enabled );
129+ write_int_field (KEY_SSL_TICKET_NUMBER, entry.ssl_ticket_number );
130+
131+ emitter << YAML::EndMap;
140132}
141133
142134} // namespace
@@ -268,9 +260,8 @@ SSLMultiCertParser::parse_yaml(std::string_view content)
268260 return {result, swoc::Errata (" expected 'ssl_multicert' to be a sequence" )};
269261 }
270262
271- for (auto it = entries.begin (); it != entries.end (); ++it) {
272- YAML::Node entry_node = *it;
273- auto const mark = entry_node.Mark ();
263+ for (auto const &entry_node : entries) {
264+ auto const mark = entry_node.Mark ();
274265 if (!entry_node.IsMap ()) {
275266 return {result, swoc::Errata (ERRATA_ERROR_SEV, " Expected ssl_multicert entries to be maps at line {}, column {}" , mark.line ,
276267 mark.column )};
@@ -352,41 +343,16 @@ SSLMultiCertParser::parse_legacy(std::string_view content)
352343std::string
353344SSLMultiCertMarshaller::to_yaml (SSLMultiCertConfig const &config)
354345{
355- std::ostringstream out;
356- out << " ssl_multicert:\n " ;
346+ YAML::Emitter yaml;
347+ yaml << YAML::BeginMap;
348+ yaml << YAML::Key << KEY_SSL_MULTICERT << YAML::Value << YAML::BeginSeq;
357349
358350 for (auto const &entry : config) {
359- bool first = true ;
360-
361- auto write_field = [&](char const *key, std::string const &value) {
362- if (value.empty ()) {
363- return ;
364- }
365- out << (first ? " - " : " " ) << key << " : " << yaml_escape (value) << " \n " ;
366- first = false ;
367- };
368-
369- auto write_int_field = [&](char const *key, std::optional<int > const &value) {
370- if (!value.has_value ()) {
371- return ;
372- }
373- out << (first ? " - " : " " ) << key << " : " << value.value () << " \n " ;
374- first = false ;
375- };
376-
377- write_field (KEY_SSL_CERT_NAME, entry.ssl_cert_name );
378- write_field (KEY_DEST_IP, entry.dest_ip );
379- write_field (KEY_SSL_KEY_NAME, entry.ssl_key_name );
380- write_field (KEY_SSL_CA_NAME, entry.ssl_ca_name );
381- write_field (KEY_SSL_OCSP_NAME, entry.ssl_ocsp_name );
382- write_field (KEY_SSL_KEY_DIALOG, entry.ssl_key_dialog );
383- write_field (KEY_DEST_FQDN, entry.dest_fqdn );
384- write_field (KEY_ACTION, entry.action );
385- write_int_field (KEY_SSL_TICKET_ENABLED, entry.ssl_ticket_enabled );
386- write_int_field (KEY_SSL_TICKET_NUMBER, entry.ssl_ticket_number );
351+ emit_entry (yaml, entry);
387352 }
388353
389- return out.str ();
354+ yaml << YAML::EndSeq << YAML::EndMap;
355+ return yaml.c_str ();
390356}
391357
392358std::string
@@ -398,32 +364,7 @@ SSLMultiCertMarshaller::to_json(SSLMultiCertConfig const &config)
398364 json << YAML::Key << KEY_SSL_MULTICERT << YAML::Value << YAML::BeginSeq;
399365
400366 for (auto const &entry : config) {
401- json << YAML::BeginMap;
402-
403- auto write_field = [&](char const *key, std::string const &value) {
404- if (!value.empty ()) {
405- json << YAML::Key << key << YAML::Value << value;
406- }
407- };
408-
409- auto write_int_field = [&](char const *key, std::optional<int > const &value) {
410- if (value.has_value ()) {
411- json << YAML::Key << key << YAML::Value << value.value ();
412- }
413- };
414-
415- write_field (KEY_SSL_CERT_NAME, entry.ssl_cert_name );
416- write_field (KEY_DEST_IP, entry.dest_ip );
417- write_field (KEY_SSL_KEY_NAME, entry.ssl_key_name );
418- write_field (KEY_SSL_CA_NAME, entry.ssl_ca_name );
419- write_field (KEY_SSL_OCSP_NAME, entry.ssl_ocsp_name );
420- write_field (KEY_SSL_KEY_DIALOG, entry.ssl_key_dialog );
421- write_field (KEY_DEST_FQDN, entry.dest_fqdn );
422- write_field (KEY_ACTION, entry.action );
423- write_int_field (KEY_SSL_TICKET_ENABLED, entry.ssl_ticket_enabled );
424- write_int_field (KEY_SSL_TICKET_NUMBER, entry.ssl_ticket_number );
425-
426- json << YAML::EndMap;
367+ emit_entry (json, entry);
427368 }
428369
429370 json << YAML::EndSeq << YAML::EndMap;
0 commit comments