[前][次][番号順一覧][スレッド一覧]

ruby-changes:34447

From: naruse <ko1@a...>
Date: Tue, 24 Jun 2014 05:01:36 +0900 (JST)
Subject: [ruby-changes:34447] naruse:r46528 (trunk): * lib/uri/mailto.rb: support RFC6068.

naruse	2014-06-24 05:01:27 +0900 (Tue, 24 Jun 2014)

  New Revision: 46528

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=46528

  Log:
    * lib/uri/mailto.rb: support RFC6068.

  Modified files:
    trunk/ChangeLog
    trunk/lib/uri/mailto.rb
    trunk/test/uri/test_mailto.rb
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 46527)
+++ ChangeLog	(revision 46528)
@@ -1,3 +1,7 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Tue Jun 24 03:52:35 2014  NARUSE, Yui  <naruse@r...>
+
+	* lib/uri/mailto.rb: support RFC6068.
+
 Mon Jun 23 18:44:45 2014  SHIBATA Hiroshi  <shibata.hiroshi@g...>
 
 	* tool/config_files.rb: rename class ConfigFiles to Downloader.
Index: lib/uri/mailto.rb
===================================================================
--- lib/uri/mailto.rb	(revision 46527)
+++ lib/uri/mailto.rb	(revision 46528)
@@ -12,7 +12,7 @@ require 'uri/generic' https://github.com/ruby/ruby/blob/trunk/lib/uri/mailto.rb#L12
 module URI
 
   #
-  # RFC2368, The mailto URL scheme
+  # RFC6068, The mailto URL scheme
   #
   class MailTo < Generic
     include REGEXP
@@ -37,28 +37,12 @@ module URI https://github.com/ruby/ruby/blob/trunk/lib/uri/mailto.rb#L37
     #
     #  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 https://github.com/ruby/ruby/blob/trunk/lib/uri/mailto.rb#L83
 
       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 https://github.com/ruby/ruby/blob/trunk/lib/uri/mailto.rb#L92
               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 https://github.com/ruby/ruby/blob/trunk/lib/uri/mailto.rb#L119
       @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 https://github.com/ruby/ruby/blob/trunk/lib/uri/mailto.rb#L140
     # 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 https://github.com/ruby/ruby/blob/trunk/lib/uri/mailto.rb#L168
     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 https://github.com/ruby/ruby/blob/trunk/lib/uri/mailto.rb#L187
     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
Index: test/uri/test_mailto.rb
===================================================================
--- test/uri/test_mailto.rb	(revision 46527)
+++ test/uri/test_mailto.rb	(revision 46528)
@@ -100,9 +100,6 @@ class TestMailTo < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/uri/test_mailto.rb#L100
     # mailto:javascript:alert()
     bad << ["javascript:alert()", []]
 
-    # '=' which is in hname or hvalue is wrong.
-    bad << ["foo@e...?subject=1+1=2", []]
-
     ok.each do |x|
       assert_equal(x[0],
 		   @u.build(x[1]).to_s)
@@ -111,7 +108,7 @@ class TestMailTo < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/uri/test_mailto.rb#L108
     end
 
     bad.each do |x|
-      assert_raise(URI::InvalidComponentError) {
+      assert_raise(URI::InvalidComponentError, %[URI::MailTo.build(#{x.inspect})]) {
 	@u.build(x)
       }
     end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]