whois 0.8.0 → 0.8.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +9 -0
- data/Manifest +15 -10
- data/Rakefile +4 -3
- data/lib/whois.rb +3 -3
- data/lib/whois/answer.rb +8 -1
- data/lib/whois/answer/contact.rb +1 -1
- data/lib/whois/answer/parser.rb +22 -3
- data/lib/whois/answer/parser/base.rb +38 -1
- data/lib/whois/answer/parser/blank.rb +1 -1
- data/lib/whois/answer/parser/whois.crsnic.net.rb +1 -1
- data/lib/whois/answer/parser/whois.denic.de.rb +15 -6
- data/lib/whois/answer/parser/whois.nic.it.rb +1 -1
- data/lib/whois/answer/parser/whois.publicinterestregistry.net.rb +1 -1
- data/lib/whois/answer/part.rb +1 -1
- data/lib/whois/answer/registrar.rb +1 -1
- data/lib/whois/answer/super_struct.rb +1 -1
- data/lib/whois/client.rb +1 -1
- data/lib/whois/errors.rb +1 -1
- data/lib/whois/server.rb +1 -1
- data/lib/whois/server/adapters/afilias.rb +1 -1
- data/lib/whois/server/adapters/arpa.rb +1 -1
- data/lib/whois/server/adapters/base.rb +1 -1
- data/lib/whois/server/adapters/formatted.rb +1 -1
- data/lib/whois/server/adapters/none.rb +1 -1
- data/lib/whois/server/adapters/not_implemented.rb +1 -1
- data/lib/whois/server/adapters/pir.rb +1 -1
- data/lib/whois/server/adapters/standard.rb +1 -1
- data/lib/whois/server/adapters/verisign.rb +3 -3
- data/lib/whois/server/adapters/web.rb +1 -1
- data/lib/whois/version.rb +2 -2
- data/lib/whois/whois.rb +1 -1
- data/test/answer/parser/base_test.rb +21 -1
- data/test/answer/parser/whois_denic_de_test.rb +235 -27
- data/test/answer/parser_test.rb +37 -4
- data/test/answer_test.rb +9 -4
- data/test/server/adapters/verisign_test.rb +16 -2
- data/test/testcases/referrals/crsnic.com_more_servers.txt +210 -0
- data/test/testcases/referrals/crsnic.com_one_server.txt +57 -0
- data/test/testcases/responses/whois.denic.de/1-10-0_available.txt +30 -0
- data/test/testcases/responses/whois.denic.de/1-10-0_registered.txt +77 -0
- data/test/testcases/responses/whois.denic.de/available.txt +29 -17
- data/test/testcases/responses/whois.denic.de/error_invalid_domain_name.txt +37 -0
- data/test/testcases/responses/whois.denic.de/registered.txt +50 -57
- data/whois.gemspec +6 -6
- metadata +27 -22
data/CHANGELOG.rdoc
CHANGED
@@ -1,6 +1,15 @@
|
|
1
1
|
= Changelog
|
2
2
|
|
3
3
|
|
4
|
+
== Release 0.8.1
|
5
|
+
|
6
|
+
* FIXED: Updated the whois.denic.de parser to the new format. Thanks to David Krentzlin (closes #314)
|
7
|
+
|
8
|
+
* FIXED: In case of thin server the client should select the closest whois server match (closes #264)
|
9
|
+
|
10
|
+
* ADDED: ability to check whether a property is supported via answer.supported? or parser.supported?
|
11
|
+
|
12
|
+
|
4
13
|
== Release 0.8.0
|
5
14
|
|
6
15
|
* FIXED: Server definition with :format doesn't use the Formatted adapter (closes #305)
|
data/Manifest
CHANGED
@@ -1,24 +1,29 @@
|
|
1
|
-
bin/ruby-whois
|
2
1
|
CHANGELOG.rdoc
|
2
|
+
LICENSE.rdoc
|
3
|
+
Manifest
|
4
|
+
README.rdoc
|
5
|
+
Rakefile
|
6
|
+
bin/ruby-whois
|
3
7
|
data/ip6_del_list
|
4
8
|
data/ip_del_list
|
5
9
|
data/make_ip6_del.pl
|
6
10
|
data/make_ip_del.pl
|
7
11
|
data/make_tld_serv.pl
|
8
12
|
data/tld_serv_list
|
13
|
+
lib/whois.rb
|
14
|
+
lib/whois/answer.rb
|
9
15
|
lib/whois/answer/contact.rb
|
16
|
+
lib/whois/answer/parser.rb
|
17
|
+
lib/whois/answer/parser/README.rdoc
|
10
18
|
lib/whois/answer/parser/base.rb
|
11
19
|
lib/whois/answer/parser/blank.rb
|
12
|
-
lib/whois/answer/parser/README.rdoc
|
13
20
|
lib/whois/answer/parser/whois.crsnic.net.rb
|
14
21
|
lib/whois/answer/parser/whois.denic.de.rb
|
15
22
|
lib/whois/answer/parser/whois.nic.it.rb
|
16
23
|
lib/whois/answer/parser/whois.publicinterestregistry.net.rb
|
17
|
-
lib/whois/answer/parser.rb
|
18
24
|
lib/whois/answer/part.rb
|
19
25
|
lib/whois/answer/registrar.rb
|
20
26
|
lib/whois/answer/super_struct.rb
|
21
|
-
lib/whois/answer.rb
|
22
27
|
lib/whois/client.rb
|
23
28
|
lib/whois/definitions/ipv4.rb
|
24
29
|
lib/whois/definitions/ipv4.txt
|
@@ -27,6 +32,7 @@ lib/whois/definitions/ipv6.txt
|
|
27
32
|
lib/whois/definitions/tlds.rb
|
28
33
|
lib/whois/definitions/tlds.txt
|
29
34
|
lib/whois/errors.rb
|
35
|
+
lib/whois/server.rb
|
30
36
|
lib/whois/server/adapters/afilias.rb
|
31
37
|
lib/whois/server/adapters/arpa.rb
|
32
38
|
lib/whois/server/adapters/base.rb
|
@@ -37,14 +43,8 @@ lib/whois/server/adapters/pir.rb
|
|
37
43
|
lib/whois/server/adapters/standard.rb
|
38
44
|
lib/whois/server/adapters/verisign.rb
|
39
45
|
lib/whois/server/adapters/web.rb
|
40
|
-
lib/whois/server.rb
|
41
46
|
lib/whois/version.rb
|
42
47
|
lib/whois/whois.rb
|
43
|
-
lib/whois.rb
|
44
|
-
LICENSE.rdoc
|
45
|
-
Manifest
|
46
|
-
Rakefile
|
47
|
-
README.rdoc
|
48
48
|
tasks/server.rake
|
49
49
|
test/answer/parser/base_test.rb
|
50
50
|
test/answer/parser/blank_test.rb
|
@@ -70,12 +70,17 @@ test/server_test.rb
|
|
70
70
|
test/test_helper.rb
|
71
71
|
test/testcases/referrals/afilias.bz.txt
|
72
72
|
test/testcases/referrals/crsnic.com.txt
|
73
|
+
test/testcases/referrals/crsnic.com_more_servers.txt
|
74
|
+
test/testcases/referrals/crsnic.com_one_server.txt
|
73
75
|
test/testcases/referrals/niccc.cc.txt
|
74
76
|
test/testcases/referrals/pir.org.txt
|
75
77
|
test/testcases/responses/super_struct_test.rb
|
76
78
|
test/testcases/responses/whois.crsnic.net/available.txt
|
77
79
|
test/testcases/responses/whois.crsnic.net/registered.txt
|
80
|
+
test/testcases/responses/whois.denic.de/1-10-0_available.txt
|
81
|
+
test/testcases/responses/whois.denic.de/1-10-0_registered.txt
|
78
82
|
test/testcases/responses/whois.denic.de/available.txt
|
83
|
+
test/testcases/responses/whois.denic.de/error_invalid_domain_name.txt
|
79
84
|
test/testcases/responses/whois.denic.de/registered.txt
|
80
85
|
test/testcases/responses/whois.nic.it/available.txt
|
81
86
|
test/testcases/responses/whois.nic.it/registered.txt
|
data/Rakefile
CHANGED
@@ -19,12 +19,13 @@ end
|
|
19
19
|
Echoe.new(PKG_NAME, PKG_VERSION) do |p|
|
20
20
|
p.author = "Simone Carletti"
|
21
21
|
p.email = "weppos@weppos.net"
|
22
|
-
p.summary = "An intelligent pure Ruby WHOIS client."
|
22
|
+
p.summary = "An intelligent pure Ruby WHOIS client and parser."
|
23
23
|
p.url = "http://code.simonecarletti.com/whois"
|
24
24
|
p.project = RUBYFORGE_PROJECT
|
25
25
|
p.description = <<-EOD
|
26
|
-
Whois is an intelligent WHOIS client written in pure Ruby. \
|
27
|
-
It
|
26
|
+
Whois is an intelligent WHOIS client and parser written in pure Ruby. \
|
27
|
+
It can query registry data for ipv4, ipv6 and top level domains, \
|
28
|
+
parse and convert responses into easy-to-use Ruby objects.
|
28
29
|
EOD
|
29
30
|
|
30
31
|
p.need_zip = true
|
data/lib/whois.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#
|
2
2
|
# = Ruby Whois
|
3
3
|
#
|
4
|
-
# An intelligent pure Ruby WHOIS client.
|
4
|
+
# An intelligent pure Ruby WHOIS client and parser.
|
5
5
|
#
|
6
6
|
#
|
7
7
|
# Category:: Net
|
@@ -63,7 +63,7 @@ module Whois
|
|
63
63
|
def self.available?(qstring)
|
64
64
|
query(qstring).available?
|
65
65
|
rescue ParserNotFound => e
|
66
|
-
$stderr.puts "This method is not
|
66
|
+
$stderr.puts "This method is not supported for this kind of object.\n" +
|
67
67
|
"Use Whois.query('#{qstring}') instead."
|
68
68
|
nil
|
69
69
|
end
|
@@ -87,7 +87,7 @@ module Whois
|
|
87
87
|
def self.registered?(qstring)
|
88
88
|
query(qstring).registered?
|
89
89
|
rescue ParserNotFound => e
|
90
|
-
$stderr.puts "This method is not
|
90
|
+
$stderr.puts "This method is not supported for this kind of object.\n" +
|
91
91
|
"Use Whois.query('#{qstring}') instead."
|
92
92
|
nil
|
93
93
|
end
|
data/lib/whois/answer.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#
|
2
2
|
# = Ruby Whois
|
3
3
|
#
|
4
|
-
# An intelligent pure Ruby WHOIS client.
|
4
|
+
# An intelligent pure Ruby WHOIS client and parser.
|
5
5
|
#
|
6
6
|
#
|
7
7
|
# Category:: Net
|
@@ -109,6 +109,13 @@ module Whois
|
|
109
109
|
@parser ||= Parser.new(self)
|
110
110
|
end
|
111
111
|
|
112
|
+
# Returns <tt>true</tt> if the <tt>property</tt> passed as symbol
|
113
|
+
# is supported by any available parser for this answer.
|
114
|
+
# See also <tt>Whois::Answer::Parser.supported?</tt>.
|
115
|
+
def supported?(property)
|
116
|
+
parser.supported?(property)
|
117
|
+
end
|
118
|
+
|
112
119
|
|
113
120
|
protected
|
114
121
|
|
data/lib/whois/answer/contact.rb
CHANGED
data/lib/whois/answer/parser.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#
|
2
2
|
# = Ruby Whois
|
3
3
|
#
|
4
|
-
# An intelligent pure Ruby WHOIS client.
|
4
|
+
# An intelligent pure Ruby WHOIS client and parser.
|
5
5
|
#
|
6
6
|
#
|
7
7
|
# Category:: Net
|
@@ -46,10 +46,20 @@ module Whois
|
|
46
46
|
@answer = answer
|
47
47
|
end
|
48
48
|
|
49
|
+
# Returns an array with all host-specific parsers initialized for the parts
|
50
|
+
# contained into this parser.
|
51
|
+
# The array is lazy-initialized.
|
49
52
|
def parsers
|
50
53
|
@parsers ||= init_parsers
|
51
54
|
end
|
52
55
|
|
56
|
+
# Returns <tt>true</tt> if the <tt>property</tt> passed as symbol
|
57
|
+
# is supported by any available parser.
|
58
|
+
# See also <tt>Whois::Answer::Parser::Base.supported?</tt>.
|
59
|
+
def supported?(property)
|
60
|
+
parsers.any? { |parser| parser.supported?(property) }
|
61
|
+
end
|
62
|
+
|
53
63
|
|
54
64
|
protected
|
55
65
|
|
@@ -70,12 +80,21 @@ module Whois
|
|
70
80
|
# Loops through all answer parts, for each parts tries to guess
|
71
81
|
# the appropriate Whois::Answer::Parser::<parser> if it exists
|
72
82
|
# and returns the final array of server-specific parsers.
|
83
|
+
#
|
84
|
+
# Parsers are initialized in reverse order for performance reason.
|
85
|
+
# See also <tt>select_parser</tt>.
|
86
|
+
#
|
87
|
+
# parser.parts
|
88
|
+
# # => [whois.foo.com, whois.bar.com]
|
89
|
+
# parser.parsers
|
90
|
+
# # => [parser(whois.bar.com), parser(whois.foo.com)]
|
91
|
+
#
|
73
92
|
def init_parsers
|
74
|
-
answer.parts.map { |part| self.class.parser_for(part) }
|
93
|
+
answer.parts.reverse.map { |part| self.class.parser_for(part) }
|
75
94
|
end
|
76
95
|
|
77
96
|
def select_parser(method)
|
78
|
-
parsers.
|
97
|
+
parsers.each do |parser|
|
79
98
|
return parser if parser.method_registered?(method)
|
80
99
|
end
|
81
100
|
nil
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#
|
2
2
|
# = Ruby Whois
|
3
3
|
#
|
4
|
-
# An intelligent pure Ruby WHOIS client.
|
4
|
+
# An intelligent pure Ruby WHOIS client and parser.
|
5
5
|
#
|
6
6
|
#
|
7
7
|
# Category:: Net
|
@@ -50,6 +50,43 @@ module Whois
|
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
|
+
# Returns <tt>true</tt> if the <tt>property</tt> passed as symbol
|
54
|
+
# is supported by current parser.
|
55
|
+
#
|
56
|
+
# parser.supported? :disclaimer
|
57
|
+
# # => false
|
58
|
+
#
|
59
|
+
# parser.register_method(:disclaimer) {}
|
60
|
+
# parser.supported? :disclaimer
|
61
|
+
# # => true
|
62
|
+
#
|
63
|
+
# This method is different than <tt>respond_to?</tt>.
|
64
|
+
# While <tt>respond_to?</tt> always returns true for any registrable property,
|
65
|
+
# including those not effectively implemented,
|
66
|
+
# this method only returns <tt>true</tt> if the parser implements <tt>property</tt>.
|
67
|
+
# Also, <tt>supported?</tt> returns <tt>false</tt> if <tt>property</tt> exists as a method
|
68
|
+
# but it's not a property method.
|
69
|
+
#
|
70
|
+
# parser.respond_to?(:disclaimer)
|
71
|
+
# # => true
|
72
|
+
# parser.supported?(:disclaimer)
|
73
|
+
# # => false
|
74
|
+
#
|
75
|
+
# parser.register_method(:disclaimer) {}
|
76
|
+
# parser.respond_to?(:disclaimer)
|
77
|
+
# # => true
|
78
|
+
# parser.supported?(:disclaimer)
|
79
|
+
# # => true
|
80
|
+
#
|
81
|
+
# parser.respond_to?(:contact)
|
82
|
+
# # => true
|
83
|
+
# parser.supported?(:contact)
|
84
|
+
# # => false
|
85
|
+
#
|
86
|
+
def supported?(property)
|
87
|
+
method_registered?(property.to_s.to_sym)
|
88
|
+
end
|
89
|
+
|
53
90
|
|
54
91
|
# This is an internal method primaly used as a common access point
|
55
92
|
# to get the content to be parsed as a string.
|
@@ -1,12 +1,12 @@
|
|
1
1
|
#
|
2
2
|
# = Ruby Whois
|
3
3
|
#
|
4
|
-
# An intelligent pure Ruby WHOIS client.
|
4
|
+
# An intelligent pure Ruby WHOIS client and parser.
|
5
5
|
#
|
6
6
|
#
|
7
7
|
# Category:: Net
|
8
8
|
# Package:: Whois
|
9
|
-
# Author:: Aaron Mueller <mail@aaron-mueller.de>
|
9
|
+
# Author:: Aaron Mueller <mail@aaron-mueller.de>, Simone Carletti <weppos@weppos.net>
|
10
10
|
# License:: MIT License
|
11
11
|
#
|
12
12
|
#--
|
@@ -39,11 +39,11 @@ module Whois
|
|
39
39
|
end
|
40
40
|
|
41
41
|
register_method :registered? do
|
42
|
-
!ast['NotFound']
|
42
|
+
!(ast['NotFound'] || ast['Invalid'])
|
43
43
|
end
|
44
44
|
|
45
45
|
register_method :available? do
|
46
|
-
ast['NotFound']
|
46
|
+
ast['NotFound'] && !ast['Invalid']
|
47
47
|
end
|
48
48
|
|
49
49
|
register_method :created_on do
|
@@ -119,6 +119,7 @@ module Whois
|
|
119
119
|
|
120
120
|
def parse_content
|
121
121
|
parse_disclaimer ||
|
122
|
+
parse_invalid ||
|
122
123
|
parse_not_found ||
|
123
124
|
parse_pair(@ast) ||
|
124
125
|
parse_contact ||
|
@@ -127,8 +128,8 @@ module Whois
|
|
127
128
|
end
|
128
129
|
|
129
130
|
def parse_disclaimer
|
130
|
-
if @input.match?(/% Copyright \(c\)
|
131
|
-
|
131
|
+
if @input.match?(/% Copyright \(c\) *\d{4} by DENIC\n/)
|
132
|
+
@input.scan_until(/% Terms and Conditions of Use\n/)
|
132
133
|
lines = []
|
133
134
|
while @input.match?(/%/) && @input.scan(/%(.*)\n/)
|
134
135
|
lines << @input[1].strip unless @input[1].strip == ""
|
@@ -190,6 +191,14 @@ module Whois
|
|
190
191
|
@ast['NotFound'] = false
|
191
192
|
end
|
192
193
|
|
194
|
+
def parse_invalid
|
195
|
+
if @input.match?(/% ".*" is not a valid domain name\n/)
|
196
|
+
@input.scan(/%.*\n/)
|
197
|
+
return @ast['Invalid'] = true
|
198
|
+
end
|
199
|
+
@ast['Invalid'] = false
|
200
|
+
end
|
201
|
+
|
193
202
|
def error(message)
|
194
203
|
raise "#{message}: #{@input.peek(@input.string.length)}"
|
195
204
|
end
|
data/lib/whois/answer/part.rb
CHANGED
data/lib/whois/client.rb
CHANGED
data/lib/whois/errors.rb
CHANGED
data/lib/whois/server.rb
CHANGED