|
Packit |
575503 |
# CGI Library and core of a web server
|
|
Packit |
575503 |
#
|
|
Packit |
575503 |
# Juergen Kahrs, Juergen.Kahrs@vr-web.de
|
|
Packit |
575503 |
# with Arnold Robbins, arnold@skeeve.com
|
|
Packit |
575503 |
# September 2000
|
|
Packit |
575503 |
|
|
Packit |
575503 |
# Global arrays
|
|
Packit |
575503 |
# GETARG --- arguments to CGI GET command
|
|
Packit |
575503 |
# MENU --- menu items (path names)
|
|
Packit |
575503 |
# PARAM --- parameters of form x=y
|
|
Packit |
575503 |
|
|
Packit |
575503 |
# Optional variable MyHost contains host address
|
|
Packit |
575503 |
# Optional variable MyPort contains port number
|
|
Packit |
575503 |
# Needs TopHeader, TopDoc, TopFooter
|
|
Packit |
575503 |
# Sets MyPrefix, HttpService, Status, Reason
|
|
Packit |
575503 |
|
|
Packit |
575503 |
BEGIN {
|
|
Packit |
575503 |
if (MyHost == "") {
|
|
Packit |
575503 |
"uname -n" | getline MyHost
|
|
Packit |
575503 |
close("uname -n")
|
|
Packit |
575503 |
}
|
|
Packit |
575503 |
if (MyPort == 0) MyPort = 8080
|
|
Packit |
575503 |
HttpService = "/inet/tcp/" MyPort "/0/0"
|
|
Packit |
575503 |
MyPrefix = "http://" MyHost ":" MyPort
|
|
Packit |
575503 |
SetUpServer()
|
|
Packit |
575503 |
while ("awk" != "complex") {
|
|
Packit |
575503 |
# header lines are terminated this way
|
|
Packit |
575503 |
RS = ORS = "\r\n"
|
|
Packit |
575503 |
Status = 200 # this means OK
|
|
Packit |
575503 |
Reason = "OK"
|
|
Packit |
575503 |
Header = TopHeader
|
|
Packit |
575503 |
Document = TopDoc
|
|
Packit |
575503 |
Footer = TopFooter
|
|
Packit |
575503 |
if (GETARG["Method"] == "GET") {
|
|
Packit |
575503 |
HandleGET()
|
|
Packit |
575503 |
} else if (GETARG["Method"] == "HEAD") {
|
|
Packit |
575503 |
# not yet implemented
|
|
Packit |
575503 |
} else if (GETARG["Method"] != "") {
|
|
Packit |
575503 |
print "bad method", GETARG["Method"]
|
|
Packit |
575503 |
}
|
|
Packit |
575503 |
Prompt = Header Document Footer
|
|
Packit |
575503 |
print "HTTP/1.0", Status, Reason |& HttpService
|
|
Packit |
575503 |
print "Connection: Close" |& HttpService
|
|
Packit |
575503 |
print "Pragma: no-cache" |& HttpService
|
|
Packit |
575503 |
len = length(Prompt) + length(ORS)
|
|
Packit |
575503 |
print "Content-length:", len |& HttpService
|
|
Packit |
575503 |
print ORS Prompt |& HttpService
|
|
Packit |
575503 |
# ignore all the header lines
|
|
Packit |
575503 |
while ((HttpService |& getline) > 0)
|
|
Packit |
575503 |
continue
|
|
Packit |
575503 |
# stop talking to this client
|
|
Packit |
575503 |
close(HttpService)
|
|
Packit |
575503 |
# wait for new client request
|
|
Packit |
575503 |
HttpService |& getline
|
|
Packit |
575503 |
# do some logging
|
|
Packit |
575503 |
print systime(), strftime(), $0
|
|
Packit |
575503 |
CGI_setup($1, $2, $3)
|
|
Packit |
575503 |
}
|
|
Packit |
575503 |
}
|
|
Packit |
575503 |
|
|
Packit |
575503 |
function CGI_setup( method, uri, version, i)
|
|
Packit |
575503 |
{
|
|
Packit |
575503 |
delete GETARG
|
|
Packit |
575503 |
delete MENU
|
|
Packit |
575503 |
delete PARAM
|
|
Packit |
575503 |
GETARG["Method"] = method
|
|
Packit |
575503 |
GETARG["URI"] = uri
|
|
Packit |
575503 |
GETARG["Version"] = version
|
|
Packit |
575503 |
|
|
Packit |
575503 |
i = index(uri, "?")
|
|
Packit |
575503 |
if (i > 0) { # is there a "?" indicating a CGI request?
|
|
Packit |
575503 |
split(substr(uri, 1, i-1), MENU, "[/:]")
|
|
Packit |
575503 |
split(substr(uri, i+1), PARAM, "&")
|
|
Packit |
575503 |
for (i in PARAM) {
|
|
Packit |
575503 |
PARAM[i] = _CGI_decode(PARAM[i])
|
|
Packit |
575503 |
j = index(PARAM[i], "=")
|
|
Packit |
575503 |
GETARG[substr(PARAM[i], 1, j-1)] = \
|
|
Packit |
575503 |
substr(PARAM[i], j+1)
|
|
Packit |
575503 |
}
|
|
Packit |
575503 |
} else { # there is no "?", no need for splitting PARAMs
|
|
Packit |
575503 |
split(uri, MENU, "[/:]")
|
|
Packit |
575503 |
}
|
|
Packit |
575503 |
for (i in MENU) # decode characters in path
|
|
Packit |
575503 |
if (i > 4) # but not those in host name
|
|
Packit |
575503 |
MENU[i] = _CGI_decode(MENU[i])
|
|
Packit |
575503 |
}
|
|
Packit |
575503 |
function _CGI_decode(str, hexdigs, i, pre, code1, code2,
|
|
Packit |
575503 |
val, result)
|
|
Packit |
575503 |
{
|
|
Packit |
575503 |
hexdigs = "123456789abcdef"
|
|
Packit |
575503 |
|
|
Packit |
575503 |
i = index(str, "%")
|
|
Packit |
575503 |
if (i == 0) # no work to do
|
|
Packit |
575503 |
return str
|
|
Packit |
575503 |
|
|
Packit |
575503 |
do {
|
|
Packit |
575503 |
pre = substr(str, 1, i-1) # part before %xx
|
|
Packit |
575503 |
code1 = substr(str, i+1, 1) # first hex digit
|
|
Packit |
575503 |
code2 = substr(str, i+2, 1) # second hex digit
|
|
Packit |
575503 |
str = substr(str, i+3) # rest of string
|
|
Packit |
575503 |
|
|
Packit |
575503 |
code1 = tolower(code1)
|
|
Packit |
575503 |
code2 = tolower(code2)
|
|
Packit |
575503 |
val = index(hexdigs, code1) * 16 \
|
|
Packit |
575503 |
+ index(hexdigs, code2)
|
|
Packit |
575503 |
|
|
Packit |
575503 |
result = result pre sprintf("%c", val)
|
|
Packit |
575503 |
i = index(str, "%")
|
|
Packit |
575503 |
} while (i != 0)
|
|
Packit |
575503 |
if (length(str) > 0)
|
|
Packit |
575503 |
result = result str
|
|
Packit |
575503 |
return result
|
|
Packit |
575503 |
}
|