[#55222] [ruby-trunk - Feature #8468][Feedback] Remove $SAFE — "shugo (Shugo Maeda)" <redmine@...>

20 messages 2013/06/01

[#55260] [ruby-trunk - Feature #8478][Open] The hash returned by Enumerable#group_by should have an empty array for its default value — "phiggins (Pete Higgins)" <pete@...>

8 messages 2013/06/02

[#55276] Re: [ruby-changes:28951] zzak:r41003 (trunk): * process.c: Improve Process::exec documentation — Tanaka Akira <akr@...>

2013/5/31 zzak <[email protected]>:

9 messages 2013/06/03

[#55306] [ruby-trunk - Feature #8490][Open] Bring ActiveSupport Enumerable#index_by to core — "rosenfeld (Rodrigo Rosenfeld Rosas)" <rr.rosas@...>

12 messages 2013/06/04

[#55330] [ruby-trunk - Feature #8499][Assigned] Importing Hash#slice, Hash#slice!, Hash#except, and Hash#except! from ActiveSupport — "mrkn (Kenta Murata)" <muraken@...>

30 messages 2013/06/06

[#55391] [ruby-trunk - Bug #8507][Open] Keyword splat does not convert arg to Hash — "stephencelis (Stephen Celis)" <stephen.celis@...>

16 messages 2013/06/09

[#55393] [ruby-trunk - Bug #8508][Open] Invalid byte sequence in UTF-8 (ArgumentError) in win32/registry.rb — "thasmo (Thomas Deinhamer)" <thasmo@...>

11 messages 2013/06/09

[#55528] [ruby-trunk - Bug #8538][Open] c method not pushed into the callstack when called, but popped when returned — deivid (David Rodríguez) <deivid.rodriguez@...>

9 messages 2013/06/17

[#55557] [ruby-trunk - misc #8543][Open] rb_iseq_load — "alvoskov (Alexey Voskov)" <alvoskov@...>

47 messages 2013/06/19

[#55558] [ruby-trunk - Feature #8544][Open] OpenURI should open 'file://' URIs — "silasdavis (Silas Davis)" <ruby-lang@...>

12 messages 2013/06/19

[#55580] [CommonRuby - Feature #8556][Open] MutexedDelegator as a trivial way to make an object thread-safe — "headius (Charles Nutter)" <headius@...>

19 messages 2013/06/21

[#55596] [ruby-trunk - Feature #8563][Open] Instance variable arguments — "sawa (Tsuyoshi Sawada)" <sawadatsuyoshi@...>

18 messages 2013/06/22

[#55638] [CommonRuby - Feature #8568][Open] Introduce RbConfig value for native word size, to avoid Fixnum#size use — "headius (Charles Nutter)" <headius@...>

18 messages 2013/06/24

[#55678] [ruby-trunk - Feature #8572][Open] Fiber should be a Enumerable — "mattn (Yasuhiro Matsumoto)" <mattn.jp@...>

13 messages 2013/06/28

[#55699] [ruby-trunk - Feature #8579][Open] Frozen string syntax — "charliesome (Charlie Somerville)" <charliesome@...>

20 messages 2013/06/29

[#55708] [ruby-trunk - Bug #8584][Assigned] Remove curses — "shugo (Shugo Maeda)" <redmine@...>

17 messages 2013/06/30

[ruby-core:55667] [ruby-trunk - Feature #8544] OpenURI should open 'file://' URIs

From: "naruse (Yui NARUSE)" <naruse@...>
Date: 2013-06-27 04:47:22 UTC
List: ruby-core #55667
Issue #8544 has been updated by naruse (Yui NARUSE).


Experimental implementation is below, it needs error handling and rdoc and tests.

diff --git a/lib/open-uri.rb b/lib/open-uri.rb
index 32f0662..21af81b 100644
--- a/lib/open-uri.rb
+++ b/lib/open-uri.rb
@@ -781,4 +781,20 @@ module URI
 
     include OpenURI::OpenRead
   end
+
+  class File
+    def buffer_open(buf, proxy, options) # :nodoc:
+      if self.host && self.host.downcase != 'localhost'
+        raise ArgumentError, "URI::File#open can't open remote file"
+      end
+      begin
+        raise if options[:mode].nil?
+      rescue
+        options[:mode] = IO::RDONLY
+      end
+      buf.instance_variable_set :@io, ::File.open(self.path, options)
+    end
+
+    include OpenURI::OpenRead
+  end
 end
diff --git a/lib/uri.rb b/lib/uri.rb
index 2e136eb..19bd1d6 100644
--- a/lib/uri.rb
+++ b/lib/uri.rb
@@ -103,6 +103,7 @@ end
 
 require 'uri/common'
 require 'uri/generic'
+require 'uri/file'
 require 'uri/ftp'
 require 'uri/http'
 require 'uri/https'
diff --git a/lib/uri/file.rb b/lib/uri/file.rb
new file mode 100644
index 0000000..b6806fb
--- /dev/null
+++ b/lib/uri/file.rb
@@ -0,0 +1,91 @@
+# = uri/file.rb
+#
+# Author:: Akira Yamada <[email protected]>
+# License:: You can redistribute it and/or modify it under the same term as Ruby.
+# Revision:: $Id$
+#
+# See URI for general documentation
+#
+
+require 'uri/generic'
+
+module URI
+
+  #
+  # File URI syntax is defined by RFCXXXX section X.X.
+  #
+  class File < Generic
+    #
+    # An Array of the available components for URI::File
+    #
+    COMPONENT = [
+      :scheme,
+      :userinfo, :host,
+      :path
+    ].freeze
+
+    #
+    # == Description
+    #
+    # Creates a new URI::File object from components, with syntax checking.
+    #
+    # The components accepted are +userinfo+, +host+, +path+ and
+    # +typecode+.
+    #
+    # The components should be provided either as an Array, or as a Hash
+    # with keys formed by preceding the component names with a colon.
+    #
+    # If an Array is used, the components must be passed in the order
+    # [userinfo, host, port, path, typecode]
+    #
+    # If the path supplied is absolute, it will be escaped in order to
+    # make it absolute in the URI. Examples:
+    #
+    #     require 'uri'
+    #
+    #     uri = URI::File.build(['user:password', 'ftp.example.com', nil,
+    #       '/path/file.> zip', 'i'])
+    #     puts uri.to_s  ->  ftp://user:[email protected]/%2Fpath/file.zip;type=a
+    #
+    #     uri2 = URI::File.build({:host => 'ftp.example.com',
+    #       :path => 'ruby/src'})
+    #     puts uri2.to_s  ->  ftp://ftp.example.com/ruby/src
+    #
+    def self.build(args)
+
+      tmp = Util::make_components_hash(self, args)
+
+      return super(tmp)
+    end
+
+    #
+    # == Description
+    #
+    # Creates a new URI::File object from generic URL components with no
+    # syntax checking.
+    #
+    # Unlike build(), this method does not escape the path component as
+    # required by RFC1738; instead it is treated as per RFC2396.
+    #
+    # Arguments are +scheme+, +host+, +path+,
+    # +query+ and +fragment+, in that order.
+    #
+    def initialize(*arg)
+      super(*arg)
+      if @port
+        raise InvalidURIError, "a file URI can't have port"
+      end
+      if @password
+        raise InvalidURIError, "a file URI can't have password"
+      end
+    end
+
+    # Returns a String representation of the URI::File
+    def to_s
+      str = super
+
+      return str
+    end
+  end
+  @@schemes['FILE'] = File
+end

----------------------------------------
Feature #8544: OpenURI should open 'file://' URIs
https://bugs.ruby-lang.org/issues/8544#change-40172

Author: silasdavis (Silas Davis)
Status: Open
Priority: Normal
Assignee: 
Category: core
Target version: next minor


The following code prints the contents of '/tmp/file.txt':

require 'open-uri'
open('/tmp/file.txt').read {|f| puts f.read }

which although useful should probably fail since a unix file path is not a URI, and therefore might shield data problems in a system

However the following should produce the same output and is a URI, but fails:

open('file:///tmp/file.txt').read {|f| puts f.read }

I note that the documentation for open-uri does explain that it is a wrapper for http, https, and ftp, but to deserve its name it should open such URIs as specified in this RFC: http://tools.ietf.org/html/rfc1630. This coupled with the fact that it already does open files, but not by a URI specification.



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

In This Thread