diff --git a/.rspec b/.rspec index e69de29..0befc92 100644 --- a/.rspec +++ b/.rspec @@ -0,0 +1,2 @@ +--format=documentation +--color diff --git a/Gemfile.lock b/Gemfile.lock index f34584d..c93fcf0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - em-proxy (0.1.6) + em-proxy (0.1.7) eventmachine GEM @@ -17,7 +17,7 @@ GEM http_parser.rb (>= 0.5.2) em-socksify (0.1.0) eventmachine - eventmachine (1.0.0.beta.4) + eventmachine (1.0.0) http_parser.rb (0.5.3) rake (0.9.2.2) rspec (2.7.0) diff --git a/lib/em-proxy/connection.rb b/lib/em-proxy/connection.rb index 44cd996..3e1a9a8 100644 --- a/lib/em-proxy/connection.rb +++ b/lib/em-proxy/connection.rb @@ -43,11 +43,20 @@ def relay_to_servers(processed) # initialize connections to backend servers # def server(name, opts) - srv = EventMachine::bind_connect(opts[:bind_host], opts[:bind_port], opts[:host], opts[:port], EventMachine::ProxyServer::Backend, @debug) do |c| - c.name = name - c.plexer = self - c.proxy_incoming_to(self, 10240) if opts[:relay_server] + if opts[:socket] + srv = EventMachine::connect_unix_domain(opts[:socket], EventMachine::ProxyServer::Backend, @debug) do |c| + c.name = name + c.plexer = self + c.proxy_incoming_to(self, 10240) if opts[:relay_server] + end + else + srv = EventMachine::bind_connect(opts[:bind_host], opts[:bind_port], opts[:host], opts[:port], EventMachine::ProxyServer::Backend, @debug) do |c| + c.name = name + c.plexer = self + c.proxy_incoming_to(self, 10240) if opts[:relay_server] + end end + self.proxy_incoming_to(srv, 10240) if opts[:relay_client] @servers[name] = srv diff --git a/spec/helper.rb b/spec/helper.rb index a129e0e..e70ab9a 100644 --- a/spec/helper.rb +++ b/spec/helper.rb @@ -1,5 +1,6 @@ require 'bundler/setup' require 'em-http' require 'pp' +require 'tmpdir' require 'em-proxy' diff --git a/spec/proxy_spec.rb b/spec/proxy_spec.rb index 0ee04ee..caf9232 100644 --- a/spec/proxy_spec.rb +++ b/spec/proxy_spec.rb @@ -68,7 +68,7 @@ def failed end Proxy.start(:host => "0.0.0.0", :port => 8080) do |conn| - conn.server :bing, :host => "google.com", :port => 80 + conn.server :goog, :host => "google.com", :port => 80 conn.server :yhoo, :host => "yahoo.com", :port => 80 conn.on_data { |data| data } @@ -164,4 +164,63 @@ def failed end }.should_not raise_error end + + context "with a server listening on a TCP port" do + before :each do + @host = '127.0.0.1' + @port = 4242 + @pid = spawn("ruby spec/support/echo_server.rb #{@host} #{@port}") + sleep 1 # let the server come up + end + after :each do + Process.kill('QUIT', @pid) + end + it "should connect to a unix socket" do + connected = false + EM.run do + EventMachine.add_timer(0.1) do + EventMachine::HttpRequest.new('http://127.0.0.1:8080/').get({:timeout => 1}) + end + host = @host + port = @port + Proxy.start(:host => "0.0.0.0", :port => 8080) do |conn| + conn.server :local, :host => host, :port => port + conn.on_connect do |name| + connected = true + EventMachine.stop + end + end + end + connected.should == true + end + end + + context "with a server listening on a unix socket" do + before :each do + @socket = File.join(Dir.tmpdir, 'em-proxy.sock') + @pid = spawn("ruby spec/support/echo_server.rb #{@socket}") + sleep 1 # let the server come up + end + after :each do + Process.kill('QUIT', @pid) + end + it "should connect to a unix socket" do + connected = false + EM.run do + EventMachine.add_timer(0.1) do + EventMachine::HttpRequest.new('http://127.0.0.1:8080/').get({:timeout => 1}) + end + socket = @socket + Proxy.start(:host => "0.0.0.0", :port => 8080) do |conn| + conn.server :local, :socket => socket + conn.on_connect do |name| + connected = true + EventMachine.stop + end + end + end + connected.should == true + end + end + end diff --git a/spec/support/echo_server.rb b/spec/support/echo_server.rb new file mode 100644 index 0000000..f9f35ff --- /dev/null +++ b/spec/support/echo_server.rb @@ -0,0 +1,18 @@ +require 'eventmachine' + +module EchoServer + def receive_data data + send_data ">>>you sent: #{data}" + close_connection if data =~ /quit/i + end +end + +EventMachine.run do + if ARGV.count == 2 + EventMachine.start_server ARGV.first, ARGV.last.to_i, EchoServer + elsif ARGV.count == 1 + EventMachine.start_server ARGV.first, EchoServer + else + raise "invalid number of params, expected [server] ([port])" + end +end