Bug #12498
closedParsing a mailto URI with no recipient throws the error URI::InvalidComponentError: missing opaque part for mailto URL
Description
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 `'
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