On 08.10.2007 17:03, kazaam wrote:
> 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