78 lines
2.1 KiB
Ruby
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
|