Roland Jesse <jesse / cs.uni-magdeburg.de> writes:

> # now some magic to retrieve the hostname and port resulting out of (1)
> # store both in newHostName and newPortNr

Well, I don't know if this is the 'official' way, but:

     require 'net/http'

     h = Net::HTTP.new(ARGV[0] || 'www.ruby-lang.org', 80)

     url = ARGV[1] || '/'

     resp, data = h.get2(url, nil) { |a| }

     puts "Initial response: #{resp.code}, #{resp.message}"

     if resp.code == "301"
       location = resp['location']

       location =~ %r{^http://([^/]+)(.*)}

       host = $1
       location = $2
       port = 80

       if host =~ /(.*):(\d+)/
         host = $1
         post = $2
       end

       h = Net::HTTP.new(host, port)

       resp, data = h.get(location, nil)
       puts "Redirect response: #{resp.code}, #{resp.message}"
     end

     puts data


The 'get2' methods (and the corresponding post2 and head2) don't throw 
protocol exceptions, so you can get the information you need. I'm sure 
there are better ways of parsing the returned URL, but this gives you
the idea.

btw, the top of ruby-lang.org is actually a Ruby script, which looks
at the languages your browser accepts and redirects you to either the
English or japanese language sides of the web site.Makes a useful test 
site for this code.


Regards


Dave