Is there a workaround to open URLs containing underscores in Ruby? Is there a workaround to open URLs containing underscores in Ruby? ruby ruby

Is there a workaround to open URLs containing underscores in Ruby?


This looks like a bug in URI, and uri-open, HTTParty and many other gems make use of URI.parse.

Here's a workaround:

require 'net/http'require 'open-uri'def hopen(url)  begin    open(url)  rescue URI::InvalidURIError    host = url.match(".+\:\/\/([^\/]+)")[1]    path = url.partition(host)[2] || "/"    Net::HTTP.get host, path  endendresp = hopen("http://dear_raed.blogspot.com/2009_01_01_archive.html")


URI has an old-fashioned idea of what an url looks like.

Lately I'm using addressable to get around that:

require 'open-uri'require 'addressable/uri'class URI::Parser  def split url    a = Addressable::URI::parse url    [a.scheme, a.userinfo, a.host, a.port, nil, a.path, nil, a.query, a.fragment]  endendresp = open("http://sub_domain.domain.com") # Yay!

Don't forget to gem install addressable


This initializer in my rails app seems to make URI.parse work at least:

# config/initializers/uri_underscore.rbclass URI::Generic  def initialize_with_registry_check(scheme,                 userinfo, host, port, registry,                 path, opaque,                 query,                 fragment,                 parser = DEFAULT_PARSER,                 arg_check = false)    if %w(http https).include?(scheme) && host.nil? && registry =~ /_/      initialize_without_registry_check(scheme, userinfo, registry, port, nil, path, opaque, query, fragment, parser, arg_check)    else      initialize_without_registry_check(scheme, userinfo, host, port, registry, path, opaque, query, fragment, parser, arg_check)    end  end  alias_method_chain :initialize, :registry_checkend