Blame awklib/eg/network/coreserv.awk

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
}