aboutsummaryrefslogtreecommitdiffstats
path: root/lib/open-uri.rb
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-02-05 10:44:05 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-02-05 10:44:05 +0000
commitda19d16b1c5efa1b2d9076e245ababc5ec9ad2dd (patch)
treeb98bfdb065abb950d4d74974848aef090b33dbed /lib/open-uri.rb
parent5504f490a6a2684bcacadee836c6933243e65a4f (diff)
downloadruby-da19d16b1c5efa1b2d9076e245ababc5ec9ad2dd.tar.gz
* lib/open-uri.rb: dispatch code restructured to make it openable
that has `open' method. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3448 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/open-uri.rb')
-rw-r--r--lib/open-uri.rb84
1 files changed, 39 insertions, 45 deletions
diff --git a/lib/open-uri.rb b/lib/open-uri.rb
index e8cb3a24b2..a328ecec9c 100644
--- a/lib/open-uri.rb
+++ b/lib/open-uri.rb
@@ -58,28 +58,42 @@ require 'uri'
require 'stringio'
require 'time'
-module OpenURI
- def OpenURI.open_dispatch(name, *rest, &block) #:nodoc:
- DispatchTable.each {|cond, meth|
- return meth.call(name, *rest, &block) if cond === name
- }
- return open_uri_original_open(name, *rest, &block)
+module Kernel
+ private
+ alias open_uri_original_open open # :nodoc:
+
+ # makes possible to open URIs.
+ # If the first argument is URI::HTTP, URI::FTP or
+ # String beginning with http:// or ftp://,
+ # the URI is opened.
+ # The opened file object is extended by OpenURI::Meta.
+ def open(name, *rest, &block)
+ if name.respond_to?("open")
+ name.open(*rest, &block)
+ elsif name.respond_to?("to_str") && %r{\A(http|ftp)://} =~ name
+ OpenURI.open_uri(name, *rest, &block)
+ else
+ open_uri_original_open(name, *rest, &block)
+ end
end
+end
- def OpenURI.open_uri(name, *rest) #:nodoc:
- uri = URI::Generic === name ? name : URI.parse(name)
+module OpenURI
+ def OpenURI.scan_open_optional_arguments(*rest) # :nodoc:
if !rest.empty? && (String === rest.first || Integer === rest.first)
mode = rest.shift
if !rest.empty? && Integer === rest.first
perm = rest.shift
end
end
- if !rest.empty? && Hash === rest.first
- options = rest.shift
- end
- if !rest.empty?
- raise ArgumentError.new("extra arguments")
- end
+ return mode, perm, rest
+ end
+
+ def OpenURI.open_uri(name, *rest) # :nodoc:
+ uri = URI::Generic === name ? name : URI.parse(name)
+ mode, perm, rest = OpenURI.scan_open_optional_arguments(*rest)
+ options = rest.shift if !rest.empty? && Hash === rest.first
+ raise ArgumentError.new("extra arguments") if !rest.empty?
unless mode == nil ||
mode == 'r' || mode == 'rb' ||
@@ -99,7 +113,7 @@ module OpenURI
end
end
- def OpenURI.open_loop(uri, options) #:nodoc:
+ def OpenURI.open_loop(uri, options) # :nodoc:
header = {}
options.each {|k, v|
if String === k
@@ -146,13 +160,7 @@ module OpenURI
io
end
- DispatchTable = [
- [URI::HTTP, method(:open_uri)],
- [URI::FTP, method(:open_uri)],
- [%r{\A(http|ftp)://}, method(:open_uri)],
- ]
-
- class Redirect < StandardError #:nodoc:
+ class Redirect < StandardError # :nodoc:
def initialize(uri)
@uri = uri
end
@@ -167,7 +175,7 @@ module OpenURI
attr_reader :io
end
- class Buffer #:nodoc:
+ class Buffer # :nodoc:
def initialize
@io = StringIO.new
end
@@ -192,7 +200,7 @@ module OpenURI
# Mixin for holding meta-information.
module Meta
- def Meta.init(obj, src=nil) #:nodoc:
+ def Meta.init(obj, src=nil) # :nodoc:
obj.extend Meta
obj.instance_eval {
@base_uri = nil
@@ -218,7 +226,7 @@ module OpenURI
# The Hash keys are downcased for canonicalization.
attr_reader :meta
- def meta_add_field(name, value) #:nodoc:
+ def meta_add_field(name, value) # :nodoc:
@meta[name.downcase] = value
end
@@ -236,7 +244,7 @@ module OpenURI
RE_QUOTED_STRING = %r{"(?:[\r\n\t !#-\[\]-~\x80-\xff]|\\[\x00-\x7f])"}n
RE_PARAMETERS = %r{(?:;#{RE_LWS}?#{RE_TOKEN}#{RE_LWS}?=#{RE_LWS}?(?:#{RE_TOKEN}|#{RE_QUOTED_STRING})#{RE_LWS}?)*}n
- def content_type_parse #:nodoc:
+ def content_type_parse # :nodoc:
v = @meta['content-type']
if v && %r{\A#{RE_LWS}?(#{RE_TOKEN})#{RE_LWS}?/(#{RE_TOKEN})#{RE_LWS}?(#{RE_PARAMETERS})\z}o =~ v
type = $1.downcase
@@ -290,8 +298,8 @@ module OpenURI
# Mixin for URIs.
module OpenRead
# opens the URI.
- def open(options={}, &block)
- OpenURI.open_uri(self, options, &block)
+ def open(*rest, &block)
+ OpenURI.open_uri(self, *rest, &block)
end
# reads a content of the URI.
@@ -333,11 +341,11 @@ module URI
end
class HTTP
- def direct_open(buf, header) #:nodoc:
+ def direct_open(buf, header) # :nodoc:
proxy_open(buf, request_uri, header)
end
- def proxy_open(buf, uri, header) #:nodoc:
+ def proxy_open(buf, uri, header) # :nodoc:
require 'net/http'
resp = Net::HTTP.start(self.host, self.port) {|http|
http.get(uri.to_s, header) {|str| buf << str}
@@ -362,7 +370,7 @@ module URI
end
class FTP
- def direct_open(buf, header) #:nodoc:
+ def direct_open(buf, header) # :nodoc:
require 'net/ftp'
# xxx: header is discarded.
# todo: extract user/passwd from .netrc.
@@ -380,17 +388,3 @@ module URI
include OpenURI::OpenRead
end
end
-
-module Kernel
- private
- alias open_uri_original_open open
-
- # makes possible to open URIs.
- # If the first argument is URI::HTTP, URI::FTP or
- # String beginning with http:// or ftp://,
- # the URI is opened.
- # The opened file object is extended by OpenURI::Meta.
- def open(name, *rest, &block)
- OpenURI.open_dispatch(name, *rest, &block)
- end
-end