Skip to content

Commit 86ed621

Browse files
wishdevjeremyevans
authored andcommitted
Ensure server port numbers are numeric and ensure they are stored as integers
1 parent 1daacc1 commit 86ed621

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

lib/webrick/server.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,9 @@ def initialize(config={}, default=Config::General)
102102
@listeners = []
103103
@shutdown_pipe = @config[:ShutdownPipe]
104104
unless @config[:DoNotListen]
105+
raise ArgumentError, "Port must an integer" unless @config[:Port].to_s == @config[:Port].to_i.to_s
106+
107+
@config[:Port] = @config[:Port].to_i
105108
if @config[:Listen]
106109
warn(":Listen option is deprecated; use GenericServer#listen", uplevel: 1)
107110
end

test/webrick/test_server.rb

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,4 +172,32 @@ def test_shutdown_pipe
172172
pipe.last.puts('')
173173
assert_join_threads([server_thread])
174174
end
175+
176+
def test_port_numbers
177+
config = {
178+
:BindAddress => '0.0.0.0',
179+
:Logger => WEBrick::Log.new([], WEBrick::BasicLog::WARN),
180+
}
181+
182+
ports = [0, "0"]
183+
184+
ports.each do |port|
185+
config[:Port]= port
186+
server = WEBrick::GenericServer.new(config)
187+
server_thread = Thread.start { server.start }
188+
client_thread = Thread.start {
189+
sleep 0.1 until server.status == :Running || !server_thread.status
190+
server_port = server.listeners[0].addr[1]
191+
server.stop
192+
assert_equal server.config[:Port], server_port
193+
sleep 0.1 until server.status == :Stop || !server_thread.status
194+
}
195+
assert_join_threads([client_thread, server_thread])
196+
end
197+
198+
assert_raise(ArgumentError) do
199+
config[:Port]= "FOO"
200+
WEBrick::GenericServer.new(config)
201+
end
202+
end
175203
end

0 commit comments

Comments
 (0)