-
Notifications
You must be signed in to change notification settings - Fork 23
/
feed_validator.rb
113 lines (96 loc) · 3.09 KB
/
feed_validator.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
105
106
107
108
109
110
111
112
113
module W3CValidators
class FeedValidator < Validator
FEED_VALIDATOR_URI = 'http://validator.w3.org/feed/check.cgi'
# Create a new instance of the FeedValidator.
#
# ==== Options
# You can pass in your own validator's URI (i.e.
# <tt>FeedValidator.new(:validator_uri => 'http://localhost/check')</tt>).
#
# See Validator#new for proxy server options.
def initialize(options = {})
if options[:validator_uri]
@validator_uri = URI.parse(options[:validator_uri])
options.delete(options[:validator_uri])
else
@validator_uri = URI.parse(FEED_VALIDATOR_URI)
end
super(options)
end
# Validate a feed URI using a +SOAP+ request.
#
# Returns W3CValidators::Results.
def validate_uri(url)
return validate({:url => url})
end
# Validate a feed from a string.
#
# Returns W3CValidators::Results.
def validate_text(text)
return validate({:rawdata => text})
end
# Validate a local feed file.
#
# +file_path+ may be either the fully-expanded path to the file or
# an IO object (like File).
#
# Returns W3CValidators::Results.
def validate_file(file_path)
if file_path.respond_to? :read
src = file_path.read
else
src = read_local_file(file_path)
end
return validate_text(src)
end
protected
def validate(options) # :nodoc:
options = get_request_options(options)
response = send_request(options, :get)
@results = parse_soap_response(response.body)
@results
end
# Perform sanity checks on request params
def get_request_options(options) # :nodoc:
options = @options.merge(options)
options[:output] = SOAP_OUTPUT_PARAM
unless options[:url] or options[:rawdata]
raise ArgumentError, "an url or rawdata is required."
end
# URL should be a string. If it is a URL object, .to_s will
# be seamless; if it is not an exception will be raised.
if options[:url] and not options[:url].kind_of?(String)
options[:url] = options[:url].to_s
end
options
end
# Parse the SOAP XML response.
#
# +response+ must be a Net::HTTPResponse.
#
# Returns W3CValidators::Results.
def parse_soap_response(response) # :nodoc:
doc = Nokogiri::XML(response)
doc.remove_namespaces!
result_params = {}
{:uri => 'uri', :checked_by => 'checkedby', :validity => 'validity'}.each do |local_key, remote_key|
if val = doc.at('feedvalidationresponse ' + remote_key)
result_params[local_key] = val.text
end
end
results = Results.new(result_params)
[:warning, :error].each do |msg_type|
doc.css(msg_type.to_s).each do |message|
message_params = {}
message.children.each do |el|
message_params[el.name.to_sym] = el.text unless el.blank?
end
results.add_message(msg_type, message_params)
end
end
return results
rescue Exception => e
handle_exception e
end
end
end