andu
Mon, 11 Sep 2000 16:58:11 -0700
> >Hi > >I've been playing with the sockets features in order to try and >implement some client side http. I've been doing this because >Metacard's built-in http support won't work with some URLs (something >to do with the way aliasing is set up on the server, I think). > >The script below is a crude first attempt at this. It simply loads >the data from the specified URL. (I've removed some stuff that was >specific to my situation.) So far, it seems to work, even with >previously unreachable URLs. Ideally, I'd like to be able to emulate >the built-in http features of Metacard, but using sockets. (I've also >had a go at the POST method, and it seems to work, but I need to make >a more general solution than what I've done so far.) > >The scripts may be useful to anyone else wanting to do the same >thing. More importantly, I'd appreciate any feedback from the sockets >gurus about whether I'm going in the right direction. > >Two questions foremost on my mind: > >In order to show progress of the download (progress bar or whatever), >is it necessary to do reads in short steps (as in the script below) >or is there another way? That's the way but when you get data it comes in chunks anyway. Use repeat only if you have to. > >How to handle http proxies? Is this just a question of opening the >socket to the proxy and carrying on as before, or is it, as I fear, >more torturous? Yes, take a look at my ftp client (http://www.cloud9.net/~undo) which handles proxy, it should be the same. It also shows you how I handled the progress bar and others. > >Any comments appreciated. > >Cheers >Dave Cragg > >--------------------------------------------------------------- >local lcSocket, lcPath, lcData, lcHeader > >on httpLoad pURL > ## remove initial "http://" if present > if "http://" is char 1 to 7 of pURL then > delete char 1 to 7 of pURL > end if > put offset("/",pURL) into tOff > if tOff = 0 then > put pURL into lcSocket > put "" into lcPath > else > put char 1 to (tOff - 1) of pURL into lcSocket > put char tOff to -1 of pURL into lcPath > end if > > put numToChar(13) & numToChar(10) into CRLF CRLF is built in you don't need to do the above. > > open socket to lcSocket > > put "GET" && lcPath && "HTTP/1.1" & CRLF into tString > put "host:" & lcSocket & CRLF after tString > put CRLF after tString ## blank line is necessary Put an empty space between header item and value = host: host.com > > write tString to socket lcSocket > read from socket lcSocket until CRLF ##line 1 > if word 2 of it = 200 then > read from socket lcSocket until CRLF & CRLF ##get the header > put it into lcHeader > get lineOffset("Content-Length", lcHeader) > if it <> 0 then > put it into tLineNum > put word 2 line tLineNum of lcHeader into tLength > put 1024 into tStep > end if > put empty into lcData > put 0 into tCount > put tLength div tStep into tTimes > ## read in small steps in order to show a progress bar or other indication > repeat for tTimes > add 1 to tCount > read from socket lcSocket for tStep > put it after lcData > ## handle progress bar updating here > end repeat > read from socket lcSocket until empty ## catch last few dribbles > put it after lcData > close socket lcSocket > ## do something with lcData here (cache it, return it, or whatever) > else > ## crude error handling > put word 2 of it > close socket lcSocket > end if >end httpLoad >------------------------------- >on socketError pSocket, pErr > ##crude error handling > put pSocket & ":" & pErr >end socketError >------------------------------ >on socketTimeout pSocket > ##crude error handling > put "Timed out" > close socket pSocket >end socketTimeout >------------------------------ >_____________________________________________ >The LACS Centre (Business English Training Resources) >mailto:[EMAIL PROTECTED] >http://www.lacscentre.co.uk >_____________________________________________ Regards, Andu _______________________ [EMAIL PROTECTED] Archives: http://www.mail-archive.com/metacard%40lists.best.com/ Info: http://www.xworlds.com/metacard/mailinglist.htm Please send bug reports to <[EMAIL PROTECTED]>, not this list.