On 22/04/2005, at 11:48 AM, James Britt wrote:
> jm wrote:
>> I gave it a quick run. I had to change
>> local_host = nil
>> so that it would bind and fixed the line wrap in the posted code.
>> Telnetted to port 8080 on localhost and hit enter twice and it came
>> back with a lot of html from slashdot.
>
> I managed the same, on win32, but could not get the results to render
> in Firefox or IE. It fetches the page OK (judging by the debugging p
> calls), but whatever is sent back to the browser is off in some way.
>
Alright. this is wierd I just tried it with firefox on macosx and it
rendered find, except for all the broken images, etc due to the
reference to '/', ie
net = Net::HTTP.new(host,80)
response = net.get('/')
Made a few modification. Really needs a clean up and there's probably
libraries out there which will do this cleaner. I've been staring at
perl code most of the day wishing it wasn't . Anyway, I've included the
full script below.
require 'socket'
require 'net/http'
local_host = nil
local_port = 8080
#
# returns proto,host,path or nil
#
def url_split(h)
reg = Regexp.new('^(\w*)\:\/\/([\w\.]+)(\/.*)')
md = reg.match(h)
return nil unless md
return md[1],md[2],md[3]
end
host = 'slashdot.org'
server = TCPServer.new(local_host,local_port)
while true
Thread.start(server.accept) do |s|
header = ''
data = ''
# this is a little crude
header = s.gets # added
while s.gets && !$_.nil?
data += $_
break if $_ == "\r\n" || $_ == "\n"
end
header = header.split(' ') # added
proto,host,path = url_split(header[1]) # added
p "==== header[1]: #{header[1]}" # added
p "==== #{proto} #{host} #{path}" # added
p "====Received: #{data}"
net = Net::HTTP.new(host,80)
response = net.get(path) # changed
s << "HTTP/#{response.http_version}
#{response.code}/#{response.message} \r\n"
p "====Got back"
response.each_header do |key,value|
tmp = key + ": " + value + "\r\n"
tmp = key + ": " + value + "\r\n"
p tmp
s << tmp
end
p response.body
s << "\r\n" << response.body
s.close # We're done with this request, bring on the next.
end
end