shithub: riscv

Download patch

ref: 1a1863e5dc8913e47b16e44499a3cc735aead394
parent: 8caf4d3bcbabe28d34556ea6b5542b491ea43e27
author: cinap_lenrek <[email protected]>
date: Tue Jun 2 12:56:19 EDT 2015

rc-httpd: cleanup cgi handler

- avoid silly stats and checks for $cgi_dir, just use status
  from builtin cd.

- log proper http status code from the cgi script

--- a/rc/bin/rc-httpd/handlers/cgi
+++ b/rc/bin/rc-httpd/handlers/cgi
@@ -1,15 +1,13 @@
 #!/bin/rc
 fn filter_headers{
-	response='HTTP/1.1 200 OK'^$cr
+	response=(200 OK)
 	lines=''
 	done=false
 	while(~ $done false){
 		line=`{getline}
 		head=`{echo $line | awk '{print tolower($1)}'}
-		if(~ $head status:*){
-			tmp=`{echo $line | awk '{$1="" ; print}'}
-			response='HTTP/1.1 '^$"tmp^$cr
-		}
+		if(~ $head status:*)
+			response=`{echo $line | awk '{$1="" ; print}'}
 		if not if(~ $line '')
 			done=true
 		if not
@@ -16,36 +14,30 @@
 			lines=$"lines^$"line^$cr^'
 '
 	}
-	echo $response
+	echo 'HTTP/1.1' $"response^$cr
 	echo -n $"lines
+	do_log $response(1)
 }
 
 fn run_cgi {
-	path=$cgi_path exec $"cgi_bin $params
+	path=$cgi_path exec $"cgi_bin $params || echo 'Status: 500'
 }
 
 cgi_bin=$1
-if(! ~ $cgi_bin /*){
-	pwd=`{pwd}
-	cgi_bin=$"pwd ^ / ^ $cgi_bin
-}
-
-cgi_dir=$*($#*)
-if(! test -d $cgi_dir){
-	cgi_dir=`{basename -d $cgi_dir}
+cgi_dir=.
+if(! ~ $#* 1)
+	cgi_dir=$*($#*)
+if not if(~ $"cgi_bin /*){
+	cgi_dir=`{basename -d $"cgi_bin}
 	cgi_dir=$"cgi_dir
 }
-
-if(! test -d $"cgi_dir){
+if(! ~ $"cgi_bin */*)
+	cgi_bin=./$"cgi_bin
+if(! builtin cd $"cgi_dir >[2]/dev/null || ! test -x $"cgi_bin){
 	error 500
 	exit
 }
-if(! test -f  $cgi_bin -x $cgi_bin){
-	error 500
-	exit
-}
-do_log 200
-builtin cd $"cgi_dir
+
 run_cgi | {
 	filter_headers
 	emit_extra_headers