diff options
author | Dennis Eriksen <d@ennis.no> | 2023-06-29 22:10:08 +0200 |
---|---|---|
committer | Dennis Eriksen <d@ennis.no> | 2023-06-29 22:10:08 +0200 |
commit | 8049367f4349662c3952a53144b52704a1b0ec93 (patch) | |
tree | 598dd1b2e100256d769a0c9ba95accaa6f168d25 /src/cgidebug.rs | |
download | purl-rs-8049367f4349662c3952a53144b52704a1b0ec93.tar.gz |
initial commit - it sort of works a bit
Diffstat (limited to 'src/cgidebug.rs')
-rw-r--r-- | src/cgidebug.rs | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/src/cgidebug.rs b/src/cgidebug.rs new file mode 100644 index 0000000..afdc7ca --- /dev/null +++ b/src/cgidebug.rs @@ -0,0 +1,81 @@ +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( "<html>\n" ); + write_stdout_s( " <head>\n" ); + write_stdout_s( " <title>Rust CGI Test</title>\n" ); + write_stdout_s( " <style type=\"text/css\">\n" ); + write_stdout_s( " td { border:1px solid black; }\n" ); + write_stdout_s( " td { font-family:monospace; }\n" ); + write_stdout_s( " table { border-collapse:collapse; }\n" ); + write_stdout_s( " </style>\n" ); + write_stdout_s( " </head>\n" ); + write_stdout_s( " <body>\n" ); + write_stdout_s( " <h1>Environment</h1>\n" ); + write_stdout_s( " <table>\n" ); + write_stdout_s( " <tr><th>Key</th><th>Value</th></tr>\n" ); + + // copy environment into a BTreeMap which is sorted + let mut sortedmap : BTreeMap<String,String> = 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!( + " <tr><td>{}</td><td>{}</td></tr>\n", + html_escape( key ), + html_escape( value ) + ) + ); + } + write_stdout_s( " </table>\n" ); + write_stdout_s( " </body>\n" ); + write_stdout_s( "</html>\n" ); +} |