summaryrefslogtreecommitdiff
path: root/lib/uri
diff options
context:
space:
mode:
authornaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-06-24 02:58:45 +0000
committernaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-06-24 02:58:45 +0000
commita054854324e88f2282d7440fae758d6aa7a42597 (patch)
treead69ca1e4db07bfba5391ccce920ebbf88da6e26 /lib/uri
parent9a6518abf71e5de3d5dee21152dd4cff6730b640 (diff)
Revert "* lib/uri/mailto.rb: support RFC6068."
to fix mailto URI syntax git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46541 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/uri')
-rw-r--r--lib/uri/mailto.rb65
1 files changed, 43 insertions, 22 deletions
diff --git a/lib/uri/mailto.rb b/lib/uri/mailto.rb
index 6422e84f37..03155fb917 100644
--- a/lib/uri/mailto.rb
+++ b/lib/uri/mailto.rb
@@ -12,7 +12,7 @@ require 'uri/generic'
module URI
#
- # RFC6068, The mailto URL scheme
+ # RFC2368, The mailto URL scheme
#
class MailTo < Generic
include REGEXP
@@ -37,12 +37,28 @@ module URI
#
# Within mailto URLs, the characters "?", "=", "&" are reserved.
- HEADER_REGEXP = /\A(?<hfield>(?:%\h\h|[!$'-.0-;@-Z_a-z~])*=(?:%\h\h|[!$'-.0-;@-Z_a-z~])*)(?:&\g<hfield>)*\z/
+ # hname = *urlc
+ # hvalue = *urlc
+ # header = hname "=" hvalue
+ HEADER_PATTERN = "(?:[^?=&]*=[^?=&]*)".freeze
+ HEADER_REGEXP = Regexp.new(HEADER_PATTERN).freeze
# headers = "?" header *( "&" header )
- # to = addr-spec *("," addr-spec )
- # mailtoURI = "mailto:" [ to ] [ hfields ]
- TO_REGEXP = /\A(?:[!#-'*+\-\/-9=?A-Z^-~]+(?:\.[!#-'*+\-\/-9=?A-Z^-~]+)*|"(?:\\[!-~]|[!#-\[\]-~])*")@(?:[!#-'*+\-\/-9=?A-Z^-~]+(?:\.[!#-'*+\-\/-9=?A-Z^-~]+)*|\[[!-Z^-~]*\])\z/
- MAILTO_DATA_REGEXP = /\A(?<to>(?<addr-spec>(?<local-part>[!#-'*+\-\/-9=?A-Z^-~]+(?:\.[!#-'*+\-\/-9=?A-Z^-~]+)*|"(?:\\[!-~]|[!#-\[\]-~])*")@(?<domain>[!#-'*+\-\/-9=?A-Z^-~]+(?:\.[!#-'*+\-\/-9=?A-Z^-~]+)*|\[[!-Z^-~]*\]))(?:,\g<addr-spec>)*)?(?<hfields>\?(?<header>(?<hfield>(?:%\h\h|[!$'-.0-;@-Z_a-z~])*=(?:%\h\h|[!$'-.0-;@-Z_a-z~])*)(?:&\g<hfield>)*))?\z/
+ # to = #mailbox
+ # mailtoURL = "mailto:" [ to ] [ headers ]
+ MAILBOX_PATTERN = "(?:#{PATTERN::ESCAPED}|[^(),%?=&])".freeze
+ MAILTO_REGEXP = Regexp.new(" # :nodoc:
+ \\A
+ (#{MAILBOX_PATTERN}*?) (?# 1: to)
+ (?:
+ \\?
+ (#{HEADER_PATTERN}(?:\\&#{HEADER_PATTERN})*) (?# 2: headers)
+ )?
+ (?:
+ \\#
+ (#{PATTERN::FRAGMENT}) (?# 3: fragment)
+ )?
+ \\z
+ ", Regexp::EXTENDED).freeze
# :startdoc:
#
@@ -83,8 +99,8 @@ module URI
if tmp[:headers]
tmp[:opaque] << '?'
- case tmp[:headers]
- when Array
+
+ if tmp[:headers].kind_of?(Array)
tmp[:opaque] << tmp[:headers].collect { |x|
if x.kind_of?(Array)
x[0] + '=' + x[1..-1].join
@@ -92,10 +108,12 @@ module URI
x.to_s
end
}.join('&')
- when Hash
+
+ elsif tmp[:headers].kind_of?(Hash)
tmp[:opaque] << tmp[:headers].collect { |h,v|
h + '=' + v
}.join('&')
+
else
tmp[:opaque] << tmp[:headers].to_s
end
@@ -119,13 +137,13 @@ module URI
@to = nil
@headers = []
- if m = MAILTO_DATA_REGEXP.match(@opaque)
+ if MAILTO_REGEXP =~ @opaque
if arg[10] # arg_check
- self.to = m["to"]
- self.headers = m["header"]
+ self.to = $1
+ self.headers = $2
else
- set_to(m["to"])
- set_headers(m["header"])
+ set_to($1)
+ set_headers($2)
end
else
@@ -140,12 +158,14 @@ module URI
# E-mail headers set by the URL, as an Array of Arrays
attr_reader :headers
- # check the to +v+ component
+ # check the to +v+ component against either
+ # * URI::Parser Regexp for :OPAQUE
+ # * MAILBOX_PATTERN
def check_to(v)
return true unless v
return true if v.size == 0
- if TO_REGEXP !~ v
+ if parser.regexp[:OPAQUE] !~ v || /\A#{MAILBOX_PATTERN}*\z/o !~ v
raise InvalidComponentError,
"bad component(expected opaque component): #{v}"
end
@@ -168,13 +188,14 @@ module URI
end
# check the headers +v+ component against either
- # * URI::Parser Regexp for :QUERY
- # * HEADER_REGEXP
+ # * URI::Parser Regexp for :OPAQUE
+ # * HEADER_PATTERN
def check_headers(v)
return true unless v
return true if v.size == 0
- if parser.regexp[:QUERY] !~ v ||
- HEADER_REGEXP !~ v
+
+ if parser.regexp[:OPAQUE] !~ v ||
+ /\A(#{HEADER_PATTERN}(?:\&#{HEADER_PATTERN})*)\z/o !~ v
raise InvalidComponentError,
"bad component(expected opaque component): #{v}"
end
@@ -187,8 +208,8 @@ module URI
def set_headers(v)
@headers = []
if v
- v.split('&').each do |x|
- @headers << x.split(/=/, 2)
+ v.scan(HEADER_REGEXP) do |x|
+ @headers << x.split(/=/o, 2)
end
end
end