hmm I wanted to use it because I have many different server sockets. They are created in a fork.
What exactly do you mean by that? If you create them in a sub process then you just have one pair per process - do you?
I did it now with your loop and it seems to work now except the fact the browsing through my webproxy is now pretty slow and I'm getting really confusing errors:
./httpsocket.rb:23:in `readline': end of file reached (EOFError)
from ./httpsocket.rb:23
./httpsocket.rb:23:in `readline': end of file reached (EOFError)
from ./httpsocket.rb:23
./httpsocket.rb:23:in `readline': end of file reached (EOFError)
from ./httpsocket.rb:23
./httpsocket.rb:23:in `readline': end of file reached (EOFError)
from ./httpsocket.rb:23
That's why:
http://www.ruby-doc.org/core/classes/IO.html#M002298
which seems to me like a very strange behavior because this loop means read a line from client[0] as long as possible: while client[0].readline
why is an eof error there possible? shoudln't make an eof ending the loop?
#!/usr/bin/env ruby
$Verbose=true
require 'socket'
require 'uri'
$bind_port = '23322'
$bind_address='localhost'
# opens a socket on the local machine and binds the proxy to it
proxy = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
proxy.bind(Socket.pack_sockaddr_in($bind_port, $bind_address ))
proxy.listen(1)
Why don't you use TCPServer? Seems much easier for your use case. There is a comprehensive example in the Pickaxe.
# waits for Browser-client connections
while client = proxy.accept
fork()
I believe you are not using fork properly here. The easiest is to use it with a block which gets executed in the child. If you do not do that, you need to evaluate the return value of fork to determine whether you are in the parent or child process.
# reads the browsers request
request=''
while client[0].readline
request += $_
break if $_ =~ /^\s*$/m
if $_ =~ /^GET .+/
host = URI.parse(URI.extract($_)[0]).host
port = URI.parse(URI.extract($_)[0]).port
end
end
Why don't you read the complete request? This way you can't do POST and PUT as far as I can see.
# connects to the webserver and sends the request server = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
server.connect(Socket.pack_sockaddr_in(port, host.chomp.sub('/','') ))
server.write(request)
TCPSocket seems easier here.
# reads webservers response
response=''
while server.readline
response += $_
break if $_ =~ /^\s*$/m
end
You're making your life much harder than necessary. Why don't you just do this
response = ""
server.each do |line|
response << line
break if /^\s*$/m =~ line
end
or
response = ""
while line = server.gets
response << line
break if /^\s*$/m =~ line
end
# sends the http-header to browser
client[0].write(response)
# listens for further responses of the server and sends it to the browser
while ( response = server.read(2**16) )
client[0].write(response)
end
end
It seems you are trying to write a HTTP proxy. If it is not for the educational experience then I suggest to look into the RAA or in the standard lib. I believe a proxy class is part of Webrick.
Kind regards
robert
···
On 08.10.2007 17:03, kazaam wrote: