|
|
|
@ -23,52 +23,79 @@ void on_ready(protocol::protocol_t& protocol, protocol::message_t message) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void on_data(protocol::protocol_t& protocol, protocol::message_t message) { |
|
|
|
|
sessions.emplace(protocol::session_key_from(message), mail::session_t{}); |
|
|
|
|
debug && cerr << "New message" << endl; |
|
|
|
|
auto session_key = protocol::session_key_from(message); |
|
|
|
|
sessions.emplace(session_key, mail::session_t{}); |
|
|
|
|
protocol.proceed(session_key); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void on_data_line(protocol::protocol_t& protocol, protocol::message_t message) { |
|
|
|
|
auto tokens = protocol::token::decompose(message.input); |
|
|
|
|
auto& session = sessions.at(protocol::session_key_from(tokens)); |
|
|
|
|
auto& data_line = tokens.at(7); |
|
|
|
|
debug && cerr << "Received data line" << endl; |
|
|
|
|
|
|
|
|
|
if(!session.has_header) { |
|
|
|
|
if(data_line == "") { |
|
|
|
|
session.has_header = true; |
|
|
|
|
auto tokens = protocol::token::decompose(message.input); |
|
|
|
|
auto session_key = protocol::session_key_from(tokens); |
|
|
|
|
try { |
|
|
|
|
auto& session = sessions.at(session_key); |
|
|
|
|
auto& data_line = tokens.at(7); |
|
|
|
|
|
|
|
|
|
if(!session.has_header) { |
|
|
|
|
if(data_line == "") { |
|
|
|
|
session.has_header = true; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
session.message.header.push_back(data_line); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
session.message.header.push_back(data_line); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
if(data_line == ".") { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(data_line == ".") { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
if(data_line == "..") { |
|
|
|
|
session.message.body.push_back("."); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(data_line == "..") { |
|
|
|
|
session.message.body.push_back("."); |
|
|
|
|
return; |
|
|
|
|
session.message.body.push_back(data_line); |
|
|
|
|
} catch(out_of_range& e) { |
|
|
|
|
debug && cerr << "Unknown session key" << endl; |
|
|
|
|
protocol.fail(session_key); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
session.message.body.push_back(data_line); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void on_commit(protocol::protocol_t& protocol, protocol::message_t message) { |
|
|
|
|
debug && cerr << "Message committed" << endl; |
|
|
|
|
auto session_key = protocol::session_key_from(message); |
|
|
|
|
auto& session = sessions.at(session_key); |
|
|
|
|
protocol.submit_message(session_key, session.message.header, session.message.body); |
|
|
|
|
try { |
|
|
|
|
auto& session = sessions.at(session_key); |
|
|
|
|
protocol.submit_message(session_key, session.message.header, session.message.body); |
|
|
|
|
sessions.erase(session_key); |
|
|
|
|
protocol.proceed(session_key); |
|
|
|
|
} catch(out_of_range& e) { |
|
|
|
|
debug && cerr << "Unknown session key" << endl; |
|
|
|
|
protocol.fail(session_key); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int main(int argc, char** argv) { |
|
|
|
|
protocol::ios_protocol_t protocol(cin, cout); |
|
|
|
|
|
|
|
|
|
protocol::handler_map_t handlers; |
|
|
|
|
|
|
|
|
|
handlers.emplace("config|ready", on_ready); |
|
|
|
|
handlers.emplace("filter|*|*|smtp-in|data", on_data); |
|
|
|
|
handlers.emplace("filter|*|*|smtp-in|data-line", on_data_line); |
|
|
|
|
handlers.emplace("filter|*|*|smtp-in|commit", on_commit); |
|
|
|
|
protocol.set_handlers(handlers); |
|
|
|
|
|
|
|
|
|
if(debug) { |
|
|
|
|
cerr << "Handler patterns:" << endl; |
|
|
|
|
for(auto&& [first, second] : handlers) { |
|
|
|
|
cerr << "\t" << first << endl; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
protocol.set_handlers(handlers); |
|
|
|
|
protocol.run(); |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|