lib/envoy/client/channel.rb in envoy-proxy-0.0.16 vs lib/envoy/client/channel.rb in envoy-proxy-0.0.17
- old
+ new
@@ -1,24 +1,69 @@
module Envoy
+
module Client
module Channel
def initialize id, client
@id, @client = id, client
+ @buffer = ""
super()
end
+ def connection_completed
+ send_data @buffer, true
+ @buffer = nil
+ end
+
+ def send_data data, force = false
+ if !@buffer or force
+ super data
+ else
+ @buffer << data
+ end
+ end
+
def receive_data data
@client.send_object :stream, @id, data
end
- def unbind
- @client.send_object :close, @id
+ def reconnect
+ super @client.options[:local_host], @client.options[:local_port]
end
+ def unbind e
+ if e == Errno::ECONNREFUSED
+ if @tried_starting
+ @client.log "Service isn't running, but starting it didn't really work out."
+ @client.send_object :close, @id, 502
+ elsif cmd = @client.options[:command]
+ cmd = cmd % @client.options
+ @client.log "Service doesn't seem to be running. Trying to start it now..."
+ @tried_starting = true
+ Dir.chdir File.expand_path(@client.options[:dir]) do
+ fork do
+ #Process.daemon(true, false)
+ ENV.delete("GEM_HOME")
+ ENV.delete("GEM_PATH")
+ ENV.delete("BUNDLE_BIN_PATH")
+ ENV.delete("BUNDLE_GEMFILE")
+ system cmd
+ end
+ end
+ EM.add_timer @client.options[:delay] do
+ reconnect
+ end
+ end
+ elsif e
+ @client.log e.inspect
+ else
+ @client.send_object :close, @id
+ end
+ end
+
end
def self.run (options = {})
unless EM.reactor_running?
EM.run do
@@ -29,6 +74,8 @@
end
end
end
end
+
end
+