-
-
Notifications
You must be signed in to change notification settings - Fork 283
/
whois.nic.it.rb
104 lines (85 loc) · 2.48 KB
/
whois.nic.it.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#--
# Ruby Whois
#
# An intelligent pure Ruby WHOIS client and parser.
#
# Copyright (c) 2009-2012 Simone Carletti <weppos@weppos.net>
#++
require 'whois/record/scanners/base'
module Whois
class Record
module Scanners
class WhoisNicIt < Base
self.tokenizers += [
:skip_empty_line,
:scan_response_unavailable,
:scan_disclaimer,
:scan_keyvalue,
:scan_section,
]
tokenizer :scan_response_unavailable do
if @input.scan(/Service temporarily unavailable\.\n/)
@ast["response:unavailable"] = true
end
end
tokenizer :scan_disclaimer do
if @input.match?(/\*(.*?)\*\n/)
@ast["Disclaimer"] = _scan_lines_to_array(/\*(.*?)\*\n/).select { |line| line =~ /\w+/ }.join(" ")
end
end
tokenizer :scan_section do
if @input.scan(/([^:]+?)\n/)
section = @input[1].strip
content = parse_section_pairs ||
parse_section_items
@input.match?(/\n+/) || error!("Unexpected end of section")
@ast[section] = content
end
end
private
def parse_section_items
if @input.match?(/(\s+)([^:]+?)\n/)
items = []
indentation = @input[1].length
while item = parse_section_items_item(indentation)
items << item
end
items
end
end
def parse_section_items_item(indentation)
if @input.scan(/\s{#{indentation}}(.+)\n/)
@input[1]
end
end
def parse_section_pairs
contents = {}
while content = parse_section_pair
contents.merge!(content)
end
if !contents.empty?
contents
else
false
end
end
def parse_section_pair
if @input.scan(/(\s+)(.+?):(\s+)(.*?)\n/)
key = @input[2].strip
values = [@input[4].strip]
indentation = @input[1].length + @input[2].length + 1 + @input[3].length
while value = parse_section_pair_newlinevalue(indentation)
values << value
end
{ key => values.join("\n") }
end
end
def parse_section_pair_newlinevalue(indentation)
if @input.scan(/\s{#{indentation}}(.+)\n/)
@input[1]
end
end
end
end
end
end