10 SUB WWWLOG(WORD CODE, STRING MSG) %TITLE "WWWLOG" %IDENT "X0.7" ! http server logger ! (c) 2013 by Johnny Billquist ! ! X0.0 2013-06-09 Johnny Billquist ! Initial coding ! ! X0.1 2017-01-18 Johnny Billquist ! Added NETERR information in error log. ! ! X0.2 2017-01-30 Johnny Billquist ! Improved error handling on locked log file. ! ! X0.3 2017-10-23 Johnny Billquist ! Added call to NOTIFY for errors. ! ! X0.4 2018-03-23 Johnny Billquist ! Remove call to NOTIFY. We should not do ! that here, as there needs to be more context ! to when we should notify. This is done ! in the main module error handling. ! ! X0.5 2019-06-13 Johnny Billquist ! Changed how the string to log is built. ! Was using PRINT USING, now changed to creating the ! string with FORMAT$ for all parts before printing. ! ! X0.6 2020-09-05 Johnny Billquist ! Added flag to indicate if request have been logged, ! so we don't get multiple entries for one request. ! ! X0.7 2024-03-10 Johnny Billquist ! Cleanup of code and stream line it a little. %INCLUDE "WWW.INC" %INCLUDE "LB:[1,1]BQTLIB.B2S" %LET %BINLOG=0 DECLARE WORD LOGP, TRYCNT DECLARE STRING LOGNAM DECLARE STRING EMSG, FTXT %IF %BINLOG %THEN MAP (LOGG) & STRING L.TIME=8, & STRING L.REMOTE=22, & WORD L.CODE, & STRING L.FUN=8, & STRING L.URI=255, & STRING L.UAG=255 %END %IF ON ERROR GOTO Hell EXIT SUB IF F.LOG F.LOG = 1 EMSG = "" IF CODE<400 OR CODE=412 THEN LOGNAM = "ACCESS" ELSE LOGNAM = "ERROR" CALL NOTIFY(WWWFIL,2) EMSG = "(Neterr="+NUM1$(NETERR)+")" IF NETERR<>-255 END IF IF MSG = "" THEN MSG=EMSG ELSE MSG=MSG+" "+EMSG END IF MSG = " *** "+MSG IF MSG <> "" LOGP = 1 CALL BEPRIV(DEFUIC) TRYCNT = 0 FTXT = FORMAT$(QTSTR("",32), "'E ") FTXT = FTXT + FORMAT$(TRM$(REMOTE), "('E) ") FTXT = FTXT + FORMAT$(CODE, "[###] ") FTXT = FTXT + TRM$(FUN)+" " FTXT = FTXT + TRM$(URI)+" " FTXT = FTXT + FORMAT$(TRM$(REFER), "(from 'E) ") IF REFER<>"" FTXT = FTXT + FORMAT$(TRM$(UAG), "by 'E ") FTXT = FTXT + MSG DO_LOG: OPEN "IP$LOG:"+LOGNAM+".LOG" AS FILE LOGFIL, & ORGANIZATION SEQUENTIAL, & ALLOW READ, ACCESS APPEND, RECORDSIZE 512, & FILESIZE 100, EXTENDSIZE 100 PRINT #LOGFIL,FTXT; CLOSE #LOGFIL 20 LOGP = 2 TRYCNT = 0 DO_LOG2: %IF %BINLOG %THEN OPEN PATH+"HTTPD.DAT" AS FILE LOGFIL, & ORGANIZATION SEQUENTIAL FIXED, & RECORDTYPE NONE, & ALLOW MODIFY, & ACCESS APPEND, & MAP LOGG, & FILESIZE 100, & EXTENDSIZE 100 L.TIME=QTIME L.REMOTE=REMOTE L.CODE=CODE L.FUN=FUN L.URI=URI L.UAG=UAG PUT #LOGFIL CLOSE #LOGFIL %END %IF 30 DONE: CALL NOPRIV(UIC) EXIT SUB 40 TooMany: CALL NOPRIV(UIC) ON ERROR GO BACK CAUSE ERROR 14 50 Hell: ECNT = ECNT+1 RESUME TooMany IF ECNT>10 SELECT ERR CASE 138 ! Log file locked. Wait and retry. TRYCNT=TRYCNT+1 IF TRYCNT<10 THEN SLEEP 1 RESUME DO_LOG IF LOGP=1 RESUME DO_LOG2 IF LOGP=2 END IF PRINT "WWWLOG - Logging lockout. Request is not logged." RESUME Done CASE 133 ! Weird error if IP$LOG don't exist... RESUME Done CASE 1 ! Bad directory RESUME Done CASE 160 PRINT "Fatal log error:";LOGP RESUME Done END SELECT ! Catchall for errors... ! Any errors that come here will cause a 400, unless we were ! already generating reply, at which point we instead finish. PRINT "WWWLOG - Fatal error. Cannot continue. - ";ERR;ERT$(ERR) RESUME Done END SUB