[Explain notion of proxy.] RS: In general, a proxy is someone or something that stands for someone or something else. Specifically, a proxy host can be a firewall that routes web traffic from and to other sites (see autoproxy).
Proxomitron's[L1 ] said to be handy under Windows, and knows SSL. (MAKR 2009-04-09 as of today the Proxomitron link points to a page that says that this domain is for sale.)
LES: Proxomitron is very nice, but really bugged me for using its own regex dialect, which I never got to memorize. Privoxy [L2 ] doesn't look as fancy, but works very well and sticks to good old PCRE. Oh, yes, and it runs on several platforms.
LES on 2005-10-07: I would like to make a proxy to filter Web content, like Privoxy. But I have no idea of how to make it listen on a given port and get the browser's request. Fectching pages is easy, but I have no idea of how to send it back to the browser. Can someone give me a few rough pointers on these two things (listening on a port and sending data to the browser)?
MG I'm not sure how to do the actual proxy code, but listening on a port and sending data back is actually pretty easy. It's all just done with socket, puts, and gets (and probably a fileevent too). To listen on a port, you just need to start a server with
set port 1234 # Start listening on port $port for connections. When we get one, [myCmd] will be run set sock [socket -socket myCmd $port] proc myCmd {channel cAddr cPort} { puts "New connection from ${cAddr}:$cPort (socket $channel)" # set up a fileevent, so that when we have data to read from the client, we do so fileevent $channel readable [list doSomeStuff $channel] };# myCmd proc doSomeStuff {channel} { # read data, and return if there's an error, or the channel is closed if { [catch {gets $channel line}] || [eof $channel] } { close $channel return; } # do some interesting stuff with $line, which we received from the client set result [foobar $line] if { $result == "1" } { # send message back to client, but don't close the channel. This means they can send more data. puts $channel "We got $line. Send more" } else { # Send message back, then close the channel. puts $channel "We got $line. That is all" close $channel } };# doSomeStuff
There's a slightly longer example at Port Forwarding in Pure-Tcl, which also listens on a port for connections like this. My apologies for any typos in that code, btw, it's 5:30 am ;)
LES: It works very well. Thank you again.
AH 2005-07-10: Tcl nano proxy server is one possible place to start.
MAKR 2009-04-09: aspect mentioned another proxy written in Tcl in the chat today. It is called Loxy: Logging HTTP Proxy and can be found here: http://www.parand.com/projects/loxy/ .