aboutsummaryrefslogtreecommitdiffstats
path: root/src/cgidebug.rs
diff options
context:
space:
mode:
authorDennis Eriksen <d@ennis.no>2023-06-29 22:10:08 +0200
committerDennis Eriksen <d@ennis.no>2023-06-29 22:10:08 +0200
commit8049367f4349662c3952a53144b52704a1b0ec93 (patch)
tree598dd1b2e100256d769a0c9ba95accaa6f168d25 /src/cgidebug.rs
downloadpurl-rs-8049367f4349662c3952a53144b52704a1b0ec93.tar.gz
initial commit - it sort of works a bit
Diffstat (limited to 'src/cgidebug.rs')
-rw-r--r--src/cgidebug.rs81
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( "&amp;" );
+ } else if thechar == '<' {
+ copy.push_str( "&lt;" );
+ } else if thechar == '>' {
+ copy.push_str( "&gt;" );
+ } else if thechar == '\"' {
+ copy.push_str( "&quot;" );
+ } 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" );
+}