From 74d1539d02a7185f666e2b329629267d7f59a240 Mon Sep 17 00:00:00 2001 From: Dmitry Vorotilin Date: Thu, 12 Sep 2013 01:26:37 +0400 Subject: [PATCH] WEBrick has to bind proper host specified in `Capybara.server_host` --- lib/capybara.rb | 14 +++++++++++--- lib/capybara/server.rb | 10 +++------- spec/server_spec.rb | 18 +++++++++++++----- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/lib/capybara.rb b/lib/capybara.rb index 0fcfb359..51536983 100644 --- a/lib/capybara.rb +++ b/lib/capybara.rb @@ -16,10 +16,10 @@ module Capybara class << self attr_accessor :asset_host, :app_host, :run_server, :default_host, :always_include_port - attr_accessor :server_host, :server_port, :exact, :match, :exact_options, :visible_text_only + attr_accessor :server_port, :exact, :match, :exact_options, :visible_text_only attr_accessor :default_selector, :default_wait_time, :ignore_hidden_elements attr_accessor :save_and_open_page_path, :automatic_reload, :raise_server_errors - attr_writer :default_driver, :current_driver, :javascript_driver, :session_name + attr_writer :default_driver, :current_driver, :javascript_driver, :session_name, :server_host attr_accessor :app ## @@ -166,7 +166,7 @@ module Capybara # def run_default_server(app, port) require 'rack/handler/webrick' - Rack::Handler::WEBrick.run(app, :Port => port, :AccessLog => [], :Logger => WEBrick::Log::new(nil, 0)) + Rack::Handler::WEBrick.run(app, :Host => server_host, :Port => port, :AccessLog => [], :Logger => WEBrick::Log::new(nil, 0)) end ## @@ -214,6 +214,14 @@ module Capybara @current_driver = previous_driver end + ## + # + # @return [String] The IP address bound by default server + # + def server_host + @server_host || '127.0.0.1' + end + ## # # Yield a block using a specific wait time diff --git a/lib/capybara/server.rb b/lib/capybara/server.rb index e5182e50..efd52f08 100644 --- a/lib/capybara/server.rb +++ b/lib/capybara/server.rb @@ -31,13 +31,13 @@ module Capybara end end - attr_reader :app, :port + attr_reader :app, :port, :host - def initialize(app, port=Capybara.server_port) + def initialize(app, port=Capybara.server_port, host=Capybara.server_host) @app = app @middleware = Middleware.new(@app) @server_thread = nil # supress warnings - @port = port + @host, @port = host, port @port ||= Capybara::Server.ports[@app.object_id] @port ||= find_available_port end @@ -50,10 +50,6 @@ module Capybara @middleware.error end - def host - Capybara.server_host || "127.0.0.1" - end - def responsive? return false if @server_thread && @server_thread.join(0) diff --git a/spec/server_spec.rb b/spec/server_spec.rb index 13e4124a..9012eddf 100644 --- a/spec/server_spec.rb +++ b/spec/server_spec.rb @@ -18,13 +18,21 @@ describe Capybara::Server do end it "should bind to the specified host" do - Capybara.server_host = '0.0.0.0' + begin + app = proc { |env| [200, {}, ['Hello Server!']] } - app = proc { |env| [200, {}, ["Hello Server!"]]} - server = Capybara::Server.new(app).boot - server.host.should == '0.0.0.0' + Capybara.server_host = '127.0.0.1' + server = Capybara::Server.new(app).boot + res = Net::HTTP.get(URI("http://127.0.0.1:#{server.port}")) + expect(res).to eq('Hello Server!') - Capybara.server_host = nil + Capybara.server_host = '0.0.0.0' + server = Capybara::Server.new(app).boot + res = Net::HTTP.get(URI("http://127.0.0.1:#{server.port}")) + expect(res).to eq('Hello Server!') + ensure + Capybara.server_host = nil + end end it "should use specified port" do