$!
$! HTDIR.COM
$! This is an example DCL CGI+ script.
$! It has the same main functionality as the WASD directory listing
$! with HTdir script set features included.
$!
$ ON ERROR THEN GOTO ERROR_HANDLER
$ SET MESSAGE/NOFACILITY/NOSEVERITY/NOIDENTIFICATION/NOTEXT
$ HT_IDENT="HTdir V1.1C"
$ SAY:="WRITE/SYMBOL SYS$OUTPUT"
$ CGIUTL:=$CGI-BIN:[000000]CGIUTL
$ CGIEOF=F$TRNLNM("CGIPLUSEOF","LNM$PROCESS")
$ CGIESC=F$TRNLNM("CGIPLUSESC","LNM$PROCESS")
$ CGIEOT=F$TRNLNM("CGIPLUSEOT","LNM$PROCESS")
$ EMPTY=" "
$ OPEN/READ/ERROR=IVENV CGIPLUSIN CGIPLUSIN:
$ IF CGIEOF .EQS. "" THEN GOTO CGI_VARS_END
$!
$ REQUEST_LOOP:
$ DELETE/SYMBOL/GLOBAL/ALL
$ READ/ERROR=DONE/END=DONE CGIPLUSIN LINE
$!
$ CGI_VARS_LOOP:
$ READ/ERROR=DONE/END=DONE CGIPLUSIN LINE
$ IF LINE .EQS. "" THEN GOTO CGI_VARS_END
$ CGI_VAR_NAME=F$ELEMENT(0,"=",LINE)
$ CGI_VAR_VALUE=LINE-(CGI_VAR_NAME+"=")
$ 'CGI_VAR_NAME'=="''CGI_VAR_VALUE'"
$ GOTO CGI_VARS_LOOP
$ CGI_VARS_END:
$!
$ UNICON=""
$ UPD=""
$ IF F$TYPE(WWW_FORM_UPD) .NES. "" THEN UPD="*"
$ IF WWW_REQUEST_METHOD .EQS. "POST" THEN UPD="*"
$ QUERY=""
$ IF F$TYPE(WWW_QUERY_STRING) .NES. "" THEN IF WWW_QUERY_STRING .NES. "" THEN -
QUERY="?"+WWW_QUERY_STRING
$ TARG=""
$ IF F$TYPE(WWW_FORM_TARGET) .NES. "" THEN TARG=" TARGET="+WWW_FORM_TARGET
$!
$ IF WWW_PATH_INFO .EQS. ""
$ THEN
$ SAY "Location: //",WWW_SCRIPT_NAME,"/",QUERY
$ SAY ""
$ GOTO NEXT
$ ENDIF
$ LINE=F$PARSE(WWW_PATH_TRANSLATED,"*.*")
$ LINE=F$PARSE(LINE,,,"NAME")+F$PARSE(LINE,,,"TYPE")+F$PARSE(LINE,,,"VERSION")
$ IF F$LOCATE("*",LINE) .GE. F$LENGTH(LINE)
$ THEN
$ SAY "Location: ",WWW_PATH_INFO
$ SAY ""
$ GOTO NEXT
$ ENDIF
$!
$ IF WWW_REQUEST_METHOD .EQS. "POST" THEN -
CGIUTL/URLDECODE/SYMBOLS/PREFIX=WWW_FORM
$ IF F$TYPE(WWW_FORM_SEL$$0) .EQS. ""
$ THEN
$ WWW_FORM_SEL$$0=="0"
$ IF F$TYPE(WWW_FORM_SEL) .NES. "" THEN WWW_FORM_SEL$$0=="1"
$ ENDIF
$!
$ SAY "Content-type: text/html"
$ SAY ""
$!
$ PEER=""
$ IF F$TYPE(WWW_FORM_DIR) .NES. ""
$ THEN
$ SAY CGIESC
$ SAY "MAP-PATH: ",WWW_FORM_DIR
$ SAY CGIEOT
$ READ CGIPLUSIN PEER
$ IF F$ELEMENT(0," ",PEER) .EQS. "200"
$ THEN
$ PEER=PEER-"200 "
$ PEER=F$EDIT(PEER,"TRIM")
$ ELSE
$ PEER=""
$ ENDIF
$ ENDIF
$!
$ SAY ""
$ SAY ""
$ SAY ""
$ SAY ""
$ SAY ""
$ SAY ""
$ SAY "//",WWW_HTTP_HOST,WWW_PATH_INFO,""
$ IF UPD .NES. ""
$ THEN
$ SAY ""
$ ENDIF
$ SAY ""
$ LINE=""
$ IF F$TYPE(WWW_HTML_BODYTAG) .NES. "" THEN LINE=""
$ SAY LINE
$ IF F$TYPE(WWW_HTML_HEADERTAG) .NES. ""
$ THEN
$ LINE=WWW_HTML_HEADERTAG
$ IF (F$LENGTH(LINE) .EQ. 0) .OR. (F$LOCATE("<",LINE) .NE. 0) THEN -
LINE=""
$ SAY LINE
$ ENDIF
$ IF F$TYPE(WWW_HTML_HEADER) .NES. "" THEN SAY WWW_HTML_HEADER
$!
$ REF=WWW_SCRIPT_NAME+"/"
$ LINE="//"+WWW_HTTP_HOST+"/"
$ REST=WWW_PATH_INFO-"/"
$ HDR_LOOP:
$ IF F$ELEMENT(1,"/",REST) .EQS. "/" THEN GOTO HDR_END
$ TMP=F$ELEMENT(0,"/",REST)
$ REST=REST-TMP-"/"
$ REF=REF+TMP+"/"
$ LINE=LINE+""+TMP+"/"
$ GOTO HDR_LOOP
$ HDR_END:
$ SAY ""
$ LINE=F$PARSE(WWW_PATH_TRANSLATED,,,"DEVICE")+ -
F$PARSE(WWW_PATH_TRANSLATED,,,"DIRECTORY")
$ IF F$SEARCH("''LINE'README.HTML") .NES. ""
$ THEN
$ TYPE 'LINE'README.HTML
$ ELSE
$ IF F$SEARCH("''LINE'README.TXT") .NES. ""
$ THEN
$ SAY ""
$ TYPE 'LINE'README.TXT
$ SAY " "
$ ENDIF
$ ENDIF
$!
$ IF F$TYPE(WWW_HTML_HEADERTAG) .NES. "" THEN SAY " | "
$ IF UPD .NES. ""
$ THEN
$ SAY ""
$ IF F$TYPE(WWW_HTML_FOOTERTAG) .NES. ""
$ THEN
$ LINE=WWW_HTML_FOOTERTAG
$ IF (F$LENGTH(LINE) .EQ. 0) .OR. (F$LOCATE("<",LINE) .NE. 0) THEN -
LINE="| "
$ SAY LINE
$ ENDIF
$ IF F$TYPE(WWW_HTML_FOOTER) .NES. "" THEN SAY WWW_HTML_FOOTER
$ IF F$TYPE(WWW_HTML_FOOTERTAG) .NES. "" THEN SAY " | "
$ SAY ""
$ SAY ""
$!
$ NEXT:
$ IF CGIEOF .NES. ""
$ THEN
$ SAY CGIEOF
$ GOTO REQUEST_LOOP
$ ENDIF
$ DONE:
$ CLOSE CGIPLUSIN
$ EXIT
$!
$ IVENV:
$ CALL ERROR_REPORT 500 "Invalid environment" "''HT_IDENT'"
$ GOTO DONE
$!
$ ERROR_HANDLER:
$ CALL ERROR_REPORT 500 "''F$FAO(F$MESSAGE($STATUS),"","","","")'" "''HT_IDENT'"
$ GOTO DONE
$!
$! Error report subroutine.
$! P1 - HTTP status (required)
$! P2 - error text (required)
$! P3 - module name (optional)
$! P4 - line number (optional)
$! Uses WASD Script-control: X-error-... extensions.
$! If the current version doesn't support them,
$! Then it will be a simple error report.
$!
$ ERROR_REPORT: SUBROUTINE
$ SAY "Status: ",P1
$ SAY "Script-control: X-error-text=""",P2,""""
$ IF P3 .NES. "" THEN SAY "Script-control: X-error-module=""",P3,""""
$ IF P4 .NES. "" THEN SAY "Script-control: X-error-line=",P4
$ SAY P1,": ",P2
$ EXIT
$ ENDSUBROUTINE
|