summaryrefslogtreecommitdiff
path: root/lib/uri/mailto.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/uri/mailto.rb')
-rw-r--r--lib/uri/mailto.rb65
1 files changed, 22 insertions, 43 deletions
diff --git a/lib/uri/mailto.rb b/lib/uri/mailto.rb
index 03155fb917..6422e84f37 100644
--- a/lib/uri/mailto.rb
+++ b/lib/uri/mailto.rb
@@ -12,7 +12,7 @@ require 'uri/generic'
module URI
#
- # RFC2368, The mailto URL scheme
+ # RFC6068, The mailto URL scheme
#
class MailTo < Generic
include REGEXP
@@ -37,28 +37,12 @@ module URI
#
# Within mailto URLs, the characters "?", "=", "&" are reserved.
- # hname = *urlc
- # hvalue = *urlc
- # header = hname "=" hvalue
- HEADER_PATTERN = "(?:[^?=&]*=[^?=&]*)".freeze
- HEADER_REGEXP = Regexp.new(HEADER_PATTERN).freeze
+ HEADER_REGEXP = /\A(?<hfield>(?:%\h\h|[!$'-.0-;@-Z_a-z~])*=(?:%\h\h|[!$'-.0-;@-Z_a-z~])*)(?:&\g<hfield>)*\z/
# headers = "?" header *( "&" header )
- # 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
+ # 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/
# :startdoc:
#
@@ -99,8 +83,8 @@ module URI
if tmp[:headers]
tmp[:opaque] << '?'
-
- if tmp[:headers].kind_of?(Array)
+ case tmp[:headers]
+ when Array
tmp[:opaque] << tmp[:headers].collect { |x|
if x.kind_of?(Array)
x[0] + '=' + x[1..-1].join
@@ -108,12 +92,10 @@ module URI
x.to_s
end
}.join('&')
-
- elsif tmp[:headers].kind_of?(Hash)
+ when Hash
tmp[:opaque] << tmp[:headers].collect { |h,v|
h + '=' + v
}.join('&')
-
else
tmp[:opaque] << tmp[:headers].to_s
end
@@ -137,13 +119,13 @@ module URI
@to = nil
@headers = []
- if MAILTO_REGEXP =~ @opaque
+ if m = MAILTO_DATA_REGEXP.match(@opaque)
if arg[10] # arg_check
- self.to = $1
- self.headers = $2
+ self.to = m["to"]
+ self.headers = m["header"]
else
- set_to($1)
- set_headers($2)
+ set_to(m["to"])
+ set_headers(m["header"])
end
else
@@ -158,14 +140,12 @@ module URI
# E-mail headers set by the URL, as an Array of Arrays
attr_reader :headers
- # check the to +v+ component against either
- # * URI::Parser Regexp for :OPAQUE
- # * MAILBOX_PATTERN
+ # check the to +v+ component
def check_to(v)
return true unless v
return true if v.size == 0
- if parser.regexp[:OPAQUE] !~ v || /\A#{MAILBOX_PATTERN}*\z/o !~ v
+ if TO_REGEXP !~ v
raise InvalidComponentError,
"bad component(expected opaque component): #{v}"
end
@@ -188,14 +168,13 @@ module URI
end
# check the headers +v+ component against either
- # * URI::Parser Regexp for :OPAQUE
- # * HEADER_PATTERN
+ # * URI::Parser Regexp for :QUERY
+ # * HEADER_REGEXP
def check_headers(v)
return true unless v
return true if v.size == 0
-
- if parser.regexp[:OPAQUE] !~ v ||
- /\A(#{HEADER_PATTERN}(?:\&#{HEADER_PATTERN})*)\z/o !~ v
+ if parser.regexp[:QUERY] !~ v ||
+ HEADER_REGEXP !~ v
raise InvalidComponentError,
"bad component(expected opaque component): #{v}"
end
@@ -208,8 +187,8 @@ module URI
def set_headers(v)
@headers = []
if v
- v.scan(HEADER_REGEXP) do |x|
- @headers << x.split(/=/o, 2)
+ v.split('&').each do |x|
+ @headers << x.split(/=/, 2)
end
end
end