Issue #12498 has been updated by Usaku NAKAMURA.

Backport changed from 2.1: WONTFIX, 2.2: REQUIRED, 2.3: DONE to 2.1: WONTFIX, 2.2: DONE, 2.3: DONE

ruby_2_2 r55941 merged revision(s) 55563.

----------------------------------------
Bug #12498: Parsing a mailto URI with no recipient throws the error URI::InvalidComponentError: missing opaque part for mailto URL 
https://bugs.ruby-lang.org/issues/12498#change-60160

* Author: Chris Heisterkamp
* Status: Closed
* Priority: Normal
* Assignee: Yui NARUSE
* ruby -v: ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]
* Backport: 2.1: WONTFIX, 2.2: DONE, 2.3: DONE
----------------------------------------
If you try to parse a mailto URI without a recipient you get an error.  For example

ruby -ruri -e 'URI.parse("mailto:?subject=hi")'

will throw the error:

/usr/lib/ruby/2.3.0/uri/mailto.rb:140:in `initialize': missing opaque part for mailto URL (URI::InvalidComponentError)
	from /usr/lib/ruby/2.3.0/uri/rfc3986_parser.rb:76:in `new'
	from /usr/lib/ruby/2.3.0/uri/rfc3986_parser.rb:76:in `parse'
	from /usr/lib/ruby/2.3.0/uri/common.rb:227:in `parse'
	from -e:1:in `<main>'

This is similar to the issue https://bugs.ruby-lang.org/issues/12212 and is caused by the combination of https://bugs.ruby-lang.org/issues/10738 and https://bugs.ruby-lang.org/issues/2542

When the URI Lib was updated to use the RFC 3986 parser it does not always return the @opaque part of the URI.  So the check added in https://bugs.ruby-lang.org/issues/10738 will always fail.

The fix uses the @query part returned from the new parser if the @opaque part is not defined.  Here are examples of the differences between the parts returned by the new and old parser

scheme, userinfo, host, port, registry, path, opaque, query, fragment = URI::RFC2396_Parser.new.split('mailto:?to=sam / example.com&subject=hey!')
 => ["mailto", nil, nil, nil, nil, nil, "?to=sam / example.com&subject=hey!", nil, nil] 
opaque
 => "?to=sam / example.com&subject=hey!" 

scheme, userinfo, host, port, registry, path, opaque, query, fragment = URI::RFC3986_Parser.new.split('mailto:?to=sam / example.com&subject=hey!')
 => ["mailto", nil, nil, nil, nil, "", nil, "to=sam / example.com&subject=hey!", nil] 
opaque
 => nil
query
 => "to=sam / example.com&subject=hey!" 




---Files--------------------------------
fix_empty_mailto_recipient_parsing.patch (1.79 KB)


-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>