mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
36c839f233
should delete trailing LF from the result of pack("m*"). * lib/webrick/httpproxy.rb (WEBrick::HTTPProxyServer#proxy_connect): - should delete trailing LF from the result of pack("m*"). - clear Request-Line not to send the sesponse by HTTPServer#run. * lib/webrick/httputils (WEBrick::HTTPUtils.parse_qvalues): refine regexp (and change the name of a local variable). * lib/webrick/server.rb (WEBrick::Daemon.start): prepared stdio don't allow changing its mode. * test/webrick/*, sample/webrick/httpproxy.rb: add new files. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7743 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
260 lines
11 KiB
Ruby
260 lines
11 KiB
Ruby
require "test/unit"
|
|
require "net/http"
|
|
require "webrick"
|
|
require File.join(File.dirname(__FILE__), "utils.rb")
|
|
|
|
class TestWEBrickHTTPServer < Test::Unit::TestCase
|
|
def test_mount
|
|
httpd = WEBrick::HTTPServer.new(
|
|
:Logger => WEBrick::Log.new(TestWEBrick::NullWriter),
|
|
:DoNotListen=>true
|
|
)
|
|
httpd.mount("/", :Root)
|
|
httpd.mount("/foo", :Foo)
|
|
httpd.mount("/foo/bar", :Bar, :bar1)
|
|
httpd.mount("/foo/bar/baz", :Baz, :baz1, :baz2)
|
|
|
|
serv, opts, script_name, path_info = httpd.search_servlet("/")
|
|
assert_equal(:Root, serv)
|
|
assert_equal([], opts)
|
|
assert_equal(script_name, "")
|
|
assert_equal(path_info, "/")
|
|
|
|
serv, opts, script_name, path_info = httpd.search_servlet("/sub")
|
|
assert_equal(:Root, serv)
|
|
assert_equal([], opts)
|
|
assert_equal(script_name, "")
|
|
assert_equal(path_info, "/sub")
|
|
|
|
serv, opts, script_name, path_info = httpd.search_servlet("/sub/")
|
|
assert_equal(:Root, serv)
|
|
assert_equal([], opts)
|
|
assert_equal(script_name, "")
|
|
assert_equal(path_info, "/sub/")
|
|
|
|
serv, opts, script_name, path_info = httpd.search_servlet("/foo")
|
|
assert_equal(:Foo, serv)
|
|
assert_equal([], opts)
|
|
assert_equal(script_name, "/foo")
|
|
assert_equal(path_info, "")
|
|
|
|
serv, opts, script_name, path_info = httpd.search_servlet("/foo/")
|
|
assert_equal(:Foo, serv)
|
|
assert_equal([], opts)
|
|
assert_equal(script_name, "/foo")
|
|
assert_equal(path_info, "/")
|
|
|
|
serv, opts, script_name, path_info = httpd.search_servlet("/foo/sub")
|
|
assert_equal(:Foo, serv)
|
|
assert_equal([], opts)
|
|
assert_equal(script_name, "/foo")
|
|
assert_equal(path_info, "/sub")
|
|
|
|
serv, opts, script_name, path_info = httpd.search_servlet("/foo/bar")
|
|
assert_equal(:Bar, serv)
|
|
assert_equal([:bar1], opts)
|
|
assert_equal(script_name, "/foo/bar")
|
|
assert_equal(path_info, "")
|
|
|
|
serv, opts, script_name, path_info = httpd.search_servlet("/foo/bar/baz")
|
|
assert_equal(:Baz, serv)
|
|
assert_equal([:baz1, :baz2], opts)
|
|
assert_equal(script_name, "/foo/bar/baz")
|
|
assert_equal(path_info, "")
|
|
end
|
|
|
|
class Req
|
|
attr_reader :port, :host
|
|
def initialize(addr, port, host)
|
|
@addr, @port, @host = addr, port, host
|
|
end
|
|
def addr
|
|
[0,0,0,@addr]
|
|
end
|
|
end
|
|
|
|
def httpd(addr, port, host, ali)
|
|
config ={
|
|
:Logger => WEBrick::Log.new(TestWEBrick::NullWriter),
|
|
:DoNotListen => true,
|
|
:BindAddress => addr,
|
|
:Port => port,
|
|
:ServerName => host,
|
|
:ServerAlias => ali,
|
|
}
|
|
return WEBrick::HTTPServer.new(config)
|
|
end
|
|
|
|
def assert_eql?(v1, v2)
|
|
assert_equal(v1.object_id, v2.object_id)
|
|
end
|
|
|
|
def test_lookup_server
|
|
addr1 = "192.168.100.1"
|
|
addr2 = "192.168.100.2"
|
|
addrz = "192.168.100.254"
|
|
local = "127.0.0.1"
|
|
port1 = 80
|
|
port2 = 8080
|
|
port3 = 10080
|
|
portz = 32767
|
|
name1 = "www.example.com"
|
|
name2 = "www2.example.com"
|
|
name3 = "www3.example.com"
|
|
namea = "www.example.co.jp"
|
|
nameb = "www.example.jp"
|
|
namec = "www2.example.co.jp"
|
|
named = "www2.example.jp"
|
|
namez = "foobar.example.com"
|
|
alias1 = [namea, nameb]
|
|
alias2 = [namec, named]
|
|
|
|
host1 = httpd(nil, port1, name1, nil)
|
|
hosts = [
|
|
host2 = httpd(addr1, port1, name1, nil),
|
|
host3 = httpd(addr1, port1, name2, alias1),
|
|
host4 = httpd(addr1, port2, name1, nil),
|
|
host5 = httpd(addr1, port2, name2, alias1),
|
|
host6 = httpd(addr1, port2, name3, alias2),
|
|
host7 = httpd(addr2, nil, name1, nil),
|
|
host8 = httpd(addr2, nil, name2, alias1),
|
|
host9 = httpd(addr2, nil, name3, alias2),
|
|
host10 = httpd(local, nil, nil, nil),
|
|
host11 = httpd(nil, port3, nil, nil),
|
|
].sort_by{ rand }
|
|
hosts.each{|h| host1.virtual_host(h) }
|
|
|
|
# connect to addr1
|
|
assert_eql?(host2, host1.lookup_server(Req.new(addr1, port1, name1)))
|
|
assert_eql?(host3, host1.lookup_server(Req.new(addr1, port1, name2)))
|
|
assert_eql?(host3, host1.lookup_server(Req.new(addr1, port1, namea)))
|
|
assert_eql?(host3, host1.lookup_server(Req.new(addr1, port1, nameb)))
|
|
assert_eql?(nil, host1.lookup_server(Req.new(addr1, port1, namez)))
|
|
assert_eql?(host4, host1.lookup_server(Req.new(addr1, port2, name1)))
|
|
assert_eql?(host5, host1.lookup_server(Req.new(addr1, port2, name2)))
|
|
assert_eql?(host5, host1.lookup_server(Req.new(addr1, port2, namea)))
|
|
assert_eql?(host5, host1.lookup_server(Req.new(addr1, port2, nameb)))
|
|
assert_eql?(nil, host1.lookup_server(Req.new(addr1, port2, namez)))
|
|
assert_eql?(host11, host1.lookup_server(Req.new(addr1, port3, name1)))
|
|
assert_eql?(host11, host1.lookup_server(Req.new(addr1, port3, name2)))
|
|
assert_eql?(host11, host1.lookup_server(Req.new(addr1, port3, namea)))
|
|
assert_eql?(host11, host1.lookup_server(Req.new(addr1, port3, nameb)))
|
|
assert_eql?(host11, host1.lookup_server(Req.new(addr1, port3, namez)))
|
|
assert_eql?(nil, host1.lookup_server(Req.new(addr1, portz, name1)))
|
|
assert_eql?(nil, host1.lookup_server(Req.new(addr1, portz, name2)))
|
|
assert_eql?(nil, host1.lookup_server(Req.new(addr1, portz, namea)))
|
|
assert_eql?(nil, host1.lookup_server(Req.new(addr1, portz, nameb)))
|
|
assert_eql?(nil, host1.lookup_server(Req.new(addr1, portz, namez)))
|
|
|
|
# connect to addr2
|
|
assert_eql?(host7, host1.lookup_server(Req.new(addr2, port1, name1)))
|
|
assert_eql?(host8, host1.lookup_server(Req.new(addr2, port1, name2)))
|
|
assert_eql?(host8, host1.lookup_server(Req.new(addr2, port1, namea)))
|
|
assert_eql?(host8, host1.lookup_server(Req.new(addr2, port1, nameb)))
|
|
assert_eql?(nil, host1.lookup_server(Req.new(addr2, port1, namez)))
|
|
assert_eql?(host7, host1.lookup_server(Req.new(addr2, port2, name1)))
|
|
assert_eql?(host8, host1.lookup_server(Req.new(addr2, port2, name2)))
|
|
assert_eql?(host8, host1.lookup_server(Req.new(addr2, port2, namea)))
|
|
assert_eql?(host8, host1.lookup_server(Req.new(addr2, port2, nameb)))
|
|
assert_eql?(nil, host1.lookup_server(Req.new(addr2, port2, namez)))
|
|
assert_eql?(host7, host1.lookup_server(Req.new(addr2, port3, name1)))
|
|
assert_eql?(host8, host1.lookup_server(Req.new(addr2, port3, name2)))
|
|
assert_eql?(host8, host1.lookup_server(Req.new(addr2, port3, namea)))
|
|
assert_eql?(host8, host1.lookup_server(Req.new(addr2, port3, nameb)))
|
|
assert_eql?(host11, host1.lookup_server(Req.new(addr2, port3, namez)))
|
|
assert_eql?(host7, host1.lookup_server(Req.new(addr2, portz, name1)))
|
|
assert_eql?(host8, host1.lookup_server(Req.new(addr2, portz, name2)))
|
|
assert_eql?(host8, host1.lookup_server(Req.new(addr2, portz, namea)))
|
|
assert_eql?(host8, host1.lookup_server(Req.new(addr2, portz, nameb)))
|
|
assert_eql?(nil, host1.lookup_server(Req.new(addr2, portz, namez)))
|
|
|
|
# connect to addrz
|
|
assert_eql?(nil, host1.lookup_server(Req.new(addrz, port1, name1)))
|
|
assert_eql?(nil, host1.lookup_server(Req.new(addrz, port1, name2)))
|
|
assert_eql?(nil, host1.lookup_server(Req.new(addrz, port1, namea)))
|
|
assert_eql?(nil, host1.lookup_server(Req.new(addrz, port1, nameb)))
|
|
assert_eql?(nil, host1.lookup_server(Req.new(addrz, port1, namez)))
|
|
assert_eql?(nil, host1.lookup_server(Req.new(addrz, port2, name1)))
|
|
assert_eql?(nil, host1.lookup_server(Req.new(addrz, port2, name2)))
|
|
assert_eql?(nil, host1.lookup_server(Req.new(addrz, port2, namea)))
|
|
assert_eql?(nil, host1.lookup_server(Req.new(addrz, port2, nameb)))
|
|
assert_eql?(nil, host1.lookup_server(Req.new(addrz, port2, namez)))
|
|
assert_eql?(host11, host1.lookup_server(Req.new(addrz, port3, name1)))
|
|
assert_eql?(host11, host1.lookup_server(Req.new(addrz, port3, name2)))
|
|
assert_eql?(host11, host1.lookup_server(Req.new(addrz, port3, namea)))
|
|
assert_eql?(host11, host1.lookup_server(Req.new(addrz, port3, nameb)))
|
|
assert_eql?(host11, host1.lookup_server(Req.new(addrz, port3, namez)))
|
|
assert_eql?(nil, host1.lookup_server(Req.new(addrz, portz, name1)))
|
|
assert_eql?(nil, host1.lookup_server(Req.new(addrz, portz, name2)))
|
|
assert_eql?(nil, host1.lookup_server(Req.new(addrz, portz, namea)))
|
|
assert_eql?(nil, host1.lookup_server(Req.new(addrz, portz, nameb)))
|
|
assert_eql?(nil, host1.lookup_server(Req.new(addrz, portz, namez)))
|
|
|
|
# connect to localhost
|
|
assert_eql?(host10, host1.lookup_server(Req.new(local, port1, name1)))
|
|
assert_eql?(host10, host1.lookup_server(Req.new(local, port1, name2)))
|
|
assert_eql?(host10, host1.lookup_server(Req.new(local, port1, namea)))
|
|
assert_eql?(host10, host1.lookup_server(Req.new(local, port1, nameb)))
|
|
assert_eql?(host10, host1.lookup_server(Req.new(local, port1, namez)))
|
|
assert_eql?(host10, host1.lookup_server(Req.new(local, port2, name1)))
|
|
assert_eql?(host10, host1.lookup_server(Req.new(local, port2, name2)))
|
|
assert_eql?(host10, host1.lookup_server(Req.new(local, port2, namea)))
|
|
assert_eql?(host10, host1.lookup_server(Req.new(local, port2, nameb)))
|
|
assert_eql?(host10, host1.lookup_server(Req.new(local, port2, namez)))
|
|
assert_eql?(host10, host1.lookup_server(Req.new(local, port3, name1)))
|
|
assert_eql?(host10, host1.lookup_server(Req.new(local, port3, name2)))
|
|
assert_eql?(host10, host1.lookup_server(Req.new(local, port3, namea)))
|
|
assert_eql?(host10, host1.lookup_server(Req.new(local, port3, nameb)))
|
|
assert_eql?(host10, host1.lookup_server(Req.new(local, port3, namez)))
|
|
assert_eql?(host10, host1.lookup_server(Req.new(local, portz, name1)))
|
|
assert_eql?(host10, host1.lookup_server(Req.new(local, portz, name2)))
|
|
assert_eql?(host10, host1.lookup_server(Req.new(local, portz, namea)))
|
|
assert_eql?(host10, host1.lookup_server(Req.new(local, portz, nameb)))
|
|
assert_eql?(host10, host1.lookup_server(Req.new(local, portz, namez)))
|
|
end
|
|
|
|
def test_callbacks
|
|
accepted = started = stopped = 0
|
|
requested0 = requested1 = 0
|
|
config = {
|
|
:ServerName => "localhost",
|
|
:AcceptCallback => Proc.new{ accepted += 1 },
|
|
:StartCallback => Proc.new{ started += 1 },
|
|
:StopCallback => Proc.new{ stopped += 1 },
|
|
:RequestCallback => Proc.new{|req, res| requested0 += 1 },
|
|
}
|
|
TestWEBrick.start_httpserver(config){|server, addr, port|
|
|
vhost_config = {
|
|
:ServerName => "myhostname",
|
|
:BindAddress => addr,
|
|
:Port => port,
|
|
:DoNotListen => true,
|
|
:Logger => WEBrick::Log.new(TestWEBrick::NullWriter),
|
|
:AccessLog => [],
|
|
:RequestCallback => Proc.new{|req, res| requested1 += 1 },
|
|
}
|
|
server.virtual_host(WEBrick::HTTPServer.new(vhost_config))
|
|
|
|
true while server.status != :Running
|
|
assert_equal(started, 1)
|
|
assert_equal(stopped, 0)
|
|
assert_equal(accepted, 0)
|
|
|
|
http = Net::HTTP.new(addr, port)
|
|
req = Net::HTTP::Get.new("/")
|
|
req["Host"] = "myhostname:#{port}"
|
|
http.request(req){|res| assert_equal("404", res.code)}
|
|
http.request(req){|res| assert_equal("404", res.code)}
|
|
http.request(req){|res| assert_equal("404", res.code)}
|
|
req["Host"] = "localhost:#{port}"
|
|
http.request(req){|res| assert_equal("404", res.code)}
|
|
http.request(req){|res| assert_equal("404", res.code)}
|
|
http.request(req){|res| assert_equal("404", res.code)}
|
|
assert_equal(6, accepted)
|
|
assert_equal(3, requested0)
|
|
assert_equal(3, requested1)
|
|
}
|
|
assert_equal(started, 1)
|
|
assert_equal(stopped, 1)
|
|
end
|
|
end
|