Extract resolv-replace
This commit is contained in:
parent
9ac316bb48
commit
99c2c703da
@ -27,3 +27,4 @@ base64 0.2.0 https://github.com/ruby/base64
|
||||
bigdecimal 3.1.6 https://github.com/ruby/bigdecimal
|
||||
observer 0.1.2 https://github.com/ruby/observer
|
||||
abbrev 0.1.2 https://github.com/ruby/abbrev
|
||||
resolv-replace 0.1.1 https://github.com/ruby/resolv-replace
|
||||
|
@ -1,22 +0,0 @@
|
||||
Gem::Specification.new do |spec|
|
||||
spec.name = "resolv-replace"
|
||||
spec.version = "0.1.1"
|
||||
spec.authors = ["Tanaka Akira"]
|
||||
spec.email = ["akr@fsij.org"]
|
||||
|
||||
spec.summary = %q{Replace Socket DNS with Resolv.}
|
||||
spec.description = %q{Replace Socket DNS with Resolv.}
|
||||
spec.homepage = "https://github.com/ruby/resolv-replace"
|
||||
spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
|
||||
spec.licenses = ["Ruby", "BSD-2-Clause"]
|
||||
|
||||
spec.metadata["homepage_uri"] = spec.homepage
|
||||
spec.metadata["source_code_uri"] = spec.homepage
|
||||
|
||||
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
||||
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
||||
end
|
||||
spec.require_paths = ["lib"]
|
||||
|
||||
spec.add_dependency "resolv"
|
||||
end
|
@ -1,76 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'socket'
|
||||
require 'resolv'
|
||||
|
||||
class << IPSocket
|
||||
# :stopdoc:
|
||||
alias original_resolv_getaddress getaddress
|
||||
# :startdoc:
|
||||
def getaddress(host)
|
||||
begin
|
||||
return Resolv.getaddress(host).to_s
|
||||
rescue Resolv::ResolvError
|
||||
raise SocketError, "Hostname not known: #{host}"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class TCPSocket < IPSocket
|
||||
# :stopdoc:
|
||||
alias original_resolv_initialize initialize
|
||||
# :startdoc:
|
||||
def initialize(host, serv, *rest)
|
||||
rest[0] = IPSocket.getaddress(rest[0]) if rest[0]
|
||||
original_resolv_initialize(IPSocket.getaddress(host), serv, *rest)
|
||||
end
|
||||
end
|
||||
|
||||
class UDPSocket < IPSocket
|
||||
# :stopdoc:
|
||||
alias original_resolv_bind bind
|
||||
# :startdoc:
|
||||
def bind(host, port)
|
||||
host = IPSocket.getaddress(host) if host != ""
|
||||
original_resolv_bind(host, port)
|
||||
end
|
||||
|
||||
# :stopdoc:
|
||||
alias original_resolv_connect connect
|
||||
# :startdoc:
|
||||
def connect(host, port)
|
||||
original_resolv_connect(IPSocket.getaddress(host), port)
|
||||
end
|
||||
|
||||
# :stopdoc:
|
||||
alias original_resolv_send send
|
||||
# :startdoc:
|
||||
def send(mesg, flags, *rest)
|
||||
if rest.length == 2
|
||||
host, port = rest
|
||||
begin
|
||||
addrs = Resolv.getaddresses(host)
|
||||
rescue Resolv::ResolvError
|
||||
raise SocketError, "Hostname not known: #{host}"
|
||||
end
|
||||
addrs[0...-1].each {|addr|
|
||||
begin
|
||||
return original_resolv_send(mesg, flags, addr, port)
|
||||
rescue SystemCallError
|
||||
end
|
||||
}
|
||||
original_resolv_send(mesg, flags, addrs[-1], port)
|
||||
else
|
||||
original_resolv_send(mesg, flags, *rest)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class SOCKSSocket < TCPSocket
|
||||
# :stopdoc:
|
||||
alias original_resolv_initialize initialize
|
||||
# :startdoc:
|
||||
def initialize(host, serv)
|
||||
original_resolv_initialize(IPSocket.getaddress(host), port)
|
||||
end
|
||||
end if defined? SOCKSSocket
|
Loading…
x
Reference in New Issue
Block a user