home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Spezial / SPEZIAL2_97.zip / SPEZIAL2_97.iso / ANWEND / ONLINE / SREFPRC1 / GETREMOT.SRF < prev    next >
Text File  |  1997-07-23  |  3KB  |  105 lines

  1. /* --------- */
  2. /* get a remote url, return 0 if can't get, or content/type crlf body */
  3. /* note that redirection is automatically taken care of here, perhaps
  4. even multiple redirections */
  5.  
  6. sref_get_remote: 
  7. parse arg theurl,verbose,UPWD
  8. /* This  requires that the RxSock.DLL be in your LIBPATH (it is */
  9. /* usually in your \TCPIP\DLL directory.  It was shipped with the      */
  10. /* August 1994 CSD for the TCP/IP base (UN64092).                      */
  11.  
  12.  
  13. if RxFuncQuery("SockLoadFuncs") then do      /* already there */
  14.   call RxFuncAdd "SockLoadFuncs","rxSock","SockLoadFuncs"
  15.   call SockLoadFuncs
  16. end
  17.  
  18. crlf    ='0d0a'x                        /* constants */
  19. family  ='AF_INET'
  20. httpport=80
  21.  
  22. /* parse out server, port, and request from theurl */
  23. if abbrev(upper(theurl),'HTTP://')=0 then do
  24.   say " improper call to get_Remote "
  25.   return 0
  26. end
  27.  
  28. hop0:           /* hop here if 301 or 302 */
  29.  
  30. theurl=delstr(theurl,1,7)
  31. ii=pos('/',theurl)
  32. if ii=0 then do
  33.    server=theurl
  34.    request=' '
  35. end
  36. else do
  37.    server=substr(theurl,1,ii-1)
  38.    request=substr(theurl,ii+1)
  39. end
  40.  
  41. icc=pos(':',server)
  42. if icc>0 then do
  43.    httpport=substr(server,icc+1)
  44.    server=substr(server,1,icc-1)
  45. end
  46.  
  47.  
  48. rc=sockgethostbyname(server, "serv.0")  /* get dotaddress of server */
  49. if rc=0 then do; call pmprintf_sref('Unable to resolve "'server'"'); return 0; end
  50. dotserver=serv.0addr                    /* .. */
  51. gosaddr.0family=family                  /* set up address */
  52. gosaddr.0port  =httpport
  53. gosaddr.0addr  =dotserver
  54.  
  55. gosock = SockSocket(family, "SOCK_STREAM", "IPPROTO_TCP")
  56.  
  57.  
  58. message='GET /'request' HTTP/1.0'crlf
  59. IF UPWD<>' ' THEN 
  60.   message=message||'Authorization: Basic '||upwd||crlf
  61. message=message||crlf
  62. got=''
  63. rc = SockConnect(gosock,"gosaddr.0")
  64. if rc<0 then do; call pmprintf_sref('Unable to connect to "'server'"' rc); return 0; end
  65. rc = SockSend(gosock, message)
  66. /* Now wait for the response */
  67. do r=1 by 1
  68.   rc = SockRecv(gosock, "response", 1000)
  69.   got=got||response
  70.   if rc<=0 then leave
  71.   end r
  72. rc = SockClose(gosock)
  73. /* 200 = gotit, 301 or 302 = moved, otherwise couldn't find file */
  74. parse var got oof status .
  75. status=strip(status)
  76. select
  77.   when status=301 | status=302 then do
  78.       foo=pos('LOCATION:',upper(got))
  79.       if foo=0 then
  80.             return 0
  81.        foo2=pos(crlf,got,foo)
  82.        theurl=strip(substr(got,foo+9,foo2-(foo+9)))
  83.        call pmprintf_sref(" moved to  " theurl)
  84.        signal hop0
  85.    end
  86.    when status<>200 then do
  87.         if VERBOSE>0 then call pmprintF_sref(" Unable to obtain remote URL: " status)
  88.         return 0
  89.    end
  90.    otherwise
  91.         nop
  92. end
  93.  
  94. /* extract header and body */
  95. findit=crlf||crlf
  96. foo=pos(findit,got)
  97. ahead=substr(got,1,foo)
  98. abody=substr(got,foo+length(findit))
  99. al=length(abody)
  100. parse upper var ahead  ee 'CONTENT-TYPE:' atype (crlf) .
  101. atype=lower(strip(atype))
  102. return atype||crlf||abody
  103.  
  104.  
  105.