ruby-proxifier/lib/sockets/proxify.rb

78 lines
2.1 KiB
Ruby

require "sockets/proxy"
module Sockets
module Proxify
def self.included(klass)
klass.class_eval do
alias_method :initialize_without_proxy, :initialize
alias_method :initialize, :initialize_with_proxy
end
end
def initialize_with_proxy(host, port, options_or_local_host = {}, local_port = nil, options_if_local_host = {})
if options_or_local_host.is_a?(Hash)
local_host = nil
options = options_or_local_host
else
local_host = options_or_local_host
options = options_if_local_host
end
if options[:proxy] && (proxy = Sockets::Proxy(options.delete(:proxy), options)) && proxy.proxify?(host)
initialize_without_proxy(proxy.host, proxy.port, local_host, local_port)
begin
proxy.proxify(self, host, port)
rescue Exception
close
raise
end
else
initialize_without_proxy(host, port, local_host, local_port)
end
end
end
end
module Sockets
module EnvironmentProxify
def self.included(klass)
klass.class_eval do
extend ClassMethods
alias_method :initialize_without_environment_proxy, :initialize
alias_method :initialize, :initialize_with_environment_proxy
end
end
def initialize_with_environment_proxy(host, port, options_or_local_host = {}, local_port = nil, options_if_local_host = {})
if options_or_local_host.is_a?(Hash)
local_host = nil
options = options_or_local_host
else
local_host = options_or_local_host
options = options_if_local_host
end
options = { :proxy => environment_proxy, :no_proxy => environment_no_proxy }.merge(options)
initialize_without_environment_proxy(host, port, local_host, local_port, options)
end
def environment_proxy
self.class.environment_proxy
end
def environment_no_proxy
self.class.environment_no_proxy
end
module ClassMethods
def environment_proxy
ENV["proxy"] || ENV["PROXY"] || ENV["socks_proxy"] || ENV["http_proxy"]
end
def environment_no_proxy
ENV["no_proxy"]
end
end
end
end