whois 1.0.10 → 1.0.11
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +17 -0
- data/Manifest +24 -0
- data/Rakefile +15 -15
- data/lib/whois.rb +3 -3
- data/lib/whois/answer/parser/NOTES.txt +1 -0
- data/lib/whois/answer/parser/whois.aero.rb +5 -5
- data/lib/whois/answer/parser/whois.afilias-grs.info.rb +5 -5
- data/lib/whois/answer/parser/whois.ai.rb +73 -0
- data/lib/whois/answer/parser/whois.dns.lu.rb +72 -0
- data/lib/whois/answer/parser/whois.hkdnr.net.hk.rb +81 -0
- data/lib/whois/answer/parser/whois.nic.af.rb +83 -0
- data/lib/whois/answer/parser/whois.nic.ag.rb +77 -0
- data/lib/whois/answer/parser/whois.nic.asia.rb +1 -1
- data/lib/whois/answer/parser/whois.nic.mx.rb +87 -0
- data/lib/whois/answer/parser/whois.nic.or.kr.rb +1 -1
- data/lib/whois/answer/parser/whois.nic.ve.rb +2 -2
- data/lib/whois/answer/parser/whois.rotld.ro.rb +2 -4
- data/lib/whois/version.rb +2 -2
- data/test/answer/parser/whois.aero_test.rb +37 -17
- data/test/answer/parser/whois.afilias-grs.info_test.rb +63 -28
- data/test/answer/parser/whois.ai_test.rb +58 -0
- data/test/answer/parser/whois.dns.lu_test.rb +70 -0
- data/test/answer/parser/whois.hkdnr.net.hk_test.rb +77 -0
- data/test/answer/parser/whois.nic.af_test.rb +84 -0
- data/test/answer/parser/whois.nic.ag_test.rb +84 -0
- data/test/answer/parser/whois.nic.asia_test.rb +9 -4
- data/test/answer/parser/whois.nic.mx_test.rb +84 -0
- data/test/answer/parser/whois.nic.or.kr_test.rb +2 -2
- data/test/answer/parser/whois.nic.ve_test.rb +10 -5
- data/test/answer/parser/whois.rotld.ro_test.rb +9 -4
- data/test/list_tld +6 -6
- data/test/testcases/responses/whois.ai/available.txt +2 -0
- data/test/testcases/responses/whois.ai/registered.txt +59 -0
- data/test/testcases/responses/whois.dns.lu/available.txt +26 -0
- data/test/testcases/responses/whois.dns.lu/registered.txt +57 -0
- data/test/testcases/responses/whois.hkdnr.net.hk/available.txt +1 -0
- data/test/testcases/responses/whois.hkdnr.net.hk/registered.txt +96 -0
- data/test/testcases/responses/whois.nic.af/available.txt +13 -0
- data/test/testcases/responses/whois.nic.af/registered.txt +56 -0
- data/test/testcases/responses/whois.nic.ag/available.txt +1 -0
- data/test/testcases/responses/whois.nic.ag/registered.txt +100 -0
- data/test/testcases/responses/whois.nic.mx/available.txt +11 -0
- data/test/testcases/responses/whois.nic.mx/registered.txt +58 -0
- data/whois.gemspec +8 -8
- metadata +41 -5
@@ -0,0 +1,83 @@
|
|
1
|
+
#
|
2
|
+
# = Ruby Whois
|
3
|
+
#
|
4
|
+
# An intelligent pure Ruby WHOIS client and parser.
|
5
|
+
#
|
6
|
+
#
|
7
|
+
# Category:: Net
|
8
|
+
# Package:: Whois
|
9
|
+
# Author:: Simone Carletti <weppos@weppos.net>
|
10
|
+
# License:: MIT License
|
11
|
+
#
|
12
|
+
#--
|
13
|
+
#
|
14
|
+
#++
|
15
|
+
|
16
|
+
|
17
|
+
require 'whois/answer/parser/base'
|
18
|
+
|
19
|
+
|
20
|
+
module Whois
|
21
|
+
class Answer
|
22
|
+
class Parser
|
23
|
+
|
24
|
+
#
|
25
|
+
# = whois.nic.af parser
|
26
|
+
#
|
27
|
+
# Parser for the whois.nic.af server.
|
28
|
+
#
|
29
|
+
# NOTE: This parser is just a stub and provides only a few basic methods
|
30
|
+
# to check for domain availability and get domain status.
|
31
|
+
# Please consider to contribute implementing missing methods.
|
32
|
+
# See WhoisNicIt parser for an explanation of all available methods
|
33
|
+
# and examples.
|
34
|
+
#
|
35
|
+
class WhoisNicAf < Base
|
36
|
+
|
37
|
+
property_supported :status do
|
38
|
+
@status ||= if content_for_scanner =~ /Status:\s+(.*)\n/
|
39
|
+
$1
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
property_supported :available? do
|
44
|
+
@available ||= (status == "Not Registered")
|
45
|
+
end
|
46
|
+
|
47
|
+
property_supported :registered? do
|
48
|
+
!available?
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
property_supported :created_on do
|
53
|
+
@created_on ||= if content_for_scanner =~ /Created:\s+(.*)\n/
|
54
|
+
Time.parse($1)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
property_supported :updated_on do
|
59
|
+
@updated_on ||= if content_for_scanner =~ /Modified:\s+(.*)\n/
|
60
|
+
Time.parse($1)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
property_supported :expires_on do
|
65
|
+
@expires_on ||= if content_for_scanner =~ /Expires:\s+(.*)\n/
|
66
|
+
Time.parse($1)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
property_supported :nameservers do
|
72
|
+
@nameservers ||= if content_for_scanner =~ /Name Servers:\n((.+\n)+)\n/
|
73
|
+
$1.split("\n").map(&:strip)
|
74
|
+
else
|
75
|
+
[]
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
#
|
2
|
+
# = Ruby Whois
|
3
|
+
#
|
4
|
+
# An intelligent pure Ruby WHOIS client and parser.
|
5
|
+
#
|
6
|
+
#
|
7
|
+
# Category:: Net
|
8
|
+
# Package:: Whois
|
9
|
+
# Author:: Simone Carletti <weppos@weppos.net>
|
10
|
+
# License:: MIT License
|
11
|
+
#
|
12
|
+
#--
|
13
|
+
#
|
14
|
+
#++
|
15
|
+
|
16
|
+
|
17
|
+
require 'whois/answer/parser/base'
|
18
|
+
|
19
|
+
|
20
|
+
module Whois
|
21
|
+
class Answer
|
22
|
+
class Parser
|
23
|
+
|
24
|
+
#
|
25
|
+
# = whois.nic.ag parser
|
26
|
+
#
|
27
|
+
# Parser for the whois.nic.ag server.
|
28
|
+
#
|
29
|
+
# NOTE: This parser is just a stub and provides only a few basic methods
|
30
|
+
# to check for domain availability and get domain status.
|
31
|
+
# Please consider to contribute implementing missing methods.
|
32
|
+
# See WhoisNicIt parser for an explanation of all available methods
|
33
|
+
# and examples.
|
34
|
+
#
|
35
|
+
class WhoisNicAg < Base
|
36
|
+
|
37
|
+
property_supported :status do
|
38
|
+
@status ||= content_for_scanner.scan(/Status:(.*?)\n+/).flatten
|
39
|
+
end
|
40
|
+
|
41
|
+
property_supported :available? do
|
42
|
+
@available ||= (content_for_scanner.strip == "NOT FOUND")
|
43
|
+
end
|
44
|
+
|
45
|
+
property_supported :registered? do
|
46
|
+
!available?
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
property_supported :created_on do
|
51
|
+
@created_on ||= if content_for_scanner =~ /Created On:(.*?)\n/
|
52
|
+
Time.parse($1)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
property_supported :updated_on do
|
57
|
+
@updated_on ||= if content_for_scanner =~ /Last Updated On:(.*?)\n/
|
58
|
+
Time.parse($1)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
property_supported :expires_on do
|
63
|
+
@expires_on ||= if content_for_scanner =~ /Expiration Date:(.*?)\n/
|
64
|
+
Time.parse($1)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
property_supported :nameservers do
|
70
|
+
@nameservers ||= content_for_scanner.scan(/Name Server:([^\s]*)\n/).flatten.map(&:downcase)
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
#
|
2
|
+
# = Ruby Whois
|
3
|
+
#
|
4
|
+
# An intelligent pure Ruby WHOIS client and parser.
|
5
|
+
#
|
6
|
+
#
|
7
|
+
# Category:: Net
|
8
|
+
# Package:: Whois
|
9
|
+
# Author:: Simone Carletti <weppos@weppos.net>
|
10
|
+
# License:: MIT License
|
11
|
+
#
|
12
|
+
#--
|
13
|
+
#
|
14
|
+
#++
|
15
|
+
|
16
|
+
|
17
|
+
require 'whois/answer/parser/base'
|
18
|
+
|
19
|
+
|
20
|
+
module Whois
|
21
|
+
class Answer
|
22
|
+
class Parser
|
23
|
+
|
24
|
+
#
|
25
|
+
# = whois.nic.mx parser
|
26
|
+
#
|
27
|
+
# Parser for the whois.nic.mx server.
|
28
|
+
#
|
29
|
+
# NOTE: This parser is just a stub and provides only a few basic methods
|
30
|
+
# to check for domain availability and get domain status.
|
31
|
+
# Please consider to contribute implementing missing methods.
|
32
|
+
# See WhoisNicIt parser for an explanation of all available methods
|
33
|
+
# and examples.
|
34
|
+
#
|
35
|
+
class WhoisNicMx < Base
|
36
|
+
|
37
|
+
property_supported :status do
|
38
|
+
@status ||= if available?
|
39
|
+
:available
|
40
|
+
else
|
41
|
+
:registered
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
property_supported :available? do
|
46
|
+
@available ||= !!(content_for_scanner =~ /Object_Not_Found/)
|
47
|
+
end
|
48
|
+
|
49
|
+
property_supported :registered? do
|
50
|
+
!available?
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
property_supported :created_on do
|
55
|
+
@created_on ||= if content_for_scanner =~ /Created On:\s+(.*)\n/
|
56
|
+
Time.parse($1)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# FIXME: the response contains localized data
|
61
|
+
# Expiration Date: 10-may-2011
|
62
|
+
# Last Updated On: 15-abr-2010 <--
|
63
|
+
# property_supported :updated_on do
|
64
|
+
# @updated_on ||= if content_for_scanner =~ /Last Updated On:\s+(.*)\n/
|
65
|
+
# Time.parse($1)
|
66
|
+
# end
|
67
|
+
# end
|
68
|
+
|
69
|
+
property_supported :expires_on do
|
70
|
+
@expires_on ||= if content_for_scanner =~ /Expiration Date:\s+(.*)\n/
|
71
|
+
Time.parse($1)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
property_supported :nameservers do
|
76
|
+
@nameservers ||= if content_for_scanner =~ /Name Servers:\n((.+\n)+)\n/
|
77
|
+
$1.scan(/DNS:\s+(.*)\n/).flatten.map(&:strip)
|
78
|
+
else
|
79
|
+
[]
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -50,13 +50,13 @@ module Whois
|
|
50
50
|
|
51
51
|
|
52
52
|
property_supported :created_on do
|
53
|
-
@created_on ||= if content_for_scanner =~ /Fecha de Creacion: (.*?)\n
|
53
|
+
@created_on ||= if content_for_scanner =~ /Fecha de Creacion: (.*?)\n/
|
54
54
|
Time.parse($1)
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
58
|
property_supported :updated_on do
|
59
|
-
@updated_on ||= if content_for_scanner =~ /Ultima Actualizacion: (.*?)\n
|
59
|
+
@updated_on ||= if content_for_scanner =~ /Ultima Actualizacion: (.*?)\n/
|
60
60
|
Time.parse($1)
|
61
61
|
end
|
62
62
|
end
|
data/lib/whois/version.rb
CHANGED
@@ -10,10 +10,15 @@ class AnswerParserWhoisAeroTest < Whois::Answer::Parser::TestCase
|
|
10
10
|
|
11
11
|
|
12
12
|
def test_status
|
13
|
-
|
14
|
-
|
15
|
-
assert_equal
|
16
|
-
|
13
|
+
parser = @klass.new(load_part('/registered.txt'))
|
14
|
+
expected = "OK"
|
15
|
+
assert_equal expected, parser.status
|
16
|
+
assert_equal expected, parser.instance_eval { @status }
|
17
|
+
|
18
|
+
parser = @klass.new(load_part('/available.txt'))
|
19
|
+
expected = nil
|
20
|
+
assert_equal expected, parser.status
|
21
|
+
assert_equal expected, parser.instance_eval { @status }
|
17
22
|
end
|
18
23
|
|
19
24
|
def test_available?
|
@@ -28,24 +33,39 @@ class AnswerParserWhoisAeroTest < Whois::Answer::Parser::TestCase
|
|
28
33
|
|
29
34
|
|
30
35
|
def test_created_on
|
31
|
-
|
32
|
-
|
33
|
-
assert_equal
|
34
|
-
|
36
|
+
parser = @klass.new(load_part('/registered.txt'))
|
37
|
+
expected = Time.parse("2002-03-26 06:48:27 UTC")
|
38
|
+
assert_equal expected, parser.created_on
|
39
|
+
assert_equal expected, parser.instance_eval { @created_on }
|
40
|
+
|
41
|
+
parser = @klass.new(load_part('/available.txt'))
|
42
|
+
expected = nil
|
43
|
+
assert_equal expected, parser.created_on
|
44
|
+
assert_equal expected, parser.instance_eval { @created_on }
|
35
45
|
end
|
36
46
|
|
37
47
|
def test_updated_on
|
38
|
-
|
39
|
-
|
40
|
-
assert_equal
|
41
|
-
|
48
|
+
parser = @klass.new(load_part('/registered.txt'))
|
49
|
+
expected = Time.parse("2008-03-05 14:32:18 UTC")
|
50
|
+
assert_equal expected, parser.updated_on
|
51
|
+
assert_equal expected, parser.instance_eval { @updated_on }
|
52
|
+
|
53
|
+
parser = @klass.new(load_part('/available.txt'))
|
54
|
+
expected = nil
|
55
|
+
assert_equal expected, parser.updated_on
|
56
|
+
assert_equal expected, parser.instance_eval { @updated_on }
|
42
57
|
end
|
43
58
|
|
44
59
|
def test_expires_on
|
45
|
-
|
46
|
-
|
47
|
-
assert_equal
|
48
|
-
|
60
|
+
parser = @klass.new(load_part('/registered.txt'))
|
61
|
+
expected = Time.parse("2010-03-26 06:48:27 UTC")
|
62
|
+
assert_equal expected, parser.expires_on
|
63
|
+
assert_equal expected, parser.instance_eval { @expires_on }
|
64
|
+
|
65
|
+
parser = @klass.new(load_part('/available.txt'))
|
66
|
+
expected = nil
|
67
|
+
assert_equal expected, parser.expires_on
|
68
|
+
assert_equal expected, parser.instance_eval { @expires_on }
|
49
69
|
end
|
50
70
|
|
51
71
|
|
@@ -61,4 +81,4 @@ class AnswerParserWhoisAeroTest < Whois::Answer::Parser::TestCase
|
|
61
81
|
assert_equal expected, parser.instance_eval { @nameservers }
|
62
82
|
end
|
63
83
|
|
64
|
-
end
|
84
|
+
end
|
@@ -13,10 +13,15 @@ end
|
|
13
13
|
class AnswerParserWhoisAfiliasGrsInfoBzTest < AnswerParserWhoisAfiliasGrsInfoTest
|
14
14
|
|
15
15
|
def test_status
|
16
|
-
|
17
|
-
|
18
|
-
assert_equal
|
19
|
-
|
16
|
+
parser = @klass.new(load_part('/bz/registered.txt'))
|
17
|
+
expected = ["CLIENT DELETE PROHIBITED", "CLIENT TRANSFER PROHIBITED", "CLIENT UPDATE PROHIBITED"]
|
18
|
+
assert_equal expected, parser.status
|
19
|
+
assert_equal expected, parser.instance_eval { @status }
|
20
|
+
|
21
|
+
parser = @klass.new(load_part('/bz/available.txt'))
|
22
|
+
expected = []
|
23
|
+
assert_equal expected, parser.status
|
24
|
+
assert_equal expected, parser.instance_eval { @status }
|
20
25
|
end
|
21
26
|
|
22
27
|
def test_available?
|
@@ -69,10 +74,15 @@ end
|
|
69
74
|
class AnswerParserWhoisAfiliasGrsInfoGiTest < AnswerParserWhoisAfiliasGrsInfoTest
|
70
75
|
|
71
76
|
def test_status
|
72
|
-
|
73
|
-
|
74
|
-
assert_equal
|
75
|
-
|
77
|
+
parser = @klass.new(load_part('/gi/registered.txt'))
|
78
|
+
expected = ["OK"]
|
79
|
+
assert_equal expected, parser.status
|
80
|
+
assert_equal expected, parser.instance_eval { @status }
|
81
|
+
|
82
|
+
parser = @klass.new(load_part('/gi/available.txt'))
|
83
|
+
expected = []
|
84
|
+
assert_equal expected, parser.status
|
85
|
+
assert_equal expected, parser.instance_eval { @status }
|
76
86
|
end
|
77
87
|
|
78
88
|
def test_available?
|
@@ -125,10 +135,15 @@ end
|
|
125
135
|
class AnswerParserWhoisAfiliasGrsInfoHnTest < AnswerParserWhoisAfiliasGrsInfoTest
|
126
136
|
|
127
137
|
def test_status
|
128
|
-
|
129
|
-
|
130
|
-
assert_equal
|
131
|
-
|
138
|
+
parser = @klass.new(load_part('/hn/registered.txt'))
|
139
|
+
expected = ["CLIENT DELETE PROHIBITED", "CLIENT TRANSFER PROHIBITED", "CLIENT UPDATE PROHIBITED"]
|
140
|
+
assert_equal expected, parser.status
|
141
|
+
assert_equal expected, parser.instance_eval { @status }
|
142
|
+
|
143
|
+
parser = @klass.new(load_part('/hn/available.txt'))
|
144
|
+
expected = []
|
145
|
+
assert_equal expected, parser.status
|
146
|
+
assert_equal expected, parser.instance_eval { @status }
|
132
147
|
end
|
133
148
|
|
134
149
|
def test_available?
|
@@ -181,10 +196,15 @@ end
|
|
181
196
|
class AnswerParserWhoisAfiliasGrsInfoLcTest < AnswerParserWhoisAfiliasGrsInfoTest
|
182
197
|
|
183
198
|
def test_status
|
184
|
-
|
185
|
-
|
186
|
-
assert_equal
|
187
|
-
|
199
|
+
parser = @klass.new(load_part('/lc/registered.txt'))
|
200
|
+
expected = ["OK"]
|
201
|
+
assert_equal expected, parser.status
|
202
|
+
assert_equal expected, parser.instance_eval { @status }
|
203
|
+
|
204
|
+
parser = @klass.new(load_part('/lc/available.txt'))
|
205
|
+
expected = []
|
206
|
+
assert_equal expected, parser.status
|
207
|
+
assert_equal expected, parser.instance_eval { @status }
|
188
208
|
end
|
189
209
|
|
190
210
|
def test_available?
|
@@ -237,10 +257,15 @@ end
|
|
237
257
|
class AnswerParserWhoisAfiliasGrsInfoMnTest < AnswerParserWhoisAfiliasGrsInfoTest
|
238
258
|
|
239
259
|
def test_status
|
240
|
-
|
241
|
-
|
242
|
-
assert_equal
|
243
|
-
|
260
|
+
parser = @klass.new(load_part('/mn/registered.txt'))
|
261
|
+
expected = ["CLIENT DELETE PROHIBITED", "CLIENT TRANSFER PROHIBITED", "CLIENT UPDATE PROHIBITED"]
|
262
|
+
assert_equal expected, parser.status
|
263
|
+
assert_equal expected, parser.instance_eval { @status }
|
264
|
+
|
265
|
+
parser = @klass.new(load_part('/mn/available.txt'))
|
266
|
+
expected = []
|
267
|
+
assert_equal expected, parser.status
|
268
|
+
assert_equal expected, parser.instance_eval { @status }
|
244
269
|
end
|
245
270
|
|
246
271
|
def test_available?
|
@@ -293,10 +318,15 @@ end
|
|
293
318
|
class AnswerParserWhoisAfiliasGrsInfoScTest < AnswerParserWhoisAfiliasGrsInfoTest
|
294
319
|
|
295
320
|
def test_status
|
296
|
-
|
297
|
-
|
298
|
-
assert_equal
|
299
|
-
|
321
|
+
parser = @klass.new(load_part('/sc/registered.txt'))
|
322
|
+
expected = ["CLIENT DELETE PROHIBITED", "CLIENT TRANSFER PROHIBITED", "CLIENT UPDATE PROHIBITED"]
|
323
|
+
assert_equal expected, parser.status
|
324
|
+
assert_equal expected, parser.instance_eval { @status }
|
325
|
+
|
326
|
+
parser = @klass.new(load_part('/sc/available.txt'))
|
327
|
+
expected = []
|
328
|
+
assert_equal expected, parser.status
|
329
|
+
assert_equal expected, parser.instance_eval { @status }
|
300
330
|
end
|
301
331
|
|
302
332
|
def test_available?
|
@@ -349,10 +379,15 @@ end
|
|
349
379
|
class AnswerParserWhoisAfiliasGrsInfoVcTest < AnswerParserWhoisAfiliasGrsInfoTest
|
350
380
|
|
351
381
|
def test_status
|
352
|
-
|
353
|
-
|
354
|
-
assert_equal
|
355
|
-
|
382
|
+
parser = @klass.new(load_part('/vc/registered.txt'))
|
383
|
+
expected = ["CLIENT DELETE PROHIBITED", "CLIENT TRANSFER PROHIBITED", "CLIENT UPDATE PROHIBITED"]
|
384
|
+
assert_equal expected, parser.status
|
385
|
+
assert_equal expected, parser.instance_eval { @status }
|
386
|
+
|
387
|
+
parser = @klass.new(load_part('/vc/available.txt'))
|
388
|
+
expected = []
|
389
|
+
assert_equal expected, parser.status
|
390
|
+
assert_equal expected, parser.instance_eval { @status }
|
356
391
|
end
|
357
392
|
|
358
393
|
def test_available?
|