diff --git a/CHANGELOG.md b/CHANGELOG.md index efac5a1b0..4e0e1b738 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ Get upgrade notes from Sprockets 3.x to 4.x at https://github.com/rails/sprockets/blob/master/UPGRADING.md +## Next Release + +- Fix bug where project Path with spaces throws a bad URI(is not URI?) error - Marc Gayle - https://github.com/marcamillion + ## Master - Remove remaining support for Ruby < 2.4.[#672](https://github.com/rails/sprockets/pull/672) diff --git a/lib/sprockets/uri_utils.rb b/lib/sprockets/uri_utils.rb index 57ab184d9..ee540ab65 100644 --- a/lib/sprockets/uri_utils.rb +++ b/lib/sprockets/uri_utils.rb @@ -37,13 +37,23 @@ def join_uri(scheme, userinfo, host, port, registry, path, opaque, query, fragme URI::Generic.new(scheme, userinfo, host, port, registry, path, opaque, query, fragment).to_s end + # Internal: Escape the URI + # + # uri - String uri + # + # Returns String. + def escape_uri(uri) + return uri if uri == URI::Generic::DEFAULT_PARSER.escape(URI::Generic::DEFAULT_PARSER.unescape(uri)) + URI::Generic::DEFAULT_PARSER.escape(uri) + end + # Internal: Parse file: URI into component parts. # # uri - String uri # # Returns [scheme, host, path, query]. def split_file_uri(uri) - scheme, _, host, _, _, path, _, query, _ = URI.split(uri) + scheme, _, host, _, _, path, _, query, _ = URI.split(escape_uri(uri)) path = URI::Generic::DEFAULT_PARSER.unescape(path) path.force_encoding(Encoding::UTF_8) diff --git a/test/test_loader.rb b/test/test_loader.rb index d7bd9f14a..4093e9a22 100644 --- a/test/test_loader.rb +++ b/test/test_loader.rb @@ -50,7 +50,7 @@ def setup test 'load uri with index alias' do filename = fixture_path('default/coffee/index.js') index_alias = fixture_path('default/coffee.js') - assert asset = @env.load("file://#{uri_path(filename)}?type=application/javascript&index_alias=#{Rack::Utils.escape(index_alias)}") + assert asset = @env.load("file://#{uri_path(filename)}?type=application/javascript&index_alias=#{index_alias}") assert_equal filename, asset.filename, asset.inspect assert_equal 'coffee.js', asset.logical_path, asset.inspect assert_equal fixture_path('default'), asset.to_hash[:load_path], asset.inspect diff --git a/test/test_uri_utils.rb b/test/test_uri_utils.rb index 8a0e2a5e3..aaf486afc 100644 --- a/test/test_uri_utils.rb +++ b/test/test_uri_utils.rb @@ -35,6 +35,9 @@ def test_inverse_uri_functions end def test_split_file_uri + parts = split_file_uri("file:///usr/Company Name Dropbox/local/bin/myapp/assets") + assert_equal ['file', nil, '/usr/Company Name Dropbox/local/bin/myapp/assets', nil], parts + parts = split_file_uri("file://localhost/etc/fstab") assert_equal ['file', 'localhost', '/etc/fstab', nil], parts