use std::io::Write; use std::env; use std::collections::btree_map::BTreeMap; fn write_stderr( msg : String ) { let mut stderr = std::io::stderr(); write!(&mut stderr, "{}", msg).unwrap(); } fn write_stderr_s( msg : &str ) { write_stderr( msg.to_string() ); } fn write_stdout( msg : String ) { let mut stdout = std::io::stdout(); write!(&mut stdout, "{}", msg).unwrap(); } fn write_stdout_s( msg : &str ) { write_stdout( msg.to_string() ); } fn html_escape( msg : String ) -> String { let mut copy : String = String::with_capacity( msg.len() ); for thechar in msg.chars() { if thechar == '&' { copy.push_str( "&" ); } else if thechar == '<' { copy.push_str( "<" ); } else if thechar == '>' { copy.push_str( ">" ); } else if thechar == '\"' { copy.push_str( """ ); } else { copy.push( thechar ); } } return copy; } fn main() { write_stdout_s( "Status: 301 Moved Permanently\n" ); write_stdout_s( "Location: https://www.vg.no\n" ); write_stdout_s( "Content-type: text/html\n" ); write_stdout_s( "\n" ); write_stdout_s( "\n" ); write_stdout_s( " \n" ); write_stdout_s( " Rust CGI Test\n" ); write_stdout_s( " \n" ); write_stdout_s( " \n" ); write_stdout_s( " \n" ); write_stdout_s( "

Environment

\n" ); write_stdout_s( " \n" ); write_stdout_s( " \n" ); // copy environment into a BTreeMap which is sorted let mut sortedmap : BTreeMap = BTreeMap::new(); for (key, value) in env::vars() { sortedmap.insert( key, value ); } // output environment into HTML table for (key, value) in sortedmap { write_stdout( format!( " \n", html_escape( key ), html_escape( value ) ) ); } write_stdout_s( "
KeyValue
{}{}
\n" ); write_stdout_s( " \n" ); write_stdout_s( "\n" ); }