home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Spezial / SPEZIAL2_97.zip / SPEZIAL2_97.iso / ANWEND / ONLINE / SREFPRC1 / READSTAT.SRF < prev    next >
Text File  |  1996-11-20  |  6KB  |  206 lines

  1. /* return state info
  2.  
  3. SREF_READ_STATE: Get info on this request from a "temporary" file
  4.    !! Requires that the save_state variable be set equal to 1  !!
  5.  
  6. Syntax:
  7.  
  8.   info=sref_read_state(state_var,occurence,thread,usefile)
  9.  
  10. Where:
  11.  
  12.  i) state_var: a variable to extract information about
  13.     state_var  can be one of the "internal" variables:
  14.         SEL = The selector (i.e.;  DIR1/FOOBAR.HTM )
  15.         REQUEST = The full request string (i.e.; GET /DIR1/FOOBAR.HTM HTTP/1.0
  16.         SOURCE  = The source/destination of the request
  17.                      (i.e.; 209.121.65.122 80 2 154.33.123.55 1251)
  18.           CLIENT = The "client's numeric IP address" (extracted from source)
  19.           CLIENT_PORT = The client's port
  20.           CLIENT_NAME = The "clients name " (uses CLIENT address)
  21.           SERVER = The "server's numeric IP address (extracted from source)
  22.           SERVER_PORT = The server's port (extracted from source)
  23.           TRANSACTION = The transaction number
  24.         SERVER_NAME = IP name of server (the value of the servername() function)
  25.         THREAD =  Thread id of this request
  26.         DATE_TIME   = Time , date , and "julian date" of this request
  27.                     (i.e.; 21:07:11,13 Nov 1996, 728975.879861)
  28.  
  29.      or it can be  one of the "request header" variables, such as:
  30.           ACCEPT, REFERER,  USER-AGENT, AUTHORIZATION, HOST, 
  31.           RANGE, MAINTAIN-CONNECTION, etc.
  32.  
  33.      or a value set by a call to SREF_WRITE_STATE
  34.  
  35.      Note that extracting one of the "header" variables will yield the
  36.      same result as the equivalent "Reqfield" GoServe function -- 
  37.           EXCEPT THAT POST-FILTER ACTIONS CAN NOT CALL GOSERVE FUNCTIONS!
  38.      So... you should use sref_read_state (along with a save_state=1
  39.      entry in SREFILTR.80) to obtain these variables "after GoServe has
  40.      responded to a request".
  41.  
  42.      Also note that case does not matter, and you can optionally add a
  43.      colon after the state_var (i.e.; SEL, sel:, and Sel are equivalent)
  44.  
  45.  ii)  occurence (optional)
  46.  
  47.      Useful if a "header" variable which may occur more then once is
  48.      desired.  If occurence>1, then return the "occurence" instance
  49.      of state_var (if occurence is greater then the number of instance,
  50.      return a blank). If occurence=0, return number of instances
  51.      (0 if there are none). If occurence is not specified, return the
  52.      first instance.
  53.  
  54.  iii) thread (optional)
  55.  
  56.      thread-id to look up state information for.  If not specified,
  57.      use the "own" thread.  Note that information on whether the
  58.      thread is "still alive" is NOT returned (that is, this may be
  59.      left over from a much earlier request).
  60.  
  61.  iv) Usefile (optional)
  62.      If given, the usefile should contain the absolute file name
  63.      of the cache file (the thread is NOT used if usefile is given).
  64.      Post-filter routines MUST supply a usefile when calling
  65.      sref_read_state (since the thread is dead!)
  66.  
  67. Notes:
  68.    * If no state_var is specified, a list of current "variables"
  69.      is returned (with repeated variables repeated).
  70.    * If no information has been saved (either because save_date<>1, or
  71.      because you've requested information on  a thread that was never
  72.      used, or because you asked for a variable that has not been created
  73.      for this thread); an empty string is returned.
  74.  
  75. */
  76. sref_read_state:
  77.  
  78. crlf='0d0a'x
  79.  
  80. parse arg state_var,nth,athread,usefile
  81.  
  82. usefile=strip(usefile)
  83. athread=strip(athread)
  84. if nth="" then nth=1
  85. if datatype(nth)<>'NUM' then nth=1
  86. state_var=strip(upper(strip(state_var)),'t',':')
  87.  
  88. fooport=extract('serverport')
  89. enmadd='SREF_'||fooport||'_'
  90. ard=value(enmadd||'TEMPDATA_DIR',,'os2environment')
  91. ard=strip(ard,'t','\')||'\'
  92.  
  93. if athread="" then 
  94.   mytid=dostid()
  95. else 
  96.    mytid=athread
  97.  
  98. if usefile=' ' then
  99.    getfil=ard||'_T'||mytid||'.'||fooport
  100. else
  101.    getfil=usefile
  102.  
  103. aa=stream(getfil,'c','query exists')
  104.  
  105. if aa="" then return ' '
  106.  
  107. wow=cvread(getfil,dastuff)
  108.  
  109. if wow=0 then do
  110.  return ' '
  111. end
  112.  
  113. /* check creation date */
  114. wow2=digits()
  115. numeric digits 12
  116. d1=date('b')
  117. t1=time('m')/(24*60)
  118. nowtime=d1+t1
  119.  
  120. eek1=dastuff.date_time
  121. parse var eek1  foo ',' foo2 ',' thentime; thentime=strip(thentime)
  122. mother=extract('LIMITTIMETOTAL')
  123. maxtime=thentime+(mother/(24*60*60))
  124. if maxtime<nowtime then  do
  125.    numeric digits wow2
  126.    return ' '    /* too old! */
  127. end
  128. numeric digits wow2
  129.  
  130.  
  131. /* is it one of the non-headers */
  132.  
  133. nonh="SEL REQUEST SOURCE THREAD DATE_TIME SERVER_NAME "
  134. if wordpos(state_var,nonh)>0 then return dastuff.state_var
  135.  
  136. nonh2="CLIENT CLIENT_NAME CLIENT_PORT SERVER  SERVER_PORT TRANSACTION  "
  137. isnonh2=wordpos(state_var,nonh2)
  138.  
  139.  
  140. if isnonh2>0 then do
  141.    yeep='SOURCE'
  142.    gotval=dastuff.yeep
  143.    parse var gotval aserver aport atrans  awho awhoport .
  144.    if state_var='SERVER' then return aserver
  145.    if state_var='SERVER_PORT' then return aport
  146.    if state_var='CLIENT' then return awho
  147.    if state_var='CLIENT_PORT' then return awhoport
  148.    if state_var='TRANSACTION' then return atrans
  149.    if state_var='CLIENT_NAME' then do
  150.           astat=sockgethostbyaddr(awho,'mstuff.!')
  151.           if astat=1  then 
  152.              name1=strip(upper(mstuff.!name))
  153.           else
  154.              name1=awho
  155.           return name1
  156.    end
  157. end
  158.  
  159. /* check in the request header list */
  160.  
  161. ith=0
  162. namelist=" "
  163. stuff=dastuff.!FUNGUS
  164. do until stuff=""
  165.   parse var stuff  a1 (crlf) stuff
  166.   parse var a1 aname ':' avalue ; aname=strip(upper(aname)); avalue=strip(avalue)
  167.   ith=ith+1
  168.   namelist=namelist||' '||aname
  169.   alist.ith.yname=upper(aname)
  170.   alist.ith.yvalue=avalue
  171. end
  172.  
  173.  
  174. /* if state_var, return list of variables (including header variables) */
  175.  
  176. if state_var=' ' then do
  177.    oo=cvtails(dastuff,alist22)
  178.    arf=" "
  179.    do mmm=1 to oo
  180.        if abbrev(alist22.mmm,'!')=1 then iterate
  181.        arf=arf||' '||alist22.mmm
  182.    end
  183.    return nonh||nonh2||namelist||arf
  184. end
  185.  
  186.  
  187. ict=0
  188. gotval=' '
  189. do jj=1 to ith
  190.    if alist.jj.yname<>state_var then iterate
  191.    ict=ict+1
  192.    if ict=nth then return  alist.jj.yvalue
  193. end
  194. if nth=0 & ict>0 then return ict
  195.  
  196. /* is it one of the user written variables */
  197. if symbol('DASTUFF.'||state_var)<>'VAR' then
  198.         return ' '
  199. else
  200.    return dastuff.state_var
  201.  
  202.  
  203.  
  204.  
  205.  
  206.