home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Spezial / SPEZIAL2_97.zip / SPEZIAL2_97.iso / ANWEND / ONLINE / SREFPRC1 / SSI.SRF < prev    next >
Text File  |  1997-08-27  |  59KB  |  1,866 lines

  1. /* -----------Sre-filter Server side include routine -------------- */ 
  2. /* Main routine for doing server side includes (ssi's)
  3.   1) Check in ssi-cache for thefile? If yes, then
  4.      (2) Found in an "as is" state, so send cachefile "as is"
  5.      (1) Found in a "partially compiled state", so read the cachefile,
  6.          and do ssi's on it (not on thefile)
  7.      (0) Not in cache, do ssi's on the thefile.
  8.          Possibly save results when done
  9.  
  10.   2) If 1 or 0, then charin thefile into a big string.
  11.       Add headers   right after the  the (first) <BODY> entry.
  12.                add footers to the portion right BEFORE the (last) </BODY> entry.
  13.       Check for existence of include types.
  14.          if include types are found, then process them recursively
  15.  
  16. Returns:
  17.   -1 -- Error when sending (probably a broken connection)
  18.    0 --- no ssi's, or some problem == treat as a non-ssi html file
  19.    1  -- ssi's done, results 'VAR 'ed back.
  20.    2  -- ssi-cached file used "as is"
  21.  
  22. To reset SSi-cache, call as sref_do_ssi('*RESET*',0,privset)
  23. To report on stattus, call as sref_do_ssi('*STATUS*',0,privset)
  24. In both cases, privset MUST contain SUPERUSER  
  25.  
  26. */
  27. /* ----------------------------------------------------------------------- */
  28. /* gotit=sref_do_ssi(tfile,usef,sel0,awords,seloriginal,privset,enmadd, ,
  29.                    DIRLIST,verbose,transaction,tempfile,key_preface,,
  30.                    servername,host_nickname,home_name, ,
  31.                    no_processing||' '||no_interpret_code||' '||force_norecord||' '||is_owner_suppress,
  32.                    myqueue' 'mysem' 'basesem,who,forceit)
  33. */
  34.  
  35.  
  36. sref_do_ssi:
  37.  
  38.  parse arg afile,usef,urlnew,awords,seloriginal,privset,enmadd,,
  39.    DIRLIST,VERBOSE,TRANSACTION,TEMPFILE,KEY_PREFACE,,
  40.    ss1,home_name,nopes,qstuff,WHO2,forceit,adv_opts
  41.  
  42. signal on syntax name ssierr ; signal on error name ssierr
  43.  
  44.  
  45. parse var ss1 servername host_nickname
  46. parse var who2 who clientname0
  47. if clientname0=' ' then clientname0=0
  48.  
  49. PARSE VAR DIRLIST SERVDIR CGI_BIN_DIR DDIR HOMEDIR
  50. parse var qstuff  myqueue mysem  basesem 
  51. parse var nopes no_processing no_interpret_code force_norecord is_owner_suppress
  52. no_processing=strip(no_processing); no_interpret_code=strip(no_interpret_code)
  53. is_owner_suppress=strip(is_owner_suppress)
  54. privset=upper(privset);
  55. os2e='os2environment'
  56. OPTION_hit_line=":: still access # "
  57. PARSE VAR SELORIGINAL DOCNAME '?' .     /* sometimes used */
  58. docname=strip(docname,'l','/')
  59. docname=strip(docname)
  60. sel0=docname
  61. filter_name=sref_version()
  62.  
  63.  crlf='0d0a'x
  64. /* default value for cgi includes */
  65. cgi_inc_errmsg="Error in CGI Include "                                         
  66. cgi_inc_sizefmt="ABBREV"                                                       
  67. cgi_inc_timefmt="%c"
  68. bigin=0
  69. gotdynamics=0
  70. usef=strip(usef)
  71. nocache=1               /* assume no caching */
  72. tdir=strip(get_value('TEMPDATA_DIR'),'t','\')||'\'
  73.  
  74.  
  75. /* set flags using adv_opts */
  76. call set_no_ssis adv_opts
  77.  
  78. /*
  79. do mm=1 to words(ssinos)
  80.   aa='!'||substr(strip(word(ssinos,mm)),5)
  81. end
  82. */
  83.  
  84.  
  85. /* should we check cache? First, see if one is active,
  86. Second, see if in ssi_cache_list */
  87.  
  88. if usef=1 then do             /* use passed string */
  89.       bigin=afile ; afile=action ; nocache=1
  90. end
  91.  
  92. else do               /* read from a file --- PERHAPS FROM CACHE? */
  93.  
  94. /* but, first check if its a clear cache or status call */
  95.  
  96.     astatus=0 ; cacheme=0            /* not now cached, don't cache */
  97.     cache_size=get_value('SSI_CACHE_SIZE')   /* or from cache? */
  98.  
  99.  
  100.    if ABBREV(strip(upper(afile)),'*RESET')=1 then do
  101.       if cache_size=0 then return ' 0 SSI-caching not enabled '
  102.       if wordpos('SUPERUSER',privset)+wordpos('CONTROL',privset)=0 then  return '-1 Not a superuser '
  103.       foo=ssi_queue(afile,tempfile,1)
  104.       'file erase type text/plain name ' tempfile
  105.       return ' 1 SSI-cache reset  '
  106.     end  /* Do */
  107.    if ABBREV(strip(upper(afile)),'*REMOVE')=1 then do
  108.       if cache_size=0 then return ' 0 SSI-caching not enabled '
  109.       if wordpos('SUPERUSER',privset)+wordpos('CONTROL',privset)=0 then  return '-1 Not a superuser '
  110.       foo=ssi_queue(afile,tempfile,1)
  111.       'file erase type text/plain name ' tempfile
  112.       return ' 1 SSI-cache removals '
  113.     end  /* Do */
  114.    if ABBREV(strip(upper(afile)),'*STATUS')=1 then do
  115.       if cache_size=0 then return ' 0 SSI-caching not enabled '
  116.       if wordpos('SUPERUSER',upper(privset))=0 then  return '-1 Not a superuser '
  117.       foo=ssi_queue(afile,tempfile,1)
  118.       'file erase type text/plain name ' tempfile
  119.       return ' 1 SSI-cache status report '
  120.     end  /* Do */
  121.    if strip(upper(afile))='*CLEANUP'then do
  122.       if cache_size=0 then return ' 0 SSI-caching not enabled '
  123.       if wordpos('SUPERUSER',upper(privset))=0 then  return '-1 Not a superuser '
  124.       foo=ssi_queue('*CLEANUP',tempfile,1)
  125.       'file erase type text/plain name ' tempfile
  126.       return ' 1 SSI-cache cleanup report '
  127.     end  /* Do */
  128.  
  129.  
  130.     if cache_size>0 & forceit<>1 & ssino.!NO_CACHE=0 then do       /* is caching ok?*/
  131.         nocache=0
  132.         foo=ssi_queue(afile,,0)                    /* it is, go look it up*/
  133.         parse var foo astatus afile2 ; astatus=strip(astatus); afile2=strip(afile2)
  134.     end                    /* caching okay */
  135.     if astatus=1 then do    /* FROM CACHE AS IS ----------*/
  136.        if stream(afile2,'c','query exists')<>' ' then do
  137.             ysz=dosdir(afile2,'s')
  138.             if adv_opts<>' ' then foo=sref_adv_opts_header(adv_opts,'200 '||ysz,servername)
  139.             'file type text/html nocache NAME  ' afile2  /* tell goserve to send it */
  140.              return (ysz+0.01)           /* ssi-file send from cache */
  141.          end
  142.          else do                /* error in cache */
  143.             call pmprintf_srf(" SSI-cache error 1: no such file= " afile2)
  144.             astatus=0  ; cacheme=0
  145.         end
  146.     end
  147.  
  148.     if astatus=2 then do       /* FROM CACHE WITH CHANGES */
  149.         bigin=sref_grab_file(afile2,30)
  150.         if bigin=0 | bigin="" then do              /*problem opening ! */
  151.             call pmprintf_sref( "SSI cache error 2: file could not be read:" afile2)
  152.             astatus=0
  153.        end
  154.        else do
  155.          if verbose>2 then call pmprintf_sref(" Using partially cached file: " afile2)
  156.        end
  157.     end         /* status 2 */
  158.  
  159.     if astatus=0 then do             /*NOT IN CACHE, OR ERROR IN CACHE */
  160.           bigin=sref_grab_file(afile,30)
  161.           if bigin=0 | bigin="" then do              /*problem opening ! */
  162.              call pmprintf_sref(" ERROR: Could not open file for includes : " afile)
  163.              return 0           /* error, treat as non-ssi html file */
  164.          end
  165.          cacheme=1         /*  1 signals "new entry */
  166.     end
  167. end           /* USEF -- from file, or from passed string (remotely gathered */
  168. usedfile=afile
  169.  
  170. if c2d(right(bigin,1))=26 then
  171.       bigin=left(bigin,length(bigin)-1)
  172.  
  173.  
  174. tbigin=translate(bigin)
  175.  
  176. inctype.1="INTERPRET"
  177.  inctype.2="OPTION"
  178.  inctype.3="INCLUDE"
  179.  inctype.4="REPLACE"
  180.  inctype.5="SELECT"
  181.  inctype.6='#'
  182.  inctype.7='CACHE'
  183.  i5=7
  184.  
  185. if key_preface<>" "  & key_preface<>0 then do
  186.         do mm=1 to 5
  187.            inctype.mm=key_preface||inctype.mm
  188.         end
  189.         inctype.7=key_preface||inctype.7
  190. end
  191.  
  192. apre=1 ;  apost=1
  193.  headers=get_value('HEADERS')
  194.  footers=get_value('FOOTERS')
  195.  if headers=0 then headers=" "
  196.  if footers=0 then footers=" "
  197.  if headers=" " then apre=0
  198.  if footers=" " then apost=0
  199.  
  200. /* note that j.i may or may not be in a keyphrase! */
  201. booger=apre+apost
  202. do mm=1 to i5
  203.     if booger>0 then leave
  204.     booger=booger+pos(inctype.mm,tbigin)
  205. end
  206.  
  207. /* NO include keyphrases -- so send it (note we could use a VAR with bigin,
  208.  but this complicates caching and generates an expires inappropriately) */
  209. if booger = 0 then  do  
  210.       return 0
  211. end
  212.  
  213.  
  214. interpret_file=value(enmadd||'INTERPRET_FILE',,os2e)
  215. counter_file=value(enmadd||'COUNTER_FILE',,os2e)
  216. optlist.0= make_optlist(awords)   /* used by options keyphrase */
  217. interp_data=""
  218. current_hit.num=0      /* 0 means not counted yet */
  219. current_hit.item=""
  220. current_hit.mess1=""
  221. current_hit.mess2=""
  222. cache_args=' '
  223. force_asis=0            /* set by cache asis */
  224. check_initfilt=0 ; check_repstrgs=0
  225. include_list=' ' ; notrigger=0
  226.  
  227.  
  228.  
  229. /* add pre or post blocks if they have been specified (typically in initfilt) */
  230.  if apre=1 & astatus=0  & ssino.!no_header=0 then do
  231.      foo=upper(space(strip(headers),0))
  232.      idog=1
  233.      if abbrev(foo,'<BODY')=1 then idog=2
  234.      bigin=sref_insert_block(bigin,'BODY',headers,idog,'<','>')
  235.  end
  236.  if apost=1  & astatus=0 & ssino.!no_footer=0 then do
  237.       bigin=bigf_footer(footers)
  238.  end
  239.  
  240.  delims=get_value('DELIMS')
  241.  do_send_piece=get_value('DO_SEND_PIECE')
  242.  fix_expire=get_value('FIX_EXPIRE')
  243.  
  244.  if delims>1 then nocache=1     /* avoid trouble: only cache if one delimiter set */
  245.  
  246.  dynamics.0=0           /* dynamic caches, need for ssi-cache constructin */
  247.  pass1=0     /* number of passes through data */
  248.  
  249. /* check for "send in pieces "  --no fix_expire,  no 2nd delimiter, no advanced opts */
  250. if delims=1  & nocache=1 &  fix_expire=0  & do_Send_piece=1 & adv_opts="" then
  251.    send_piece=1
  252. else
  253.   send_piece=0
  254.  
  255.  
  256.  if send_piece=1 then do
  257.           'SET NETBUFFER OFF '
  258.           'SEND TYPE text/html as ' afile
  259.  end
  260.  
  261. /* now start processing  bigin */
  262. nsubs=0                 /* # of substitutions encountered */
  263. totinc=0 ; badints=0  ; goodints=0
  264.  
  265. /* For flexibility, we process this for each set of "keyphrase delimiters",
  266. where set k=1..K is defined using delim_1.k and delim_2.k (typically set
  267. in initfilt) */
  268.  
  269. do mm=1 to delims
  270.   delim_1.mm=get_value('DELIM_1.'mm)
  271.   delim_2.mm=get_value('DELIM_2.'mm)
  272. end
  273.  
  274. ithdelim=1
  275. adelim1=delim_1.1
  276. adelim2=delim_2.1
  277.  
  278. if adelim1="" | adelim2="" | adelim1=0 | adelim2=0 then return 0  /* bad initial delimiter -- don't do includes */
  279.  
  280. one_more_scan:          /* jump here for multiple delimiters sets */
  281. outbig=''
  282. found_a_select=0
  283.  
  284. do forever                      /* done when done */
  285.    parse var bigin t1 (adelim1) in1 (adelim2) bigin
  286.  
  287.    if send_piece=1 & t1<>"" then do
  288.      'VAR NAME T1 '
  289.      if rc<0 then do
  290.          'send complete'
  291.          return -1
  292.       end
  293.    end
  294.    else do
  295.       outbig=outbig||t1
  296.    end
  297.  
  298.    if in1="" & bigin="" then leave
  299.  
  300. /* see if in1 is one of the inctypes (inctypes are aka keywords)*/
  301.   in2=translate(in1)
  302.   in2=translate(in2,' ','=:;')    /* space is the generic seperater */
  303.  
  304.   aninc=0 ; 
  305.                   /*  is first one of our keywords ? */
  306.   do mm=1 to i5
  307.      if abbrev(word(in2,1),inctype.mm)=1 then  do     /* it's the mm'th inc type */
  308.         aninc=mm
  309.         if mm>1 & mm<5 then do  /* option include replace */
  310.            thearg=word(in2,2)
  311.         end
  312.         else do
  313.            if mm=1 then do
  314.               foo=pos('INTERPRET',translate(in1))
  315.               thearg=substr(in1,foo+9)
  316.           end
  317.           if mm=6 then do
  318.               foo=pos('#',translate(in1))
  319.               thearg=substr(in1,foo+1)
  320.            end
  321.            if mm=5 then do
  322.               foo=pos('SELECT',translate(in1))
  323.               thearg=substr(in1,foo+6)
  324.            end
  325.            if mm=7 then do
  326.               foo=pos('CACHE',translate(in1))
  327.               thearg=substr(in1,foo+5)
  328.            end
  329.         end
  330.         leave                /* leave this lttle loop */
  331.      end
  332.   end
  333.  
  334. /* Not a keyword, or a syntactically bad keyphrase    */
  335.  if aninc=0  then do
  336.        if bigin<>"" then
  337.             t1=adelim1||in1||adelim2  /* leave it be */
  338.        else
  339.             t1=adelim1||in1  /* openended "comment" */
  340.       if send_piece=1 then do
  341.          'VAR NAME T1'
  342.          if rc<0 then do 
  343.                 'send complete'
  344.                  return -1
  345.           end
  346.        end
  347.       else
  348.            outbig=outbig||t1
  349.       iterate
  350.   end
  351.  
  352.  
  353. /* ------- DO SOME WORK (if here, we have a (possibly) good keyphrase) */
  354.    nsubs=nsubs+1
  355.    asis_ok=1       /* assume non- "dynamic" include */
  356.    got_select=0   /* is a SELECT */
  357.  
  358.    select
  359.  
  360.      when aninc=6  then do               /* NCSA stuff */
  361.            putme=do_cgi_include(thearg)
  362.           if completed() then  return extract('bytessent')  /* might happen */
  363.      end
  364.  
  365.      when aninc=1 & no_processing=0 & ssino.!NO_INTERPRET=0 then do     /* INTERPRET */
  366.         asis_ok=0                       /* too dynamic, don't try to cache */
  367.         putme=line_interpret(thearg,no_interpret_code)
  368.         if completed() then  return extract('bytessent')  /* might happen */
  369.           if putme="" then
  370.               badints=badints+1
  371.           else
  372.               goodints=goodints+1
  373.      end
  374.  
  375.      when  aninc=2 & ssino.!NO_OPTION=0 then do              /* OPTION */
  376.          asis_ok=0                       /* too dynamic, don't try to cache */
  377.          putme=line_message(thearg)
  378.      end
  379.  
  380.      when aninc=3 & ssino.!NO_INCLUDE=0 then do               /* INCLUDE */
  381.          putme=line_include(thearg)
  382.          if putme<>"" then
  383.              totinc=length(putme)+totinc
  384.      end
  385.  
  386.      when aninc=4 & ssino.!NO_REPLACE=0 then do               /* REPLACE */
  387.           putme=line_replace(thearg)
  388.      end
  389.  
  390.      when aninc=7 then do                /* CACHE directive. Store for later */
  391.        if nocache=0 then do        /* ignore if nocache is on */
  392.           if wordpos('NO',upper(thearg))| wordpos('OFF',upper(thearg)) >0 then do
  393.              nocache=1
  394.              cacheme=0
  395.           end  /* Do */
  396.           if wordpos(strip(upper(thearg)),'ASIS') then force_asis=1
  397.           if wordpos(strip(upper(thearg)),'NOTRIGGER') then notrigger=1
  398.           cache_args=cache_args" "upper(thearg)" ; "  /* other arguments */
  399.        end
  400.        putme=' '          /* it's a directive, so just remove it */
  401.      end
  402.  
  403.      when aninc=5 & no_interpret_code=1 & ssino.!NO_SELECT=0 then do   /* SELECT */
  404.        if verbose>2 then
  405.             call pmprintf_sref(" Unallowed SELECT (using in-document code): " seloriginal)
  406.        putme=""
  407.      end
  408.  
  409.      when aninc=5 & no_processing=0 & no_interpret_code=0  & ssino.!NO_SELECT=0 then do
  410.         asis_ok=0                       /* too dynamic, don't try to cache */
  411.         got_select=1 
  412.  
  413.         if pass1=0 then do              /* SELECT ONLY on 2nd pass */
  414.                 putme=in1; found_a_select=1
  415.         end
  416.         else do                 /* do the SELECT */
  417.            prot1=enmadd ; prot2=host_nickname ; prot3=servername
  418.            prot5=host_nickname
  419.               useit=do_select(thearg)              /* note protected globals */
  420.            enmadd=prot1 ; host_nickname=prot2 ; servername=prot3
  421.            host_nickname=prot5
  422.  
  423.            putme=""
  424.            if useit=0 then do              /* 0=EXCLUDE it ! */
  425.  
  426. /* scan for next SELECT, and delete everything in between */
  427.               bigin=bigin
  428.               putme=""
  429.               do until bigin=""
  430.                   parse var bigin tt1 (adelim1) tt2 (adelim2) bigin
  431.                   if TT2="" & bigin="" then  leave
  432.                   IF translate(word(tt2,1))=inctype.5 then   leave
  433.               end               /* until bigin="" */
  434.            end             /* useit */
  435.         end                        /* pass1=0 */
  436.  
  437.      end                /* WHEN select */
  438.  
  439.      otherwise          /* possibly a suppressed keyphrase */
  440.            putme=""
  441.      end
  442.  
  443. /* strip trailing ctl-z ? */
  444.    if c2d(right(putme,1))=26 then
  445.       putme=left(putme,length(putme)-1)
  446.  
  447.  
  448. /* if it's a dynamic include, and caching is on, then put in a placemarker */
  449.    if pass1=0 & nocache=0 & asis_ok=0  then do  /* use placemarker? */
  450.         il=dynamics.0+1   ;     dynamics.0=il
  451.         dynamics.il=putme       /* the replacmente */
  452.         aputme=adelim1||in1||adelim2  /* leave it be (for later processing */
  453.         dynamics.il.!putme=aputme
  454.         dynamics.il.!gotselect=got_select
  455.         outbig=outbig||aputme    /* don't recurse, you'll be trapped */
  456.    end
  457.    else do
  458.       if got_select=1 then do
  459.           aputme=adelim1||in1||adelim2
  460.           outbig=outbig||aputme    /* don't recurse, you'll be trapped */
  461.        end
  462.        else do
  463.            bigin=putme||bigin   /* this is the recursive part */
  464.        end
  465.    end
  466.  
  467. end                     /*of bigin parse loop */
  468.  
  469. /* if send mode, then all done (note, if send mode, then caching was NOT done */
  470. if send_piece=1 then do
  471.   if totinc>0  | (goodints+badints)>0 then
  472.       if VERBOSE>1 then sall pmprintf_sref(" Includes:  " totinc " ; (good/bad interps ) " goodints "," badints)
  473.    'SEND COMPLETE '
  474.  
  475.   return extract('bytessent')
  476. end
  477.  
  478. /* if caching on, store current state to temporary file
  479.   Note that placeholders are saved */
  480.  
  481. pass1=pass1+1
  482. if dynamics.0>0 then gotdynamics=1  /* dictates if this is a NOCHANGEr */
  483. /* first pass -- then possibly save to cache */
  484. if pass1=1  then do
  485.    /* if force_asis=1, then fix dynamics BEFORE saveing*/
  486.    if force_asis=1  then do
  487.       do jj=1 to dynamics.0
  488.         foo=ssi_replacestrg(jj)
  489.      end
  490.    end
  491.  
  492.    if nocache=0 & cacheme>0 then do
  493.       i80=extract('serverport')
  494.       t2=tdir'_CSH????.'||i80
  495.       savef=dostempname(t2)
  496.       if savef="" then nocache=1  /* error, don't cache */
  497.       foo=charout(savef,outbig,1)
  498.       aa=stream(savef,'c','close')
  499.       if foo<>0 then nocache=1     /* ereror */
  500.    end
  501.  
  502. /* resolve "dynamic" includes?
  503. Check even if nocache=1 (might be stuff from before a cache no keyphrase )*/
  504.   if force_asis=0   then do
  505.      do jj=1 to dynamics.0
  506.         foo=ssi_replacestrg(jj)
  507.      end
  508.   end
  509. end
  510.  
  511. /* might have to do another pass, if dynamic placemarkers were used (or a SELECT ) */
  512. if dynamics.0>0 | found_a_select=1 then do   /* continue recursie processing, after delayed dynamic includes */
  513.    dynamics.0=0         /* when pass1>0, no more dynamics will not be placemarked */
  514.    bigin=outbig
  515.    signal one_more_scan
  516. end  /* Do */
  517.  
  518.  
  519. /* check  for another set of delimiters ? */
  520. ithdelim=ithdelim+1
  521. do until ithdelim>delims
  522.    adelim1=strip(get_value('DELIM_1.'||ithdelim))
  523.    adelim2=strip(get_value('DELIM_2.'||ithdelim))
  524.    if adelim1=' ' | adelim2=' ' | adelim1=0 | adelim2=0 then iterate
  525.    if pos(adelim1,outbig)=0 then do
  526.         ithdelim=ithdelim+1
  527.         iterate
  528.    end
  529.    leave
  530. end
  531. if ithdelim <= delims then do
  532.    bigin=outbig
  533.    signal one_more_scan
  534. end
  535.  
  536.  
  537. /* else, we are done */
  538.  
  539. if c2d(right(outbig,1))=26 then
  540.       outbig=left(outbig,length(outbig)-1)
  541.  
  542.  
  543. ncc2=length(outbig)
  544. if fix_expire>0 then do            /* override goserve response headers */
  545.    foo=sref_expire_response(fix_expire,ncc2)
  546. end
  547.  
  548. if totinc>0  | (goodints+badints)>0 then
  549.    if VERBOSE>1 then call pmprintf_sref(" Includes:  " totinc " ; (good/bad interps ) " goodints "," badints)
  550.  
  551.  
  552. if adv_opts<>' ' then foo=sref_adv_opts_header(adv_opts,'200 '||length(outbig),servername)
  553. saveas=space(afile,0)
  554. oof=min(39,length(saveas))
  555. saveas=right(saveas,oof)
  556. 'var type text/html as ' saveas 'NAME outbig '  /* tell goserve to send it */
  557. retstat=ncc2
  558. if rc<0 then retstat=-1
  559.  
  560.  
  561. /* note: cache_args: NO, then do NOT cache
  562.                      AS IS: then send "as is"
  563.                      TRIGGER: then check this file(s) to be sure that
  564.                               it's up to date
  565. */
  566. returnit:               /* jump here to write cache?, then exit */
  567.  
  568. if nocache=0 &  cacheme>0 then do  /* useing cache, on a not-in-cache file */
  569.    arglist=""
  570.    if check_repstrgs=1 & notrigger=0 then do
  571.         foo=get_value(repstrgs_file)
  572.         include_list=include_list||' '||foo
  573.    end
  574.    if check_initfilt=1 & notrigger=0 then do
  575.        foo=get_value(initfilt_file)
  576.        include_list=include_list||' '||foo
  577.    end
  578. /* notrigger argument is dealt with in ssicache */
  579.    if notrigger=0  &  include_list<>' ' then cache_args=cache_args||' ; TRIGGER '||include_list
  580.    if gotdynamics=0 then cache_args=cache_args||' ; NOCHANGE '   /* all statics */
  581.    foo=ssi_queue(afile,savef||'  '||cache_args,0)
  582.    if verbose>2 then  call pmprintf_sref(" Saved " afile " to ssi cache:" savef  ' (args='cache_args)
  583. end
  584.  
  585. return retstat
  586.  
  587.  
  588. /* -----------procedure---------------------------*/
  589. /* make optlist for use by options keyphrase */
  590.  
  591. make_optlist: procedure expose optlist. verbose servername host_Nickname enmadd privset
  592. parse arg selinfo
  593.   if selinfo=" " then return 0
  594.    eek=0
  595.    if selinfo<>0 then do                /* note we convert url's to regular ascii */
  596.        selinfo=translate(selinfo, ' ', '+'||'090a0d'x)  /* Whitespace, etc. */
  597.        selinfo=packur(selinfo)
  598.  
  599.        do until selinfo = " "
  600.           eek=eek + 1
  601.           parse var selinfo optlist.eek '&' selinfo
  602.        end
  603.  
  604.     end
  605.  
  606.     return eek
  607.  
  608.  
  609.  
  610.  
  611. /* ----------------------------------------------------------- 
  612.  Evaluate a cgi-bin (NSCA HTTPD style server side include 
  613.  ----------------------------------------------------------- */
  614. do_cgi_include:
  615. parse arg thearg
  616.  
  617. parse var thearg atype aval
  618.  
  619.  
  620.  
  621. /* valid atypes:
  622.   INCLUDE = Include a file
  623.   ECHO = "replace" with a cgi-bin variable
  624.   FSIZE= Size of a file
  625.   FLASTMOD = Last modification date of a file
  626.   EXEC = Execute a command file or a cgi-program
  627. */
  628. tatype=strip(translate(atype))
  629.  a1='!NO_#ECHO';a2='!NO_#CONFIG';a3='!NO_#FILESTAT';a4='!NO_#INCLUDE';a5='!NO_#EXEC'
  630.  if (  tatype="ECHO"  & ssino.a1=1)  ,
  631.      | (tatype="CONFIG" & ssino.a2=1)  ,
  632.      | ( (tatype="FSIZE" | tatype="FLASTMOD") & ssino.a3=1)  ,
  633.      | (tatype="INCLUDE" & ssino.a4=1)  ,
  634.      | (tatype="EXEC" & ssino.a5=1) then do
  635.       return " "
  636.  end
  637.  
  638.  
  639. if wordpos(tatype,' INCLUDE FLASTMOD FSIZE ')>0  then do
  640.      parse upper var aval ftype '=' aval
  641.      aval=strip(strip(aval),,'"') ; ftype=strip(ftype) ; figit=0
  642.      if ftype='FILE' then do    /* relative to absolute directory" */
  643.          if usef=1 then do
  644.                 return cgi_inc_errmsg
  645.           end
  646.           adr=filespec('d',afile)
  647.           apt=filespec('p',afile)
  648.           aval=adr||apt||aval
  649.           figit=1
  650.      end
  651.      else do
  652.         nop
  653.      end
  654. end
  655.  
  656.  
  657. if tatype="INCLUDE" then do
  658.         putme=line_include(aval,,figit,1)
  659.         if putme=0 | putme="" then putme=cgi_inc_errmsg
  660.         return putme
  661.   end
  662.  
  663. if (tatype="FSIZE" | tatype="FLASTMOD") then do
  664.  
  665.     cfile=line_include(aval,'YES',figit,1)
  666.     oy=sysfiletree(cfile,'stuff','FT')
  667.     if stuff.0=0 then
  668.          return cgi_inc_errmsg
  669.  
  670.     parse var stuff.1 adate asize .
  671.     parse var adate yy '/' mo '/' dd '/' hh '/' mm '/' ss
  672.     if ss=' ' then ss='00'
  673.    yip=yy||'/'||mo||'/'||dd
  674.     adatef=dateconv(yip,'O','B')
  675.     atimef=hh||':'||mm||':'||ss
  676.  
  677.  
  678.     if tatype="FLASTMOD" then do
  679.        asis_ok=0
  680.        putme=sref_datetime_convert(cgi_inc_timefmt,adatef,atimef)
  681.        return putme
  682.     end
  683.  
  684.     if tatype="FSIZE" then do
  685.         asis_ok=0
  686.         if translate(cgi_inc_sizefmt)="ABBREV" then do
  687.                if asize>=1000000 then
  688.                        return format(asize/1000000,,0)||'M'
  689.                if asize>=1000 then 
  690.                       return format(asize/1000,,0)||'K'
  691.         end
  692. /* convert to xxx,yyy,zzz */
  693.        il=length(asize)
  694.        if il>3 then do
  695.            oop=""
  696.            do mm=il to 3 by -3
  697.                tt=substr(asize,mm-2,3)
  698.                if mm=il then
  699.                   oop=tt
  700.                else
  701.                  oop=tt||','||oop
  702.            end /* do */
  703.            if mm<>0 then oop=substr(asize,1,mm)||','||oop
  704.            asize=oop
  705.         end
  706.         return asize    /* not abbrev, or < 1000 */
  707.     end
  708.  
  709. end
  710.  
  711.   if tatype="CONFIG"  then do
  712.       asis_ok=0
  713.       parse var aval t1 '=' t2  ;t1=translate(t1)
  714.       t2a=strip(strip(t2),,'"')
  715.  
  716.       putme=""
  717.       select
  718.         when t1="ERRMSG" then
  719.                 cgi_inc_errmsg=t2a
  720.         when t1="TIMEFMT" then          /* non standard for now */
  721.               cgi_inc_timefmt=t2a
  722.         when t1="SIZEFMT" then
  723.               cgi_inc_sizefmt=translate(t2a)
  724.         otherwise
  725.              putme=cgi_inc_errmsg
  726.       end
  727.       return putme
  728.   end
  729.  
  730.   if tatype="ECHO" then do
  731.       parse var aval foo '=' findme ; findme=translate(findme)
  732.       findme=strip(strip(findme),,'"')
  733.       select
  734.          when findme="DOCUMENT_NAME" then
  735.                 putme=afile
  736.          when findme="DOCUMENT_URI" then do
  737.                asis_ok=0
  738.                 putme=seloriginal
  739.          end
  740.          when findme="DATE_LOCAL" then do
  741.                asis_ok=0
  742.                putme=sref_datetime_convert(cgi_inc_timefmt)
  743.          end
  744.          when findme="DATE_GMT" then do
  745.                asis_ok=0
  746.                putme=sref_new_gmt(,,,1)
  747.                parse var putme adate atime
  748.                putme=sref_datetime_convert(cgi_inc_timefmt,adate,atime)
  749.         end
  750.         when findme="LAST_MODIFIED" then do
  751.             if usef=1 then do
  752.                putme=cgi_inc_errmsg
  753.             end
  754.             else do
  755.                  eek=sysfiletree(translate(afile,'\','/'),gosh,'FT')
  756.                  parse var gosh.1 adate asize .
  757.                  parse var adate yy '/' mo '/' dd '/' hh '/' mm '/' ss
  758.                  if ss=' ' then ss='00'
  759.                  adatef=dateconv(yy||'/'||mo||'/'||dd,'O','B')
  760.                  atimef=hh||':'||mm||':'||ss
  761.                  putme=sref_datetime_convert(cgi_inc_timefmt,adatef,atimef)
  762.                  return putme
  763.             end   /* usef */
  764.         end     /* last modified */
  765.         when findme="SERVER_SOFTWARE" then do
  766.                  putme=server('H')||' '||filter_name
  767.         end
  768.         when findme="SERVER_NAME" then
  769.                 putme=servername
  770.         when findme="GATEWAY_INTERFACE" then
  771.                 putme="CGI/1.1"
  772.         when findme="SERVER_PROTOCOL" then do
  773.                'Extract serverprotocol'
  774.                 putme=serverprotocol
  775.         end
  776.         when findme="SERVER_PORT" Then do
  777.                 'extract serverport'
  778.                 putme=serverport
  779.         end
  780.         when findme="REQUEST_METHOD" then do
  781.                 asis_ok=0
  782.                 'extract clientmethod'
  783.                 putme=clientmethod
  784.         end
  785.         when findme="PATH_INFO" then 
  786.                 putme=" Path_info n.a. "
  787.         when findme="PATH_TRANSLATED" Then
  788.                 putme="Path_translated n.a. "
  789.  
  790.         when findme="SCRIPT_NAME" then do
  791.               asis_ok=0
  792.               putme=sel0
  793.         end
  794.         when findme="QUERY_STRING" then  do
  795.                asis_ok=0
  796.                 putme=awords
  797.         end
  798.         when findme="REMOTE_HOST" then do
  799.             asis_ok=0
  800.             if clientname0=0 then do
  801.                putme=sref_clientname(who,mysem,myqueue,basesem,enmadd,transaction)
  802.                clientname0=putme
  803.             end
  804.             else do
  805.                 putme=clientname0
  806.             end
  807.         end
  808.         when findme="REMOTE_ADDR" then do
  809.                asis_ok=0
  810.                'extract clientaddr'
  811.                 putme=clientaddr
  812.         end
  813.         when findme="AUTH_TYPE" then
  814.                 putme="Basic Access Authentication Scheme"
  815.         when findme="AUTH_NAME" then do
  816.             asis_ok=0
  817.             afield=reqfield('Authorization')
  818.             parse var afield . m64 .              /* get the encoded cookie */
  819.             dec=pack64(m64)                       /* and decode it */
  820.             parse upper var dec putme ':' .      
  821.         end
  822.         when findme="REMOTE_IDENT" then
  823.                 putme="Remote_ident n.a. "
  824.         when findme="CONTENT_TYPE" then
  825.                 putme="Content_type n.a."
  826.         when findme="CONTENT_LENGTH" then
  827.                 putme="Content_length n.a."
  828.         when abbrev(findme,"HTTP_") then do
  829.           asis_ok=0
  830.           if findme="HTTP_ACCEPT" then do
  831.                i = 1
  832.                 _acc = REQFIELD("accept")
  833.                acc = '%'
  834.                ClientAccepts = ''
  835.                do while (acc \= _acc)
  836.                  acc = REQFIELD("accept", i)
  837.                  if (ClientAccepts \= '') then ClientAccepts = ClientAccepts', 'acc
  838.                  else ClientAccepts = acc
  839.                  i = i+1
  840.              end
  841.  
  842.               putme=clientaccepts
  843.           end
  844.           else do
  845.                 parse var findme . '_' findme2
  846.                 putme=reqfield(findme2)
  847.           end
  848.         end
  849.         otherwise
  850.              putme=cgi_inc_errmsg
  851.      end                /* select */
  852.      return putme
  853.   end
  854.  
  855.  
  856.  
  857.  if tatype="EXEC"  then do
  858.       asis_ok=0
  859.       if no_Processing=1 then return ' '  /* do not allow ssps */
  860.        parse var aval foo '=' aval2
  861.       aval2=strip(strip(aval2),,'"')
  862.        aval2='cgi-bin/'||aval2
  863.  
  864.       tempdata_dir=value(enmadd||'TEMPdata_DIR',,os2e)
  865.       cmdfile=dostempname(tempdata_dir||'\f?'||space(right(transaction,6),0)||'.cmd')
  866.       clientname0=sref_clientname(who,mysem,myqueue,basesem,enmadd,transaction)
  867.  
  868.       'extract clientmethod'
  869.       servername=servername
  870.       'extract clientprotocol'
  871.       'extract clientaddr'
  872.       'extract serverport '
  873.       aa=rxqueue('s','SESSION')
  874.       gotit=sref_docgi(cgi_bin_dir,aval2 ,clientmethod, clientname0, filter_name, serverport , ,
  875.         servername, clientprotocol, ddir,clientaddr,tempfile,cmdfile,1, ,
  876.        verbose,enmadd,,,privset)
  877. /* see if a content-type:xxx first line, followed by blank. if so, strip it)*/
  878.         foo=strip(upper(left(gotit,150)))
  879.         if abbrev(foo,'CONTENT-TYPE:') then do
  880.             crlf='0d0a'x
  881.             parse var gotit foo2 (crlf) foo3 (crlf) restx
  882.             if foo3="" then gotit=restx
  883.         end
  884.  
  885.       return gotit
  886.   end           /* not a cgi-bin/mapimage call */
  887.  
  888.  
  889.  
  890.    return cgi_inc_errmsg
  891.  
  892.  
  893.  
  894.  
  895. /* ----------------------------------------------------------- */
  896. /* Evaluate thearg in SELECT keyphrase                          */
  897. /* call as procedure to protect internal variables */
  898. /* ----------------------------------------------------------- */
  899. do_select:procedure expose enmadd host_nickname optlist. privset servername verbose ,
  900.           docname usedfile 
  901.  
  902. parse arg thearg
  903.    result='RESULT' ; results='RESULTS'
  904.    select.result=1
  905.    select.results=-135  /* an arbitrary non 0 / 1 value */
  906.  
  907.    if translate(thearg)="END" then   /* if thearg="END", it's junk */
  908.          return 1
  909.  
  910.    thearg=translate(thearg, ' ', '090a0d'x)
  911. signal off syntax ; signal off error
  912.    signal on syntax  name sele1
  913.    signal on error name sele1
  914.    interpret thearg
  915.    signal off syntax
  916.    signal off error
  917. signal on syntax name ssierr ; signal on error name ssierr
  918.  
  919.    result='RESULT' ; results='RESULTS'
  920.    if select.results <> -135 then   /* aid to sloppy programmers */
  921.         select.result=select.results
  922.    signal sele2
  923.  
  924. sele1:                  /* here on syntax error */
  925.     signal off syntax
  926.     signal off error
  927. signal on syntax name ssierr ; signal on error name ssierr
  928.  
  929.     foo=condition('d')
  930.     call pmprintf_sref(" Error  in SELECT: " foo ;    audit "Error in SELECT: " thearg " : " foo)
  931.     return 1
  932.  
  933. sele2:
  934.     if select.result=1 then return 1
  935.  
  936.     return 0
  937.  
  938.  
  939.  
  940. /* ----------------------------------------------------------------------- */
  941. /* Look for INTERPRET keyphrases
  942. .  Note: Results of these INTERPRET keyphrases, for inclusion in the document,
  943. .        must be stored in the INTERPRET.RESULTS variable.
  944. .
  945. . There are 3 types of code-blocks:
  946. .  1) Included in the keyphrase:  INTERPET  CODE rexx code
  947. .  2) Included in the INTERPET.IN collection of code-blocks: INTERPRET ALABEL
  948. .  3) In it's own file: INTERPET FILE FILENAME.
  949. */
  950. /* ----------------------------------------------------------------------- */
  951.  
  952.  
  953. line_interpret:
  954. parse arg thisarg,no_code
  955.  
  956.  
  957. /* pull block from: { thisarg } block   {nextarg } */
  958.   thisarg=translate(thisarg, ' ','090a0d'x)  /* Whitespace, etc. */
  959.   atype=strip(translate(word(thisarg,1)))
  960.   do koi=1 to 10
  961.         al.koi=' '
  962.   end
  963.  
  964.   select
  965.     when atype='FILE' then do /*file match */
  966.      bfile=strip(word(thisarg,2))
  967.      if words(thisarg)>2 then do  /* extract optional arguments*/
  968.         atmp=subword(thisarg,3)
  969.         koi=0
  970.         do until atmp=""
  971.            koi=koi+1
  972.            parse var atmp aww ',' atmp 
  973.            al.koi=strip(aww)
  974.         end
  975.      end
  976.      addir=get_value('ADDON_DIR')
  977.  
  978.      filename=sref_do_virtual(addir,bfile,enmadd,1,transaction,homedir,host_nickname)
  979.      if filename=0 then do
  980.         thestring=0
  981.       end
  982.       else do
  983.         j0=sref_fileread(filename,'tmp1')
  984.         if tmp1.0=0 then do
  985.              call pmprintf_sref(" SSI error: empty INTERPRET file: "filename "(" thisarg)
  986.              return ' '
  987.         end
  988.         thestring=""
  989.         do j1=1 to j0
  990.            j2=strip(translate(tmp1.j1,' ','000d0a001a'x))
  991.            j3=right(j2,1)
  992.            select
  993.               when j3=";" then
  994.                   thestring=thestring||j2||crlf
  995.               when j3="," then
  996.                    thestring=thestring||left(j2,length(j2)-1)
  997.               otherwise
  998.                  thestring=thestring||j2||" ; "||crlf
  999.             end
  1000.          end
  1001.       end
  1002.    end
  1003.    when atype="CODE" then do
  1004.        if no_code=1 then do
  1005.           if verbose>2 then
  1006.                call pmprintf_sref(" Unallowed attempt at interpreting in-document code: " seloriginal)
  1007.           return " "             /* no interpret code*/
  1008.        end    
  1009.        else do
  1010.           thestring= strip(subword(thisarg,2))
  1011.        end
  1012.    end
  1013.    otherwise do
  1014.       call get_interpret                /* set interp_data global */
  1015.       thestring=strip(sref_extract_block(interp_data,thisarg))
  1016.    end
  1017.   end
  1018.  
  1019.   if thestring="" | thestring=0 then do
  1020.     call pmprintf_sref(" Can not find INTERPRET keyphrase: " thisarg ;    audit " Can not find INTERPRET keyphrase: " thisarg)
  1021.     return ""
  1022.   end
  1023.  
  1024. /* isolate interpret, and feed is arg list - thestring is exposed */
  1025.  prot1=enmadd ; prot2=host_nickname ; prot3=servername ; prot4=docname
  1026.  prot5=host_nickname
  1027.  usesay=get_value('USE_STDOUT')
  1028.     aresu=interpret_phrase(al.1,al.2,al.3,al.4,al.5,al.6,al.7,al.8,al.9,al.10)
  1029.  enmadd=prot1 ; host_nickname=prot2 ; servername=prot3 ; docname=prot4
  1030.         host_nickname=prot5
  1031.  
  1032. /* clean out queue */
  1033.  if usesay=1 then do
  1034.    do while queued()>0
  1035.       pull foo
  1036.    end
  1037.  end
  1038.  return aresu
  1039.  
  1040.  
  1041. /* Interpret a phrase --- protecting other global variables */
  1042. interpret_phrase:procedure expose enmadd host_nickname optlist. privset servername verbose ,
  1043.                 docname usedfile thestring myqueue usesay host_nickname
  1044.  
  1045. /* note that upto 10 args are available to the code block, using standard
  1046. rexx syntax: i.e.; av1=arg(1)  */
  1047.  
  1048.  
  1049.   thestring=translate(thestring, ' ','090a0d'x)  /* Whitespace, etc. */
  1050.   result='RESULT' ; results='RESULTS'
  1051.   interpret.result=""          /* clear any residual value */
  1052.   interpret.results=""         /* for sloppy programmers.... */
  1053.  
  1054.   if usesay=1 then foo=rxqueue('s',myqueue)
  1055.  
  1056. signal off syntax ; signal off error
  1057.   signal on syntax  name doggs ;signal on error name doggs
  1058.  
  1059.   interpret thestring
  1060.   signal off syntax ; signal off error
  1061. signal on syntax name ssierr ; signal on error name ssierr
  1062.  
  1063.   result='RESULT'
  1064.   if interpret.result="" then do     /* help out forgetfull programmers */
  1065.         results='RESULTS'
  1066.         interpret.result=interpret.results
  1067.    end
  1068.  
  1069.    if usesay=1 then do
  1070.      tmpres='';crlf='0d0a'x
  1071.      pigs=queued()
  1072.      do jj=1 to pigs
  1073.         parse pull eek1
  1074.         tmpres=tmpres||eek1||crlf
  1075.      end
  1076.      if tmpres<>'' then interpret.result=interpret.result||crlf||tmpres
  1077.    end
  1078.  
  1079.    return interpret.result
  1080.  
  1081. doggs:                  /* here on syntax error */
  1082.   signal off syntax ; signal off error
  1083. signal on syntax name ssierr ; signal on error name ssierr
  1084.  
  1085.   foo=condition('d')
  1086.   call pmprintf_sref(" Error interpreting: "  thestring )
  1087.    audit "Error interpeting: " left(thestring,30)
  1088.   return ""
  1089.  
  1090.  
  1091.  
  1092. /* ----------------------------------------------------------------------- */
  1093. /*  Look for INCLUDE  keyphrases
  1094. .    If present, pull in lines from INCLUDE file.
  1095. .
  1096. .   Note: INCLUDE files are subject to further processing
  1097. .      -- so BEWARE of recursive TRAPS !
  1098. .  Justfile argument used by CGI_INCLUDE routine
  1099. */
  1100. /* ----------------------------------------------------------------------- */
  1101.  
  1102.  
  1103. line_include:
  1104. parse arg incfil0 , justfile ,absname,nocheck
  1105. justfile=translate(justfile)
  1106.  
  1107.  
  1108.    if absname=1 then do
  1109.       incfile=incfil0
  1110.    end
  1111.    else do
  1112.       incfile=sref_do_virtual(ddir,incfil0,enmadd,1,transaction,homedir,host_nickname)
  1113.    end
  1114.  
  1115.    if justfile="YES" then return(incfile)
  1116.  
  1117. /* recursion check */
  1118.    if (nocheck<>1 ) & ( wordpos(upper(incfile),include_list||' '||upper(afile))>0) then  do
  1119.         if verbose>0 then call pmprintf_sref( " Warning: recursive ssi in "  docname " (can not get " incfile)
  1120.         putme='<!-- Error: recursive SSI of ' incfil0 ' -->'
  1121.        return putme
  1122.    end
  1123.  
  1124.    putme=sref_grab_file(incfile,20)
  1125.    if putme=0 then putme=""
  1126.  
  1127.    include_list=include_list||' '||upper(incfile)
  1128.  
  1129.    return putme
  1130.  
  1131.  
  1132.  
  1133.  
  1134.  
  1135. /* ----------------------------------------------------------------------- */
  1136. /* This will do a OPTION replace on the line.
  1137. Keyphrases of the form <!--OPTION=nnn--> are looked for, the nnn is decoded,
  1138. and optlist.nnn is use to replace the keyphrase (if nnn not specified,
  1139. the keyphrase is removed).
  1140. Note that optlist is construced from elements following a ?xxx&xxx type of
  1141. request string (c
  1142. */
  1143. /* ----------------------------------------------------------------------- */
  1144.  
  1145. line_message:
  1146.  
  1147. parse arg id1
  1148. putme=""
  1149. if datatype(id1)='NUM' then
  1150.    if symbol('optlist.id1')='VAR' then  /* check for a mess up */
  1151.           putme=optlist.id1
  1152.  
  1153. return putme
  1154.  
  1155.  
  1156. /* ----------------------------------------------------------------------- */
  1157. /* This will do a REPLACE: on a line.  The currently supported values are
  1158.         DATE        todays date
  1159.        TIMEGMT     current time (GMT)
  1160.        TIME    current time
  1161.        CREATION    A message on the creation date & time of the file
  1162.        CREATION_DATE Just the creation date
  1163.        CREATION_TIME  Just the creation time (use with CREATION_DATE and your own message)
  1164.        WEBMASTER  The contents of the WEBMASTER parameter
  1165.        REFERER   The referer (from the request header)
  1166.       BROWSER   The requesters browser (from the request header)
  1167.         CLIENTNAME USERNAME   ABC.DDD.GOV type name, or ip address if n.a.
  1168.  
  1169.        INHOUSE.n    n = an integer.  Used for messages to INHOUSE  users only.
  1170.        SUPERUSER.n   n = an integer.  Used for messages to Superusers only
  1171.  
  1172.        HITS         The nth hit for this file (requires looking at Counter_file
  1173.                Also COUNTS, OPTION_HITS.n and OPTION_COUNT.n variants
  1174.        WEBMASTER = Webmaster address
  1175.        SERVERNAME = Name of server (i.e.; WWW.FOO.ORG)
  1176.        SERVER  =    Server software (i.e. GOSERV 2.45)
  1177.        FILTER_NAME = The name of this filter (set at the top of this file)
  1178.  
  1179.        VARIABLE.varname = Extract value of varname from environment
  1180.                 If not in environment, see if a built in variable
  1181.                 (such as SERVERPORT and PRIVSET).
  1182.                 See srefmon.cmd for examples of environment vars.
  1183.  
  1184.        READ_HEAD    Do a READ HEADER VAR PUTME , append <PRE>
  1185.  
  1186.       and ...  Check replacestrg_file (static replacements) if no match from above.
  1187.  
  1188. /* ----------------------------------------------------------------------- */
  1189.  
  1190. */
  1191.  
  1192. line_replace:
  1193.  
  1194. parse arg targ
  1195. parse upper var targ reparg "." repargn   /* parse out VAR.j types of labels */
  1196.  
  1197. issuper=0 ; isin=0;
  1198. if wordpos('SUPERUSER',translate(privset))>0  then
  1199.     issuper=1
  1200. else
  1201.    if wordpos('INHOUSE',translate(privset))>0 then
  1202.        isin=1
  1203.  
  1204.  
  1205.    select
  1206.  
  1207.         when reparg="DATE" | reparg="DATE_LOCAL"  then do
  1208.               putme=date('N')
  1209.              asis_ok=0
  1210.         end
  1211.         when reparg="TIME" | reparg="TIMELOCAL" | reparg="TIME_LOCAL" then do
  1212.               putme=time('C')
  1213.                asis_ok=0
  1214.         end
  1215.         when reparg="TIMEGMT" | reparg="TIME_GMT" then do
  1216. /* Computes GMT time as Wed, 12 Aug 1996 21:18:20 format  */
  1217.               asis_ok=0
  1218.               fii=sref_new_gmt()
  1219.               parse var fii eek ',' d1 d2 d3 t1
  1220.               putme=t1||'  GMT '
  1221.         end
  1222.  
  1223.        when reparg="DATEGMT" | reparg="DATE_GMT" then do
  1224.            asis_ok=0
  1225.            fii=sref_new_gmt()
  1226.            parse var fii eek ',' d1 d2 d3 .
  1227.            putme=d1||' '||d2||' '||d3
  1228.        end
  1229.  
  1230.        when reparg="USERNAME" | reparg="USER" | reparg="USER_NAME" ,
  1231.              | reparg="CLIENTNAME" | reparg='CLIENT'  then do
  1232.           asis_ok=0
  1233.           if clientname0=0 then
  1234.              putme=sref_clientname(who,mysem,myqueue,basesem,enmadd,transaction)
  1235.           else
  1236.              putme=clientname0
  1237.           clientname0=putme
  1238.        end
  1239.        when reparg="FILTER_NAME" | reparg="FILTER_NAME" then
  1240.                 putme=filter_name
  1241.  
  1242.       when reparg="HOME_NAME" | reparg="HOMENAME" then do
  1243.                 putme=home_name
  1244.                 check_initfilt=1
  1245.       end
  1246.  
  1247.        when reparg="CREATION" then do           /* a creation-date-time message */
  1248.             if usef=1 then do
  1249.                  putme='n.a.'
  1250.             end
  1251.             else do
  1252.                eek=sysfiletree(translate(afile,'\','/'),gosh,'F')
  1253.                poop=gosh.1
  1254.                parse var poop adate atime  .
  1255.                adate=dateconv(adate,'u','n')
  1256.                putme =' <em> This document last modified at '||atime||', on '||adate|| '. </em>'
  1257.             end
  1258.         end
  1259.  
  1260.        when reparg="CREATION_DATE" then do       /*just the creation date */
  1261.            if usef=1 then do
  1262.                  putme='n.a.'
  1263.             end
  1264.             else do
  1265.               eek=sysfiletree(translate(afile,'\','/'),gosh,'F')
  1266.               poop=gosh.1
  1267.               parse var poop adate atime .
  1268.               adate=dateconv(adate,'u','n')
  1269.               putme =adate
  1270.            END
  1271.         end
  1272.  
  1273.        when reparg="CREATION_TIME" then do              /* just the creation time */
  1274.            if usef=1 then do
  1275.                  putme='n.a.'
  1276.             end
  1277.             else do
  1278.                eek=sysfiletree(translate(afile,'\','/'),gosh,'F')
  1279.                poop=gosh.1
  1280.                parse var poop adate atime .
  1281.                putme =atime
  1282.             END
  1283.         end
  1284.  
  1285.       when reparg="READ_HEAD" | reparg='HEADER'then do    /* read/display the request header */
  1286.              asis_ok=0
  1287.             'READ HEADER VAR PUTME '
  1288.            putme='<PRE>'||putme||'</pre>'
  1289.       end
  1290.  
  1291.         when (reparg="INHMESS" | reparg="INHOUSE" )&  isin=1 then do
  1292.             asis_ok=0
  1293.              check_initfilt=1
  1294.              putme=get_value('INHOUSE.'||repargn)
  1295.         end
  1296.  
  1297.         when (reparg="SUPMESS" | reparg="SUPERUSER") & issuper=1 then do
  1298.              asis_ok=0
  1299.              check_initfilt=1
  1300.              putme=get_value('SUPERUSER.'||repargn)
  1301.         end
  1302.  
  1303.         when abbrev(reparg,"REFER")=1 then do
  1304.            asis_ok=0
  1305.            putme=reqfield("Referer")
  1306.         end
  1307.         when (reparg="USER-AGENT" | reparg="BROWSER" ) THen do
  1308.            asis_ok=0
  1309.             putme=reqfield("User-Agent")
  1310.         end
  1311.  
  1312.         when (reparg="URL") then do
  1313.                asis_ok=0
  1314.                 servername=servername
  1315.                 'extract serverport'
  1316.                 putme=sref_fix_url(seloriginal,servername,serverport)
  1317.         end
  1318.  
  1319.         when wordpos(reparg,'HIT_FILE HITS_FILE COUNT_FILE COUNTS_FILE')>0 then do
  1320.               asis_ok=0
  1321.               dowordy=0
  1322.               dowordy=abbrev(reparg,"HIT")
  1323.               putme=get_hit(afile,dowordy,1)
  1324.         end
  1325.  
  1326.         when pos("HIT",reparg)+pos("COUNT",reparg) > 0 then do
  1327.            asis_ok=0
  1328.            trymess=pos("OPTION",reparg)
  1329.            dowordy=pos("HIT",reparg)
  1330.            if dowordy>0 then dowordy=1
  1331.            if trymess>0 & symbol('optlist.repargn')='VAR' then do
  1332.                putme=optlist.repargn
  1333.                if dowordy>0 then
  1334.                    putme=OPTION_hit_line||putme    /* use a "message" argument */
  1335.             end
  1336.             else do                      /* get from file (or prior count */
  1337.                if sel0="" then
  1338.                    do1="--DEFAULT--"
  1339.                else
  1340.                   do1=sel0
  1341.                putme=get_hit(do1,dowordy,0)
  1342.             end
  1343.          end
  1344.  
  1345.    when reparg="SERVERNAME" | reparg="SERVER_NAME" then  /* servers ip name */
  1346.           putme=servername       /* servername set at top of filter */
  1347.  
  1348.  when reparg="VARIABLE" then do   /* get a variable defined in this filter program */
  1349.       putme=" "
  1350.       check_initfilt=1
  1351.       check_REPSTRGS=1
  1352.       if repargn<>""  then do
  1353.          if abbrev(repargn,'OWNER')=1 | abbrev(repargn,'INHOUSEIP')=1  | abbrev(repargn,'UNALLOWEDIP')=1 then do
  1354.                 putme='n.a.'   
  1355.          end
  1356.          else do                /* check host_nickhame, and then generic versiosn */
  1357.                putme=value(enmadd||repargn,,os2e)
  1358.          end
  1359.          if putme="" then
  1360.             if  symbol('repargn')="VAR"  then
  1361.                  putme= value(repargn)
  1362.       end
  1363.    end
  1364.    when reparg="SERVER" then
  1365.           putme=server('H')
  1366.  
  1367.    when reparg="WEBMASTER" then     do
  1368.           putme=get_value('WEBMASTER')
  1369.           check_initfilt=1
  1370.    end
  1371.    otherwise do           /* see if in the replacement strings file*/
  1372.              putme=get_value(targ)
  1373.              check_repstrgs=1
  1374.              check_initfilt=1
  1375.    end
  1376.  
  1377.  END    /* select */
  1378.  
  1379. return putme            /* return it */
  1380.  
  1381.  
  1382. /* ----------------------------------------------------------------------- */
  1383. /* GET_HIT: (used by REPLACE HIT and REPLACE HIT_MESS keyphrases)
  1384. .       look in  counter_file for # of hits (augment count or add entry),
  1385. .           Returns a string with containing # of hits.
  1386. .           If make_wordy_flag, uses the message in the counter_file to
  1387. .           make a "wordy" string.
  1388. .           Note that current_hit stem variable is saved/used (if this
  1389. .           is not the first request for this "anaction", we use results
  1390. .           stored in current_hit.xx)
  1391. .           If Do_by_file=1, then it's a file name -- so SUPPRESS
  1392. .           addition of host nickname (otherwise, if a host nickname
  1393. .           is active, look for a host_nickname// to the front of anaction,
  1394. .
  1395. .
  1396. .  usage:  astring=get_hit(anaction,make_wordy_flag,do_by_file)
  1397. .
  1398. */
  1399. /* ----------------------------------------------------------------------- */
  1400.  
  1401. get_hit: procedure expose  counter_file current_hit. verbose servername  host_nickname enmadd , 
  1402.            WHO force_norecord is_owner_suppress myqueue mysem basesem
  1403. parse arg taction , dowordy ,do_by_file
  1404.  
  1405. /*  did we already find out which hit this is ? */
  1406.  if translate(current_hit.item)=upper(taction) then do  /* Must know current_hit */
  1407.           anum=current_hit.num
  1408.           use1=current_hit.mess1
  1409.           use2=current_hit.mess2
  1410.           if dowordy>0 then
  1411.                putme=use1||" "||anum||" "||use2 ;
  1412.           else
  1413.                putme=anum
  1414.           return putme
  1415.    end
  1416.  
  1417. /* is this in hit_cache? if so, skip recording (sort of like above) */
  1418.  if host_nickname="" | do_by_file=1 then
  1419.         tase=taction
  1420.   else
  1421.        tase=host_nickname||'//'||taction
  1422.  
  1423.   stuff=look_hit_cache('L',tase,who,enmadd)
  1424.  
  1425.   if stuff<>' ' then do           /*in the cache */
  1426.     parse var stuff  ict use1 ',' use2
  1427.     if dowordy=0 then do
  1428.          putme=ict
  1429.     end
  1430.     else do
  1431.         if use1=" " & use2=" " then do
  1432.             use1=" # of hits = "
  1433.         end
  1434.         else do
  1435.             use1=STRIP(use1) ; use2= STRIP(use2)
  1436.         end
  1437.         putme=use1||" "||ict||" "||use2
  1438.     end
  1439.  
  1440.     current_hit.num=ict      /* save current hit */
  1441.     current_hit.item=taction
  1442.     current_hit.mess1=use1
  1443.     current_hit.mess2=use2
  1444.  
  1445.     return putme
  1446.  
  1447.   end
  1448.  
  1449. /* if here, not in cache */
  1450.   if stuff=' ' then do         
  1451.      if counter_file=0 then return ""  /* no file? give up */
  1452.  
  1453.  
  1454. /* add to counter file, but check for owner suppression first */
  1455.      if is_owner_suppress=1 | force_norecord=1 then do
  1456.           stuff=sref_lookup_count(counter_file,tase,'NO',0,0)
  1457.  
  1458.      end
  1459.      else do            /* no owner suppression */
  1460.           stuff=sref_lookup_count(counter_file,tase,'ADD',0,0)
  1461.      end
  1462. /* what's the result? */
  1463.      parse var stuff status  stuff
  1464.      if status=0 then stuff=0  /* no file or no entry, assume 0 hits*/
  1465.      parse var stuff  ict use1 ',' use2
  1466.   end
  1467.  
  1468. /* now put into a string if dowordy>0 */
  1469.  if dowordy=0 then
  1470.          putme=ict
  1471.  else do
  1472.      if use1=" " & use2=" " then do
  1473.         use1=" # of hits = "
  1474.      end
  1475.      else do
  1476.           use1=STRIP(use1) ; use2= STRIP(use2)
  1477.      end
  1478.      putme=use1||" "||ict||" "||use2
  1479.  end
  1480.  
  1481.  
  1482.  current_hit.num=ict      /* save current hit */
  1483.  current_hit.item=taction
  1484.  current_hit.mess1=use1
  1485.  current_hit.mess2=use2
  1486.  
  1487.  foo=add_hit_cache('L',tase,who,enmadd,stuff) /* add to hit cache */
  1488.  
  1489.  
  1490.  return putme
  1491.  
  1492. /* --------------------------------------------------- */
  1493. /* Read interpret mini-code-blocks (from file or macrospac */
  1494. /* --------------------------------------------------- */
  1495. get_interpret:
  1496.  
  1497.  
  1498. if interpret_file=" " then return 0
  1499. if interp_data<>"" then return 1
  1500. ause=sref_fileread(interpret_file,'filelines',,'E')
  1501. if filelines.0 =0 then do
  1502.    interp_data=" "
  1503.    return 0
  1504. end
  1505. interp_data=filelines.1
  1506. do mm=2 to filelines.0
  1507.   interp_data=interp_data||crlf||filelines.mm
  1508. end
  1509.  
  1510. return filelines.0
  1511.  
  1512.  
  1513. /* ---------------------- */
  1514. /* insert footers in a large file */
  1515. bigf_footer:procedure expose bigin servername host_nickname enmadd
  1516. parse  arg footers
  1517. iat=length(bigin)
  1518. iaa:
  1519. foo=lastpos('/BODY',translate(bigin),iat)
  1520. if foo=0 then do
  1521.   return bigin
  1522. end /* do */
  1523.  
  1524. foo2=lastpos('<',bigin,foo)
  1525. if foo2=0 then
  1526.    return bigin
  1527.  
  1528. yow=strip(substr(bigin,foo2+1,foo-(1+foo2)))
  1529. if yow=" " then  do
  1530.    return insert(footers,bigin,foo2-1)
  1531.   
  1532. end
  1533.  
  1534. else do
  1535.   iat=foo2
  1536.   signal iaa
  1537. end
  1538.  
  1539. /* ------------------------------------------------------ */
  1540. /* call the ssi cache thread
  1541. returns:
  1542.  0 == no match (or fatal error)
  1543. 1 filename  == use the cache in "filename" as is
  1544. 2 filename  == read filename, and perform more ssi's on it
  1545. */
  1546. /* ------------------------------------------------------*/
  1547. ssi_queue: procedure expose mysem myqueue enmadd basesem  ,
  1548.            transaction host_nickname tdir
  1549. parse arg anfile,cshfile,waitreply
  1550.  
  1551. goober=enmadd||'SSICACHE'
  1552.  
  1553. a=rxqueue('s',goober)
  1554.     queue  transaction ' ' host_nickname ',' myqueue ',' mysem ','   cshfile ',' waitreply ',' anfile
  1555.   a=eventsem_reset(mysem)
  1556.   dothread=basesem||'SSICACHE'
  1557.   a=eventsem_post(dothread)
  1558.  
  1559. if cshfile<>' ' & waitreply<>1  then return 0   /* no return expected */
  1560.  
  1561. /* else, wait for return info (the cached file)... */
  1562.  
  1563.   a=eventsem_wait(mysem)
  1564.  
  1565.   if a<>0 then do
  1566.         call pmprintf_sref(' A Fatal Semaphore failure in SSI_Cache: 'a)
  1567.         return 0
  1568.   end
  1569.   a=rxqueue('s',myqueue)
  1570.  
  1571.   parse pull aline
  1572.  
  1573.   PARSE VAR ALINE idnum ',' aline
  1574.  
  1575.   idnum=strip(translate(idnum,' ','000d0a'x));TRANSACTION=STRIP(TRANSACTION)
  1576.   if idnum<>transaction then  do /*wierd error: got someone else's message, give up */
  1577.       say ' Read odd id from ssi queue :' transaction ',' idnum
  1578.       return 0
  1579.   end
  1580.  
  1581.   aline=strip(aline)
  1582.   return aline
  1583.  
  1584.  
  1585. /********************/
  1586. /* ssi replaces string */
  1587. ssi_replacestrg:procedure expose outbig dynamics.
  1588. parse arg kj
  1589.  
  1590. if dynamics.kj.!gotselect=1 then return 0
  1591.  
  1592. putme=dynamics.kj
  1593. target=dynamics.kj.!putme
  1594.  
  1595. iat=1
  1596. joelen=length(target)
  1597. joelen2=length(putme)
  1598.  
  1599.  joe= pos(translate(target),translate(outbig),iat)
  1600.  if joe=0 then do
  1601.     say " Warning: inconsistency in ssi_replacestrg "
  1602.     return outbig  /* should never happen ! */
  1603.  end
  1604.  
  1605.  outbig=delstr(outbig,joe,joelen)
  1606.  if putme<>' ' then
  1607.     outbig=insert(putme,outbig,joe-1)
  1608.  
  1609.  return 0
  1610.  
  1611.  
  1612. /***********************/
  1613. /* search for ssi suprresion flags. sets globals */
  1614. set_no_ssis:
  1615. parse arg adv
  1616.  
  1617. ssinos='SSI_NO_HEADER SSI_NO_FOOTER SSI_NO_CACHE SSI_NO_INCLUDE SSI_NO_REPLACE '
  1618. ssinos=ssinos||'SSI_NO_INTERPRET SSI_NO_SELECT SSI_NO_OPTION  SSI_NO_#EXEC '
  1619. ssinos=ssinos||' SSI_NO_#FILESTAT SSI_NO_#CONFIG SSI_NO_#ECHO  SSI_NO_#INCLUDE'
  1620. do ifo=1 to words(ssinos)
  1621.    axe='!'||substr(strip(word(ssinos,ifo)),5)
  1622.    ssino.axe=0
  1623. end
  1624.  
  1625. do until adv=""
  1626.   parse upper var adv  aline (crlf) adv
  1627.   aline=word(strip(aline),1)
  1628.   if wordpos(aline,ssinos)>0 then do
  1629.      axe='!'||substr(aline,5)
  1630.      ssino.axe=1
  1631.   end
  1632. end
  1633. return  0
  1634.  
  1635.  
  1636. /* ----------- */
  1637. /* get environment value, possibly host specific */
  1638. /* ------------ */
  1639. get_value: procedure expose enmadd host_nickname transaction
  1640. parse arg vname
  1641.  
  1642. vname=strip(vname) ; hname=strip(host_nickname)
  1643. if hname<>' ' then do
  1644.    aval=value(enmadd||vname||'.'||hname,,'os2environment')
  1645.    if aval<>' ' Then do
  1646.         return aval
  1647.    end
  1648. end
  1649. aval=value(enmadd||vname,,'os2environment')
  1650. return aval
  1651.  
  1652. /******************************/
  1653. /* Add entry to the hit cache*/        
  1654.  
  1655. add_hit_cache:procedure expose myqueue basesem mysem transaction
  1656. parse arg  thetype, theurl0, who , enmadd,stuff
  1657. theurl0=upper(theurl0) ; thetype=upper(thetype)
  1658.  
  1659. nogi=digits()
  1660.  
  1661. lenc=value(enmadd||'HIT_CACHE_LEN',,'OS2ENVIRONMENT')
  1662.  
  1663. if lenc=0 then return ' '               /* suppressed */
  1664.  
  1665. numeric digits 11
  1666. ttc=value(enmadd||'HIT_CACHE_DURATION',,'OS2ENVIRONMENT')
  1667. ttc=ttc/(60*24)
  1668. d1=date('b')
  1669. t1=time('m')/(24*60)
  1670. nowtime=d1+t1
  1671. endtime=nowtime+ttc
  1672. theurl0=translate(theurl0,'/','\')
  1673. moo=lenc||' '||thetype||' '||theurl0||' '||who||' '||endtime||' '||stuff
  1674.  
  1675. if lenc='FILE' then do          /* add to cache file */
  1676.   itis=file_addhitc(moo,nowtime)
  1677.   numeric digits nogi
  1678.   return 0
  1679. end
  1680.  
  1681. /* or use VARSTORE thread  */
  1682. goober=enmadd||'VARSTORE'
  1683. a=rxqueue('s',goober)
  1684.     queue  transaction ' ' host_nickname ',' myqueue ',' mysem ',' 'PUT_HIT, '||moo
  1685. dothread=basesem||'VARSTORE'
  1686. a=eventsem_post(dothread)  /* no return expected */
  1687. return 0
  1688.  
  1689.  
  1690. /* --------------- */
  1691. /* add to the  .stem  file (slower, but perhaps better for huge numbers of hits */
  1692. file_addhitc:procedure expose enmadd 
  1693. parse arg  moo,nowtime
  1694.  
  1695. arf=extract('serverport')
  1696.  
  1697. adir=strip(value(enmadd||'TEMPDATA_DIR',,'os2environment'),'t','\')||'\'
  1698.  
  1699. cfile=adir||'_HITCACH.'||arf
  1700. if stream(cfile,'c','query exists')=' ' then do
  1701.    call pmprintf_sref(" Creating hit-cache file " cfile)
  1702.    eek.1=";The sre-filter hit cache file-- do NOT edit ! "
  1703.    foo=filewrite(cfile,'eek','R',1,1)
  1704.    if foo=0 then do
  1705.         call pmprintf_sref( " Error creating hit-cache file: " cfile)
  1706.         return
  1707.    end
  1708. end
  1709.  
  1710. /* wait for it to be unlocked */
  1711. isnow=time('r')
  1712. do until twait>30
  1713.   twait=time('e')
  1714.   aa=sref_fileread(cfile,'yy',,'E')
  1715.   if aa>=0 then leave
  1716.   ddt=syssleep(0.2)
  1717. end
  1718. if aa<0 then do
  1719.    call pmprintf_sref(" Hit cache file could not be opened for augmentation: " cfile)
  1720.    return ' '
  1721. end
  1722.  
  1723. /* now lock it! We'll clean it up, and add current hit to beginning */
  1724. aa=sref_open_read(cfile,10,'write')
  1725. if aa<0 then do
  1726.    call pmprintf_sref(" Hit cache file could not be opened for augmentation: " cfile)
  1727.    return ' '
  1728. end
  1729.  
  1730.  
  1731. newl.1=moo
  1732. i1=1
  1733. /* remove expired entries */
  1734. do iu=1 to yy.0
  1735.    aline=yy.iu
  1736.    if aline=' ' then iterate
  1737.    if abbrev(strip(aline),';')=1 then do
  1738.        i1=i1+1
  1739.        newl.i1=aline
  1740.        iterate
  1741.     end
  1742.     parse var aline atype aurl aip  aendtime .
  1743.     aendtime=strip(aendtime)
  1744.     if aendtime >= nowtime then do
  1745.         i1=i1+1
  1746.         newl.i1=aline
  1747.     end
  1748.     else do
  1749.     end
  1750.     if i1>10000 then leave   /* prevent too big */
  1751. end
  1752. newl.0=i1
  1753. aa=stream(cfile,'c','close')
  1754. foo=filewrite(cfile,'newl','R',i1,1)
  1755. if foo=0 then
  1756.   call pmprintf_sref( " Could not augment&update hit-cache file ")
  1757. return ' '              
  1758.  
  1759.  
  1760. /*****************************/
  1761. /* see if url is in the  "hit cache"  */
  1762. look_hit_cache:procedure expose basesem mysem myqueue transaction
  1763. parse upper arg thetype, theurl, who , enmadd
  1764.  
  1765. theurl=translate(theurl,'/','\')
  1766.  
  1767. lenc=value(enmadd||'HIT_CACHE_LEN',,'OS2ENVIRONMENT')
  1768. if lenc=0 then return ' '               /* suppresed */
  1769.  
  1770. nogi=digits()
  1771.  
  1772. numeric digits 12
  1773. d1=date('b')
  1774. t1=time('m')/(24*60)
  1775. nowtime=d1+t1
  1776.  
  1777. if lenc='FILE' then do
  1778.   itis=file_lenhitc(thetype,theurl,who,enmadd,nowtime)
  1779.    numeric digits nogi
  1780.   return itis
  1781. end
  1782.  
  1783.  
  1784. /* here to read from VARSTORE thread */
  1785. /* or use VARSTORE thread  */
  1786. goober=enmadd||'VARSTORE'
  1787. moo=thetype||' '||who||' '||theurl
  1788. a=eventsem_reset(mysem)
  1789. a=rxqueue('s',goober)
  1790.     queue  transaction ' ' host_nickname ',' myqueue ',' mysem ',' 'GET_HIT, '||moo
  1791. dothread=basesem||'VARSTORE'
  1792. a=eventsem_post(dothread)  
  1793.  
  1794. a=eventsem_wait(mysem) /* wait for answer */
  1795.  
  1796. if a<>0 then do
  1797.    call pmprintf_sref(' A Fatal Semaphore failure in Look_hit_cache: 'a)
  1798.    return ' '
  1799. end
  1800. a=rxqueue('s',myqueue)
  1801. parse pull aline
  1802.  
  1803. PARSE VAR ALINE idnum ',' aline
  1804.  
  1805. idnum=strip(translate(idnum,' ','000d0a'x));TRANSACTION=STRIP(TRANSACTION)
  1806. if idnum<>transaction then  do /*wierd error: got someone else's message, give up */
  1807.       say ' Read odd id from VARSTORE queue :' transaction ',' idnum
  1808.       return ' '
  1809. end
  1810. return strip(aline)
  1811.  
  1812.  
  1813. /* --------------- */
  1814. /* read from cachelist from an .idx file,, slower but perhaps better for huge number of hits */
  1815.  
  1816. file_lenhitc:procedure 
  1817. parse arg thetype,theurl,who,enmadd,nowtime
  1818.  
  1819. arf=extract('serverport')
  1820. adir=strip(value(enmadd||'TEMPDATA_DIR',,'os2environment'),'t','\')||'\'
  1821. theurl=strip(translate(theurl,'/','\'))
  1822.  
  1823. cfile=adir||'_HITCACH.'||arf
  1824. if stream(cfile,'c','query exists')=' ' then do
  1825.    call pmprintf_sref("  No hit cache file " cfile)
  1826.    return ' '
  1827. end
  1828.  
  1829. /* wait for it to be unlocked */
  1830. isnow=time('r')
  1831. do until twait>30
  1832.   twait=time('e')
  1833.   aa=sref_fileread(cfile,'yy')
  1834.   if aa>=0 then leave
  1835.   ddt=syssleep(0.2)
  1836. end
  1837. if aa<0 then do
  1838.    call pmprintf_sref(" Hit cache file could not be opened: " cfile)
  1839.    return ' '
  1840. end
  1841.  
  1842. /* see if a match exists */
  1843. do iu=1 to aa
  1844.    aline=yy.iu
  1845.    if aline=' ' then iterate
  1846.    if abbrev(strip(aline),';')=1 then iterate
  1847.     parse var aline atype aurl aip  aendtime stuff
  1848.     atype=strip(atype) ; aurl=strip(aurl) ; aip=strip(aip)
  1849.     aendtime=strip(aendtime)
  1850.    if theurl<>aurl | aip<>who | atype<>thetype then iterate
  1851.    if aendtime >= nowtime then do
  1852.         return stuff
  1853.    end
  1854. end
  1855. return ' '              /* no match */
  1856.  
  1857.  
  1858.  
  1859. ssierr:  /* jump here on generic error */
  1860. IF RC=-7 | rc=-6 THEN return -1  /* if just  a closed connection ,then no error messages */
  1861. call pmprintf_sref(' Error in SSI procedure at line: 'sigl)
  1862. 'AUDIT Error in SSI procedure at line: ' sigl
  1863. return -2               /* error occured */
  1864.  
  1865.  
  1866.