summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorkou <kou@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-07-22 05:41:33 +0000
committerkou <kou@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-07-22 05:41:33 +0000
commitbe7999fd3dd2868ff382a7611e978aa2f8ac61c2 (patch)
tree3e2486e8434f30b7281f1a61322c732f7b01c05f /lib
parent17743ce0a8a74095e4f111cff4c102d5d99b5a7a (diff)
* lib/rss/parser.rb (RSS::Parser#initialize): accept HTTP/FTP
URI and local file path too. * test/rss/test_parser.rb (RSS::TestParser#test_parse): test for the above. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8819 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib')
-rw-r--r--lib/rss/parser.rb32
1 files changed, 31 insertions, 1 deletions
diff --git a/lib/rss/parser.rb b/lib/rss/parser.rb
index 7e93c62f61..df268da1e7 100644
--- a/lib/rss/parser.rb
+++ b/lib/rss/parser.rb
@@ -1,4 +1,5 @@
require "forwardable"
+require "open-uri"
require "rss/rss"
@@ -77,7 +78,36 @@ module RSS
:do_validate=)
def initialize(rss, parser_class=self.class.default_parser)
- @parser = parser_class.new(rss)
+ @parser = parser_class.new(normalize_rss(rss))
+ end
+
+ private
+ def normalize_rss(rss)
+ return rss if maybe_xml?(rss)
+
+ uri = to_uri(rss)
+
+ if uri.respond_to?(:read)
+ uri.read
+ elsif !rss.tainted? and File.readable?(rss)
+ File.open(rss) {|f| f.read}
+ else
+ rss
+ end
+ end
+
+ def maybe_xml?(source)
+ source.is_a?(String) and /</ =~ source
+ end
+
+ def to_uri(rss)
+ return rss if rss.is_a?(::URI::Generic)
+
+ begin
+ URI(rss)
+ rescue ::URI::Error
+ rss
+ end
end
end