#!tcl

#
# HTTP Daemon
#

if {$argc == 1} {
    set port [lindex $argv 0]
} else {
    set port 80
}

set s [socket -p $port 1]

while {1} {
    set ns [$s accept]
    set ip [$ns getaddr]
    set t [string last " \[public" $ip]
    if {$t != -1} {
        incr t -1
        set ip [string range $ip 0 $t]
        echo HTTPD: connection request from $ip ignored
        rename $ns {}
        continue
    }    

    set data [$ns gets 512]

    set fname [lindex $data 1]
    set fname [concat [pwd]$fname]

    if {[file exists $fname]} {
        set len [file size $fname]
    } else {
        set password [format "+%s" [exec password]]
        if {$password == "+"} {
            $ns puts "HTTP/1.0 200 OK\n"
            $ns puts "Content-type: text/plain\n"
            $ns puts "Expires: Thu, 01 Dec 1994 16:00:00 GMT\n"
            $ns puts "\n"
            $ns puts "ERROR: password invalid\n"
            $ns shutdown
            rename $ns {}
            continue
        }

        set p [string last $password $fname]
        if {$p == -1} {
            $ns puts "HTTP/1.0 200 OK\n"
            $ns puts "Content-type: text/plain\n"
            $ns puts "Expires: Thu, 01 Dec 1994 16:00:00 GMT\n"
            $ns puts "\n"
            $ns puts "ERROR: file not found or password invalid\n"
            $ns shutdown
            rename $ns {}
            continue
        } else {
            incr p -1
            set fname [string range $fname 0 $p]
        }
        set r [string first "cmd?COMMAND=" $fname] 
        if {$r != -1} {
            set cmd [split $fname =]
            set cmd [lindex $cmd 1]
            set cmd [split $cmd +]
            set command [lindex $cmd 0]
            set arg1 [lindex $cmd 1]
            set arg2 [lindex $cmd 2] 
            set arg3 [lindex $cmd 3] 
            set arg4 [lindex $cmd 4] 
            set arg5 [lindex $cmd 5] 
            $ns puts "HTTP/1.0 200 OK\n"
            $ns puts "Content-type: text/plain\n"
            $ns puts "Expires: Thu, 01 Dec 1994 16:00:00 GMT\n"
            $ns puts "\n"
            if {$cmd == "exit"} {
                $ns puts "Goodbye.\nHTTPD terminated.\n"
                $ns shutdown
                rename $ns {}
                break
            }
            if {$cmd == "termin"} {
                $ns puts "Goodbye.\nHTTPD terminated.\n"
                $ns shutdown
                rename $ns {}
                break
            }
            if {$command != ""} {
                $ns puts [exec $command $arg1 $arg2 $arg3 $arg4 $arg5]
                $ns puts "\n"
            }
            $ns shutdown
            rename $ns {} 
            unset data
            continue
        } else {
            $ns puts "HTTP/1.0 200 OK\n"
            $ns puts "Content-type: text/plain\n"
            $ns puts "Expires: Thu, 01 Dec 1994 16:00:00 GMT\n"
            $ns puts "\n"
            $ns puts "Page not available\n"
            $ns shutdown
            rename $ns {} 
            unset data
            continue
        }
    }
#    $ns puts "HTTP/1.0 200 OK\n"
#    $ns puts "Expires: Thu, 01 Dec 1994 16:00:00 GMT\n"
#    $ns puts "\n"
    set len [$ns putf $fname]
    $ns shutdown
    rename $ns {}
    unset data
}
rename $s {}
echo HTTP Daemon terminated
