1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* lib/uri.rb: Documented (thanks Dmitry V. Sabanin).

* lib/uri/common.rb: Ditto.
 * lib/uri/ftp.rb: Ditto.
 * lib/uri/generic.rb: Ditto.
 * lib/uri/http.rb: Ditto.
 * lib/uri/https.rb: Ditto.
 * lib/uri/ldap.rb: Ditto.
 * lib/uri/mailto.rb: Ditto.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6015 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
gsinclair 2004-03-24 11:53:31 +00:00
parent 5e23ff603f
commit 42ad5216ec
9 changed files with 968 additions and 974 deletions

View file

@ -1,3 +1,14 @@
Wed Mar 24 20:49:00 2004 Gavin Sinclair <gsinclair@soyabean.com.au>
* lib/uri.rb: Documented (thanks Dmitry V. Sabanin).
* lib/uri/common.rb: Ditto.
* lib/uri/ftp.rb: Ditto.
* lib/uri/generic.rb: Ditto.
* lib/uri/http.rb: Ditto.
* lib/uri/https.rb: Ditto.
* lib/uri/ldap.rb: Ditto.
* lib/uri/mailto.rb: Ditto.
Wed Mar 24 18:48:05 2004 Nobuyoshi Nakada <nobu@ruby-lang.org>
* lib/mkmf.rb ($ruby, $topdir, $hdrdir): should not be affected by

View file

@ -1,37 +1,23 @@
#
# $Id$
# = uri.rb
#
# Copyright (c) 2001 akira yamada <akira@ruby-lang.org>
# You can redistribute it and/or modify it under the same term as Ruby.
# URI support for Ruby
#
# Author:: Akira Yamada <akira@ruby-lang.org>
# Documentation:: Akira Yamada <akira@ruby-lang.org>, Dmitry V. Sabanin <sdmitry@lrn.ru>
# License::
# Copyright (c) 2001 akira yamada <akira@ruby-lang.org>
# You can redistribute it and/or modify it under the same term as Ruby.
# Revision:: $Id$
#
# See URI for documentation
#
=begin
Copyright (c) 2001 akira yamada <akira@ruby-lang.org>
You can redistribute it and/or modify it under the same term as Ruby.
= URI - URI support for Ruby
=end
module URI
VERSION_CODE = '000911'.freeze
VERSION = VERSION_CODE.scan(/../).collect{|n| n.to_i}.join('.').freeze
end
=begin
== Components
* ((<URI>)) Module
* ((<URI::Generic>)) Class
* ((<URI::FTP>)) Class
* ((<URI::HTTP>)) Class
* ((<URI::HTTPS>)) Class
* ((<URI::LDAP>)) Class
* ((<URI::MailTo>)) Class
=end
require 'uri/common'
require 'uri/generic'
require 'uri/ftp'

View file

@ -1,19 +1,19 @@
# = uri/common.rb
#
# $Id$
# Author:: Akira Yamada <akira@ruby-lang.org>
# Revision:: $Id$
# License::
# You can redistribute it and/or modify it under the same term as Ruby.
#
# Copyright (c) 2001 akira yamada <akira@ruby-lang.org>
# You can redistribute it and/or modify it under the same term as Ruby.
#
=begin
== URI
=end
module URI
module REGEXP
#
# Patterns used to parse URI's
#
module PATTERN
# :stopdoc:
# RFC 2396 (URI Generic Syntax)
# RFC 2732 (IPv6 Literal Addresses in URL's)
# RFC 2373 (IPv6 Addressing Architecture)
@ -143,23 +143,23 @@ module URI
# XXX:
X_ABS_URI = "
(#{PATTERN::SCHEME}): (?# 1: scheme)
(?:
(#{PATTERN::OPAQUE_PART}) (?# 2: opaque)
|
(?:(?:
//(?:
(?:(?:(#{PATTERN::USERINFO})@)? (?# 3: userinfo)
(?:(#{PATTERN::HOST})(?::(\\d*))?))?(?# 4: host, 5: port)
|
(#{PATTERN::REG_NAME}) (?# 6: registry)
)
|
(?!//)) (?# XXX: '//' is the mark for hostport)
(#{PATTERN::ABS_PATH})? (?# 7: path)
)(?:\\?(#{PATTERN::QUERY}))? (?# 8: query)
)
(?:\\#(#{PATTERN::FRAGMENT}))? (?# 9: fragment)
(#{PATTERN::SCHEME}): (?# 1: scheme)
(?:
(#{PATTERN::OPAQUE_PART}) (?# 2: opaque)
|
(?:(?:
//(?:
(?:(?:(#{PATTERN::USERINFO})@)? (?# 3: userinfo)
(?:(#{PATTERN::HOST})(?::(\\d*))?))?(?# 4: host, 5: port)
|
(#{PATTERN::REG_NAME}) (?# 6: registry)
)
|
(?!//)) (?# XXX: '//' is the mark for hostport)
(#{PATTERN::ABS_PATH})? (?# 7: path)
)(?:\\?(#{PATTERN::QUERY}))? (?# 8: query)
)
(?:\\#(#{PATTERN::FRAGMENT}))? (?# 9: fragment)
"
X_REL_URI = "
(?:
@ -179,13 +179,16 @@ module URI
(?:\\?(#{PATTERN::QUERY}))? (?# 7: query)
(?:\\#(#{PATTERN::FRAGMENT}))? (?# 8: fragment)
"
# :startdoc:
end # PATTERN
# :stopdoc:
# for URI::split
ABS_URI = Regexp.new('^' + PATTERN::X_ABS_URI + '$', #'
Regexp::EXTENDED, 'N').freeze
Regexp::EXTENDED, 'N').freeze
REL_URI = Regexp.new('^' + PATTERN::X_REL_URI + '$', #'
Regexp::EXTENDED, 'N').freeze
Regexp::EXTENDED, 'N').freeze
# for URI::extract
URI_REF = Regexp.new(PATTERN::URI_REF, false, 'N').freeze
@ -195,7 +198,7 @@ module URI
# for URI::escape/unescape
ESCAPED = Regexp.new(PATTERN::ESCAPED, false, 'N').freeze
UNSAFE = Regexp.new("[^#{PATTERN::UNRESERVED}#{PATTERN::RESERVED}]",
false, 'N').freeze
false, 'N').freeze
# for Generic#initialize
SCHEME = Regexp.new("^#{PATTERN::SCHEME}$", false, 'N').freeze #"
@ -208,32 +211,33 @@ module URI
REL_PATH = Regexp.new("^#{PATTERN::REL_PATH}$", false, 'N').freeze #"
QUERY = Regexp.new("^#{PATTERN::QUERY}$", false, 'N').freeze #"
FRAGMENT = Regexp.new("^#{PATTERN::FRAGMENT}$", false, 'N').freeze #"
# :startdoc:
end # REGEXP
module Util
def make_components_hash(klass, array_hash)
tmp = {}
if array_hash.kind_of?(Array) &&
array_hash.size == klass.component.size - 1
klass.component[1..-1].each_index do |i|
begin
tmp[klass.component[i + 1]] = array_hash[i].clone
rescue TypeError
tmp[klass.component[i + 1]] = array_hash[i]
end
end
array_hash.size == klass.component.size - 1
klass.component[1..-1].each_index do |i|
begin
tmp[klass.component[i + 1]] = array_hash[i].clone
rescue TypeError
tmp[klass.component[i + 1]] = array_hash[i]
end
end
elsif array_hash.kind_of?(Hash)
array_hash.each do |key, value|
begin
tmp[key] = value.clone
rescue TypeError
tmp[key] = value
end
end
array_hash.each do |key, value|
begin
tmp[key] = value.clone
rescue TypeError
tmp[key] = value
end
end
else
raise ArgumentError,
"expected Array of or Hash of components of #{klass.to_s} (#{klass.component[1..-1].join(', ')})"
raise ArgumentError,
"expected Array of or Hash of components of #{klass.to_s} (#{klass.component[1..-1].join(', ')})"
end
tmp[:scheme] = klass.to_s.sub(/\A.*::/, '').downcase
@ -245,24 +249,72 @@ module URI
module Escape
include REGEXP
#
# == Synopsis
#
# URI.escape(str [, unsafe])
#
# == Args
#
# +str+::
# String to replaces in.
# +unsafe+::
# Regexp that matches all symbols that must be replaced with codes.
# By default uses <tt>REGEXP::SAFE</tt>.
#
# == Description
#
# Escapes the string, replacing all unsafe characters with codes.
#
# == Usage
#
# require 'uri'
#
# enc_uri = URI.escape("http://foobar.com/?a=\11\15")
# p enc_uri
# # => "http://foobar.com/?a=%09%0D"
#
# p URI.unescape(enc_uri)
# # => "http://foobar.com/?a=\t\r"
#
def escape(str, unsafe = UNSAFE)
unless unsafe.kind_of?(Regexp)
# perhaps unsafe is String object
unsafe = Regexp.new(Regexp.quote(unsafe), false, 'N')
# perhaps unsafe is String object
unsafe = Regexp.new(Regexp.quote(unsafe), false, 'N')
end
str.gsub(unsafe) do |us|
tmp = ''
us.each_byte do |uc|
tmp << sprintf('%%%02X', uc)
end
tmp
tmp = ''
us.each_byte do |uc|
tmp << sprintf('%%%02X', uc)
end
tmp
end
end
alias encode escape
#
# == Synopsis
#
# URI.unescape(str)
#
# == Args
#
# +str+::
# Unescapes the string.
#
# == Usage
#
# require 'uri'
#
# enc_uri = URI.escape("http://foobar.com/?a=\11\15")
# p enc_uri
# # => "http://foobar.com/?a=%09%0D"
#
# p URI.unescape(enc_uri)
# # => "http://foobar.com/?a=\t\r"
#
def unescape(str)
str.gsub(ESCAPED) do
$&[1,2].hex.chr
$&[1,2].hex.chr
end
end
alias decode unescape
@ -272,20 +324,55 @@ module URI
extend Escape
@@schemes = {}
#
# Base class for all URI exceptions.
#
class Error < StandardError; end
class InvalidURIError < Error; end # it is not URI.
class InvalidComponentError < Error; end # it is not component of URI.
class BadURIError < Error; end # the URI is valid but it is bad for the position.
=begin
=== Methods
--- URI::split(uri)
=end
#
# Not a URI.
#
class InvalidURIError < Error; end
#
# Not a URI component.
#
class InvalidComponentError < Error; end
#
# URI is valid, bad usage is not.
#
class BadURIError < Error; end
#
# == Synopsis
#
# URI::split(uri)
#
# == Args
#
# +uri+::
# String with URI.
#
# == Description
#
# Splits the string on following parts and returns array with result:
#
# * Scheme
# * Userinfo
# * Host
# * Port
# * Registry
# * Path
# * Opaque
# * Query
# * Fragment
#
# == Usage
#
# require 'uri'
#
# p URI.split("http://www.ruby-lang.org/")
# # => ["http", nil, "www.ruby-lang.org", nil, nil, "/", nil, nil, nil]
#
def self.split(uri)
case uri
when ''
@ -293,7 +380,7 @@ module URI
when ABS_URI
scheme, opaque, userinfo, host, port,
registry, path, query, fragment = $~[1..-1]
registry, path, query, fragment = $~[1..-1]
# URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ]
@ -308,12 +395,12 @@ module URI
# server = [ [ userinfo "@" ] hostport ]
if !scheme
raise InvalidURIError,
"bad URI(absolute but no scheme): #{uri}"
raise InvalidURIError,
"bad URI(absolute but no scheme): #{uri}"
end
if !opaque && (!path && (!host && !registry))
raise InvalidURIError,
"bad URI(absolute but no path): #{uri}"
raise InvalidURIError,
"bad URI(absolute but no path): #{uri}"
end
when REL_URI
@ -321,13 +408,13 @@ module URI
opaque = nil
userinfo, host, port, registry,
rel_segment, abs_path, query, fragment = $~[1..-1]
rel_segment, abs_path, query, fragment = $~[1..-1]
if rel_segment && abs_path
path = rel_segment + abs_path
path = rel_segment + abs_path
elsif rel_segment
path = rel_segment
path = rel_segment
elsif abs_path
path = abs_path
path = abs_path
end
# URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ]
@ -348,41 +435,83 @@ module URI
path = '' if !path && !opaque # (see RFC2396 Section 5.2)
ret = [
scheme,
userinfo, host, port, # X
registry, # X
path, # Y
opaque, # Y
userinfo, host, port, # X
registry, # X
path, # Y
opaque, # Y
query,
fragment
]
return ret
end
=begin
--- URI::parse(uri_str)
=end
#
# == Synopsis
#
# URI::parse(uri_str)
#
# == Args
#
# +uri_str+::
# String with URI.
#
# == Description
#
# Creates one of the URI's subclasses instance from the string.
#
# == Raises
#
# URI::InvalidURIError
# Raised if URI given is not a correct one.
#
# == Usage
#
# require 'uri'
#
# uri = URI.parse("http://www.ruby-lang.org/")
# p uri
# # => #<URI::HTTP:0x202281be URL:http://www.ruby-lang.org/>
# p uri.scheme
# # => "http"
# p uri.host
# # => "www.ruby-lang.org"
#
def self.parse(uri)
scheme, userinfo, host, port,
registry, path, opaque, query, fragment = self.split(uri)
if scheme && @@schemes.include?(scheme.upcase)
@@schemes[scheme.upcase].new(scheme, userinfo, host, port,
registry, path, opaque, query,
fragment)
registry, path, opaque, query,
fragment)
else
Generic.new(scheme, userinfo, host, port,
registry, path, opaque, query,
fragment)
registry, path, opaque, query,
fragment)
end
end
=begin
--- URI::join(str[, str, ...])
=end
#
# == Synopsis
#
# URI::join(str[, str, ...])
#
# == Args
#
# +str+::
# String(s) to work with
#
# == Description
#
# Joins URIs.
#
# == Usage
#
# require 'uri'
#
# p URI.join("http:/localhost/","main.rbx")
# # => #<URI::HTTP:0x2022ac02 URL:http:/localhost/main.php>
#
def self.join(*str)
u = self.parse(str[0])
str[1 .. -1].each do |x|
@ -391,11 +520,30 @@ module URI
u
end
=begin
--- URI::extract(str[, schemes])
=end
#
# == Synopsis
#
# URI::extract(str[, schemes][,&blk])
#
# == Args
#
# +str+::
# String to extract URIs from.
# +schemes+::
# Limit URI matching to a specific schemes.
#
# == Description
#
# Extracts URIs from a string. If block given, iterates through all matched URIs.
# Returns nil if block given or array with matches.
#
# == Usage
#
# require "uri"
#
# URI.extract("text here http://foo.bar.org/bla and here mailto:test@ruby.com and here also.")
# # => ["http://foo.bar.com/foobar", "mailto:foo@bar.com"]
#
def self.extract(str, schemes = nil, &block)
if block_given?
str.scan(regexp(schemes)) { yield $& }
@ -407,30 +555,37 @@ module URI
end
end
=begin
--- URI::regexp([match_schemes])
Returns a Regexp object which matches to URI-like strings.
If MATCH_SCHEMES given, resulting regexp matches to URIs
whose scheme is one of the MATCH_SCHEMES.
The Regexp object returned by this method includes arbitrary
number of capture group (parentheses). Never rely on its
number.
# extract first URI from html_string
html_string.slice(URI.regexp)
# remove ftp URIs
html_string.sub(URI.regexp(['ftp'])
# You should not rely on the number of parentheses
html_string.scan(URI.regexp) do |*matches|
p $&
end
=end
#
# == Synopsis
#
# URI::regexp([match_schemes])
#
# == Args
#
# +match_schemes+::
# Array of schemes. If given, resulting regexp matches to URIs
# whose scheme is one of the match_schemes.
#
# == Description
# Returns a Regexp object which matches to URI-like strings.
# The Regexp object returned by this method includes arbitrary
# number of capture group (parentheses). Never rely on it's number.
#
# == Usage
#
# require 'uri'
#
# # extract first URI from html_string
# html_string.slice(URI.regexp)
#
# # remove ftp URIs
# html_string.sub(URI.regexp(['ftp'])
#
# # You should not rely on the number of parentheses
# html_string.scan(URI.regexp) do |*matches|
# p $&
# end
#
def self.regexp(schemes = nil)
unless schemes
ABS_URI_REF
@ -439,4 +594,4 @@ module URI
end
end
end # URI
end

View file

@ -1,25 +1,18 @@
#
# $Id$
# = uri/ftp.rb
#
# Copyright (c) 2001 akira yamada <akira@ruby-lang.org>
# You can redistribute it and/or modify it under the same term as Ruby.
# Author:: Akira Yamada <akira@ruby-lang.org>
# License:: You can redistribute it and/or modify it under the same term as Ruby.
# Revision:: $Id$
#
require 'uri/generic'
module URI
=begin
== URI::FTP
=== Super Class
((<URI::Generic>))
=end
#
# RFC1738 section 3.2.
#
class FTP < Generic
DEFAULT_PORT = 21
@ -28,82 +21,91 @@ module URI
:userinfo, :host, :port,
:path, :typecode
].freeze
#
# Typecode is, "a", "i" or "d".
# As for "a" the text, as for "i" binary,
# as for "d" the directory is displayed.
# "A" with the text, as for "i" being binary,
# is because the respective data type was called ASCII and
# IMAGE with the protocol of FTP.
#
TYPECODE = ['a', 'i', 'd'].freeze
TYPECODE_PREFIX = ';type='.freeze
=begin
=== Class Methods
--- URI::FTP::build
Create a new URI::FTP object from components of URI::FTP with
check. It is scheme, userinfo, host, port, path and typecode. It
provided by an Array or a Hash. typecode is "a", "i" or "d".
--- URI::FTP::new
Create a new URI::FTP object from ``generic'' components with no
check.
=end
def self.new2(user, password, host, port, path,
typecode = nil, arg_check = true)
typecode = nil, arg_check = true)
typecode = nil if typecode.size == 0
if typecode && !TYPECODE.include?(typecode)
raise ArgumentError,
"bad typecode is specified: #{typecode}"
raise ArgumentError,
"bad typecode is specified: #{typecode}"
end
# do escape
self.new('ftp',
[user, password],
host, port, nil,
typecode ? path + TYPECODE_PREFIX + typecode : path,
nil, nil, nil, arg_check)
[user, password],
host, port, nil,
typecode ? path + TYPECODE_PREFIX + typecode : path,
nil, nil, nil, arg_check)
end
#
# == Description
#
# Creates a new URI::FTP object from components of URI::FTP with
# check. It is scheme, userinfo, host, port, path and typecode. It
# provided by an Array or a Hash. typecode is "a", "i" or "d".
#
def self.build(args)
tmp = Util::make_components_hash(self, args)
if tmp[:typecode]
if tmp[:typecode].size == 1
tmp[:typecode] = TYPECODE_PREFIX + tmp[:typecode]
end
tmp[:path] << tmp[:typecode]
if tmp[:typecode].size == 1
tmp[:typecode] = TYPECODE_PREFIX + tmp[:typecode]
end
tmp[:path] << tmp[:typecode]
end
return super(tmp)
end
#
# == Description
#
# Create a new URI::FTP object from ``generic'' components with no
# check.
#
# == Usage
#
# require 'uri'
# p ftp = URI.parse("ftp://ftp.ruby-lang.org/pub/ruby/;type=d")
# # => #<URI::FTP:0x201fad08 URL:ftp://ftp.ruby-lang.org/pub/ruby/;type=d>
# p ftp.typecode
# # => "d"
#
def initialize(*arg)
super(*arg)
@typecode = nil
tmp = @path.index(TYPECODE_PREFIX)
if tmp
typecode = @path[tmp + TYPECODE_PREFIX.size..-1]
self.set_path(@path[0..tmp - 1])
if arg[-1]
self.typecode = typecode
else
self.set_typecode(typecode)
end
typecode = @path[tmp + TYPECODE_PREFIX.size..-1]
self.set_path(@path[0..tmp - 1])
if arg[-1]
self.typecode = typecode
else
self.set_typecode(typecode)
end
end
end
attr_reader :typecode
#
# methods for typecode
#
def check_typecode(v)
if TYPECODE.include?(v)
return true
return true
else
raise InvalidComponentError,
"bad typecode(expected #{TYPECODE.join(', ')}): #{v}"
raise InvalidComponentError,
"bad typecode(expected #{TYPECODE.join(', ')}): #{v}"
end
end
private :check_typecode
@ -119,32 +121,28 @@ module URI
typecode
end
=begin
=end
def merge(oth)
def merge(oth) # :nodoc:
tmp = super(oth)
if self != tmp
tmp.set_typecode(oth.typecode)
tmp.set_typecode(oth.typecode)
end
return tmp
end
=begin
=end
def to_s
save_path = nil
if @typecode
save_path = @path
@path = @path + TYPECODE_PREFIX + @typecode
save_path = @path
@path = @path + TYPECODE_PREFIX + @typecode
end
str = super
if @typecode
@path = save_path
@path = save_path
end
return str
end
end # FTP
end
@@schemes['FTP'] = FTP
end # URI
end

File diff suppressed because it is too large Load diff

View file

@ -1,25 +1,18 @@
#
# $Id$
# = uri/http.rb
#
# Copyright (c) 2001 akira yamada <akira@ruby-lang.org>
# You can redistribute it and/or modify it under the same term as Ruby.
# Author:: Akira Yamada <akira@ruby-lang.org>
# License:: You can redistribute it and/or modify it under the same term as Ruby.
# Revision:: $Id$
#
require 'uri/generic'
module URI
=begin
== URI::HTTP
=== Super Class
((<URI::Generic>))
=end
#
# RFC1738 section 3.3.
#
class HTTP < Generic
DEFAULT_PORT = 80
@ -31,46 +24,42 @@ module URI
:fragment
].freeze
=begin
=== Class Methods
--- URI::HTTP::build
Create a new URI::HTTP object from components of URI::HTTP with
check. It is scheme, userinfo, host, port, path, query and
fragment. It provided by an Array of a Hash.
--- URI::HTTP::new
Create a new URI::HTTP object from ``generic'' components with no
check.
=end
#
# == Description
#
# Create a new URI::HTTP object from components of URI::HTTP with
# check. It is scheme, userinfo, host, port, path, query and
# fragment. It provided by an Array of a Hash.
#
def self.build(args)
tmp = Util::make_components_hash(self, args)
return super(tmp)
end
#
# == Description
#
# Create a new URI::HTTP object from ``generic'' components with no
# check.
#
def initialize(*arg)
super(*arg)
end
=begin
=== Instance Methods
--- URI::HTTP#request_uri
=end
#
# == Description
#
# Returns: path + '?' + query
#
def request_uri
r = path_query
if r[0] != ?/
r = '/' + r
r = '/' + r
end
r
end
end # HTTP
end
@@schemes['HTTP'] = HTTP
end # URI
end

View file

@ -1,26 +1,16 @@
#
# $Id$
# = uri/https.rb
#
# Copyright (c) 2001 akira yamada <akira@ruby-lang.org>
# You can redistribute it and/or modify it under the same term as Ruby.
# Author:: Akira Yamada <akira@ruby-lang.org>
# License:: You can redistribute it and/or modify it under the same term as Ruby.
# Revision:: $Id$
#
require 'uri/http'
module URI
=begin
== URI::HTTPS
=== Super Class
((<URI::HTTP>))
=end
class HTTPS < HTTP
DEFAULT_PORT = 443
end
@@schemes['HTTPS'] = HTTPS
end # URI
end

View file

@ -1,29 +1,23 @@
#
# $Id$
# = uri/ldap.rb
#
# Author::
# Takaaki Tateishi <ttate@jaist.ac.jp>
# Akira Yamada <akira@ruby-lang.org>
# License::
# URI::LDAP is copyrighted free software by Takaaki Tateishi and Akira Yamada.
# You can redistribute it and/or modify it under the same term as Ruby.
# Revision:: $Id$
#
require 'uri/generic'
module URI
=begin
== URI::LDAP
URI::LDAP is copyrighted free software by Takaaki Tateishi and akira yamada.
Copyright (c) 2001 Takaaki Tateishi <ttate@jaist.ac.jp> and
akira yamada <akira@ruby-lang.org>.
You can redistribute it and/or modify it under the same term as Ruby.
=== Super Class
((<URI::Generic>))
=end
#
# LDAP URI SCHEMA (described in RFC2255)
# ldap://<host>/<dn>[?<attrs>[?<scope>[?<filter>[?<extensions>]]]]
#
class LDAP < Generic
DEFAULT_PORT = 389
@ -44,27 +38,17 @@ URI::LDAP is copyrighted free software by Takaaki Tateishi and akira yamada.
SCOPE_BASE = 'base',
].freeze
=begin
=== Class Methods
--- URI::LDAP::build
--- URI::LDAP::new
=end
def self.build(args)
tmp = Util::make_components_hash(self, args)
if tmp[:dn]
tmp[:path] = tmp[:dn]
tmp[:path] = tmp[:dn]
end
query = []
[:extensions, :filter, :scope, :attributes].collect do |x|
next if !tmp[x] && query.size == 0
query.unshift(tmp[x])
next if !tmp[x] && query.size == 0
query.unshift(tmp[x])
end
tmp[:query] = query.join('?')
@ -76,7 +60,7 @@ URI::LDAP is copyrighted free software by Takaaki Tateishi and akira yamada.
super(*arg)
if @fragment
raise InvalidURIError, 'bad LDAP URL'
raise InvalidURIError, 'bad LDAP URL'
end
parse_dn
@ -95,12 +79,12 @@ URI::LDAP is copyrighted free software by Takaaki Tateishi and akira yamada.
@extensions = nil
if @query
attrs, scope, filter, extensions = @query.split('?')
attrs, scope, filter, extensions = @query.split('?')
@attributes = attrs if attrs && attrs.size > 0
@scope = scope if scope && scope.size > 0
@filter = filter if filter && filter.size > 0
@extensions = extensions if extensions && extensions.size > 0
@attributes = attrs if attrs && attrs.size > 0
@scope = scope if scope && scope.size > 0
@filter = filter if filter && filter.size > 0
@extensions = extensions if extensions && extensions.size > 0
end
end
private :parse_query
@ -110,23 +94,13 @@ URI::LDAP is copyrighted free software by Takaaki Tateishi and akira yamada.
query = []
[@extensions, @filter, @scope, @attributes].each do |x|
next if !x && query.size == 0
query.unshift(x)
next if !x && query.size == 0
query.unshift(x)
end
@query = query.join('?')
end
private :build_path_query
=begin
=== Instance Methods
--- URI::LDAP#dn
--- URI::LDAP#dn=(v)
=end
def dn
@dn
end
@ -143,14 +117,6 @@ URI::LDAP is copyrighted free software by Takaaki Tateishi and akira yamada.
val
end
=begin
--- URI::LDAP#attributes
--- URI::LDAP#attributes=(v)
=end
def attributes
@attributes
end
@ -167,14 +133,6 @@ URI::LDAP is copyrighted free software by Takaaki Tateishi and akira yamada.
val
end
=begin
--- URI::LDAP#scope
--- URI::LDAP#scope=(v)
=end
def scope
@scope
end
@ -191,14 +149,6 @@ URI::LDAP is copyrighted free software by Takaaki Tateishi and akira yamada.
val
end
=begin
--- URI::LDAP#filter
--- URI::LDAP#filter=(v)
=end
def filter
@filter
end
@ -215,14 +165,6 @@ URI::LDAP is copyrighted free software by Takaaki Tateishi and akira yamada.
val
end
=begin
--- URI::LDAP#extensions
--- URI::LDAP#extensions=(v)
=end
def extensions
@extensions
end

View file

@ -1,35 +1,26 @@
#
# $Id$
# = uri/mailto.rb
#
# Copyright (c) 2001 akira yamada <akira@ruby-lang.org>
# You can redistribute it and/or modify it under the same term as Ruby.
# Author:: Akira Yamada <akira@ruby-lang.org>
# License:: You can redistribute it and/or modify it under the same term as Ruby.
# Revision:: $Id$
#
require 'uri/generic'
module URI
=begin
== URI::MailTo
=== Super Class
((<URI::Generic>))
=end
#
# RFC2368, The mailto URL scheme
#
class MailTo < Generic
include REGEXP
DEFAULT_PORT = nil
COMPONENT = [
:scheme,
:to, :headers
].freeze
COMPONENT = [ :scheme, :to, :headers ].freeze
# :stopdoc:
# "hname" and "hvalue" are encodings of an RFC 822 header name and
# value, respectively. As with "to", all URL reserved characters must
# be encoded.
@ -52,7 +43,7 @@ module URI
# to = #mailbox
# mailtoURL = "mailto:" [ to ] [ headers ]
MAILBOX_PATTERN = "(?:#{PATTERN::ESCAPED}|[^(),%?=&])".freeze
MAILTO_REGEXP = Regexp.new("
MAILTO_REGEXP = Regexp.new(" # :nodoc:
\\A
(#{MAILBOX_PATTERN}*?) (?# 1: to)
(?:
@ -61,63 +52,62 @@ module URI
)?
(?:
\\#
(#{PATTERN::FRAGMENT}) (?# 3: fragment)
(#{PATTERN::FRAGMENT}) (?# 3: fragment)
)?
\\z
", Regexp::EXTENDED, 'N').freeze
# :startdoc:
=begin
=== Class Methods
--- URI::MailTo::build
Create a new URI::MailTo object from components of URI::MailTo
with check. It is to and headers. It provided by an Array of a
Hash. You can provide headers as an String like
"subject=subscribe&cc=addr" or an Array like [["subject",
"subscribe"], ["cc", "addr"]]
--- URI::MailTo::new
Create a new URI::MailTo object from ``generic'' components with
no check. Because, this method is usually called from URI::parse
and the method checks validity of each components.
=end
#
# == Description
#
# Creates a new URI::MailTo object from components of URI::MailTo
# with check. It is to and headers. It provided by an Array of a
# Hash. You can provide headers as String like
# "subject=subscribe&cc=addr" or Array like [["subject",
# "subscribe"], ["cc", "addr"]]
#
def self.build(args)
tmp = Util::make_components_hash(self, args)
if tmp[:to]
tmp[:opaque] = tmp[:to]
tmp[:opaque] = tmp[:to]
else
tmp[:opaque] = ''
tmp[:opaque] = ''
end
if tmp[:headers]
tmp[:opaque] << '?'
tmp[:opaque] << '?'
if tmp[:headers].kind_of?(Array)
tmp[:opaque] << tmp[:headers].collect { |x|
if x.kind_of?(Array)
x[0] + '=' + x[1..-1].to_s
else
x.to_s
end
}.join('&')
if tmp[:headers].kind_of?(Array)
tmp[:opaque] << tmp[:headers].collect { |x|
if x.kind_of?(Array)
x[0] + '=' + x[1..-1].to_s
else
x.to_s
end
}.join('&')
elsif tmp[:headers].kind_of?(Hash)
tmp[:opaque] << tmp[:headers].collect { |h,v|
h + '=' + v
}.join('&')
elsif tmp[:headers].kind_of?(Hash)
tmp[:opaque] << tmp[:headers].collect { |h,v|
h + '=' + v
}.join('&')
else
tmp[:opaque] << tmp[:headers].to_s
end
else
tmp[:opaque] << tmp[:headers].to_s
end
end
return super(tmp)
end
#
# == Description
#
# Creates a new URI::MailTo object from ``generic'' components with
# no check. Because, this method is usually called from URI::parse
# and the method checks validity of each components.
#
def initialize(*arg)
super(*arg)
@ -125,43 +115,29 @@ module URI
@headers = []
if MAILTO_REGEXP =~ @opaque
if arg[-1]
self.to = $1
self.headers = $2
else
set_to($1)
set_headers($2)
end
if arg[-1]
self.to = $1
self.headers = $2
else
set_to($1)
set_headers($2)
end
else
raise InvalidComponentError,
"unrecognised opaque part for mailtoURL: #{@opaque}"
raise InvalidComponentError,
"unrecognised opaque part for mailtoURL: #{@opaque}"
end
end
attr_reader :to
attr_reader :headers
=begin
=== Instance Methods
--- URI::MailTo#to
--- URI::MailTo#to=(v)
=end
#
# methods for to
#
def check_to(v)
return true unless v
return true if v.size == 0
if OPAQUE !~ v || /\A#{MAILBOX_PATTERN}*\z/o !~ v
raise InvalidComponentError,
"bad component(expected opaque component): #{v}"
raise InvalidComponentError,
"bad component(expected opaque component): #{v}"
end
return true
@ -179,26 +155,14 @@ module URI
v
end
=begin
--- URI::MailTo#headers
--- URI::MailTo#headers=(v)
=end
#
# methods for headers
#
def check_headers(v)
return true unless v
return true if v.size == 0
if OPAQUE !~ v ||
/\A(#{HEADER_PATTERN}(?:\&#{HEADER_PATTERN})*)\z/o !~ v
raise InvalidComponentError,
"bad component(expected opaque component): #{v}"
/\A(#{HEADER_PATTERN}(?:\&#{HEADER_PATTERN})*)\z/o !~ v
raise InvalidComponentError,
"bad component(expected opaque component): #{v}"
end
return true
@ -208,9 +172,9 @@ module URI
def set_headers(v)
@headers = []
if v
v.scan(HEADER_REGEXP) do |x|
@headers << x.split(/=/o, 2)
end
v.scan(HEADER_REGEXP) do |x|
@headers << x.split(/=/o, 2)
end
end
end
protected :set_headers
@ -223,42 +187,44 @@ module URI
def to_s
@scheme + ':' +
if @to
@to
else
''
end +
if @headers.size > 0
'?' + @headers.collect{|x| x.join('=')}.join('&')
else
''
end +
if @fragment
'#' + @fragment
else
''
end
if @to
@to
else
''
end +
if @headers.size > 0
'?' + @headers.collect{|x| x.join('=')}.join('&')
else
''
end +
if @fragment
'#' + @fragment
else
''
end
end
=begin
--- URI::MailTo#to_mailtext
=end
#
# == Usage
# require 'uri'
#
# uri = URI.parse("mailto:ruby-list@ruby-lang.org?Subject=subscribe&cc=myaddr")
# uri.to_mailtext
# # => "To: ruby-list@ruby-lang.org\nSubject: subscribe\nCc: myaddr\n\n\n"
#
def to_mailtext
to = URI::unescape(@to)
head = ''
body = ''
@headers.each do |x|
case x[0]
when 'body'
body = URI::unescape(x[1])
when 'to'
to << ', ' + URI::unescape(x[1])
else
head << URI::unescape(x[0]).capitalize + ': ' +
URI::unescape(x[1]) + "\n"
end
case x[0]
when 'body'
body = URI::unescape(x[1])
when 'to'
to << ', ' + URI::unescape(x[1])
else
head << URI::unescape(x[0]).capitalize + ': ' +
URI::unescape(x[1]) + "\n"
end
end
return "To: #{to}
@ -267,7 +233,7 @@ module URI
"
end
alias to_rfc822text to_mailtext
end # MailTo
end
@@schemes['MAILTO'] = MailTo
end # URI
end