]> git.plutz.net Git - cgilite/blobdiff - server.sh
externalize stabndalone server mode into file
[cgilite] / server.sh
diff --git a/server.sh b/server.sh
new file mode 100755 (executable)
index 0000000..dc97607
--- /dev/null
+++ b/server.sh
@@ -0,0 +1,86 @@
+#!/bin/zsh
+
+# Copyright 2016 Paul Hänsch
+#
+# This file is part of shcgi.
+# 
+# shcgi is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# 
+# shcgi is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+# 
+# You should have received a copy of the GNU Affero General Public License
+# along with shcgi.  If not, see <http://www.gnu.org/licenses/>. 
+
+if [ "$1" = '--server' ]; then
+  shift 1
+  ncat -klc "$call --ncat" $@
+  exit $?
+fi
+
+export REMOTE_ADDR="${NCAT_REMOTE_ADDR}"
+export SERVER_NAME="${NCAT_LOCAL_ADDR}"
+export SERVER_PORT="${NCAT_LOCAL_PORT}"
+
+eval $(
+sed -unr '
+  w/dev/stderr
+  /^(GET|HEAD|POST) ([^\?]*)\??(.+)? (HTTP\/[0-9]\.[0-9])\r?$/{
+    h
+    s;^(GET|HEAD|POST) ([^\?]*)\??(.+)? (HTTP\/[0-9]\.[0-9])\r?$;export REQUEST_METHOD='\''\1'\'';p
+    g
+    s;^(GET|HEAD|POST) ([^\?]*)\??(.+)? (HTTP\/[0-9]\.[0-9])\r?$;\2;
+    s;'\'';'\''\\'\'''\'';g
+    s;^.*$;export PATH_INFO='\''&'\'';p
+    g
+    s;^(GET|HEAD|POST) ([^\?]*)\??(.+)? (HTTP\/[0-9]\.[0-9])\r?$;\3;
+    s;'\'';'\''\\'\'''\'';g
+    s;^.*$;export QUERY_STRING='\''&'\'';p
+    g
+    s;^(GET|HEAD|POST) ([^\?]*)\??(.+)? (HTTP\/[0-9]\.[0-9])\r?$;export SERVER_PROTOCOL='\''\4'\'';p
+    g
+  }
+
+  /^[Pp][Rr][Oo][Xx][Yy]: /d
+
+  /^[a-zA-Z_-]+: .*$/{
+    h
+    s;^[^:]+: (.*)\r$;\1;
+    s;'\'';'\''\\'\'''\'';g
+    s;^.*$;'\''&'\'';
+    x
+    s;: .*$;;
+    y;abcdefghijklmnopqrstuvwxyz-;ABCDEFGHIJKLMNOPQRSTUVWXYZ_;
+    s;^.+$;export HTTP_&=;
+    G
+    s;\n;;
+    p
+  }
+  /^\r?$/q
+'
+)
+
+HTTP_format(){
+  LC_ALL=C sed -rn '
+  :A
+  /^\r?$/!{H;n;bA}
+  
+  g
+  s;^(\r?\n)*;;
+  aConnection: close\r\n\r
+  /^HTTP\/[0-9]\.[0-9] [1-5][0-9][0-9] .*/bX
+  s;^(.+\n)?Location: .*$;HTTP/1.1 302 Found\r\n&;
+  s;^(.+\n)?Content-Type: .*$;HTTP/1.1 200 OK\r\n&;
+  
+  :X
+  p
+  $q
+  n
+  bX
+  '
+}