RubyのURIがホスト名にアンダースコアがあるとparseできない件

Ruby(1.9.3)のURI.parseはホスト名にアンダースコアが入っているとURI::InvalidURIErrorが発生します。

require 'uri'
p URI.parse('http://hoge_fuga.example.com/page?id=xxx#yyy')
`initialize': the scheme http does not accept registry part: hoge_fuga.example.com (or bad hostname?) (URI::InvalidURIError)

仕様として、URIについては、RFC-2396とRFC-3986, IRIとしてRFC-3987があります。
アンダースコアはRFC-2396ではNGだったけど、RFC-3986ではOKになっているのですが、どうやらRubyのURIライブラリの対応が追いついていない(?)ようです。ちょっとRuby界隈には疎いのでどういう状況なのかは正確には把握していません。

代替案を探していたら、addressableというライブラリが対応しているという事なので、さっそく使ってみました。

さくっとgemでインストールします。addressableのバージョンは2.2.8でした。

gem install addressable

簡単な確認。

require "addressable/uri"
uri = Addressable::URI.parse("http://hoge_fuga.example.com/page?id=xxx#yyy")
p uri.host
p uri.port
p uri.request_uri
"hoge_fuga.example.com"
nil
"/page?id=xxx"

パースできました。
ただ、標準のURIだと上記の場合でもportは80を返してくれるのですが、addressableは返してくれないみたいです。しょんぼり。

参考:
http://d.hatena.ne.jp/kitamomonga/20100316/ruby_gem_addressable_howto

 

新しいサイトもよろしくお願いします!