Module: OpenURI
- Defined in:
- opal/stdlib/open-uri.rb,
opal/stdlib/nodejs/open-uri.rb
Overview
OpenURI is an easy-to-use wrapper for Net::HTTP, Net::HTTPS and Net::FTP.
== Example
It is possible to open an http, https or ftp URL as though it were a file:
open("http://www.ruby-lang.org/") {|f| f.each_line {|line| p line} }
The opened file has several getter methods for its meta-information, as follows, since it is extended by OpenURI::Meta.
open("http://www.ruby-lang.org/en") {|f|
f.each_line {|line| p line}
p f.base_uri #
Additional header fields can be specified by an optional hash argument.
open("http://www.ruby-lang.org/en/", "User-Agent" => "Ruby/#RUBY_VERSION", "From" => "[email protected]", "Referer" => "http://www.ruby-lang.org/") {|f| # ... }
The environment variables such as http_proxy, https_proxy and ftp_proxy are in effect by default. Here we disable proxy:
open("http://www.ruby-lang.org/en/", :proxy => nil) {|f| # ... }
See OpenURI::OpenRead.open and Kernel#open for more on available options.
URI objects can be opened in a similar way.
uri = URI.parse("http://www.ruby-lang.org/en/") uri.open {|f| # ... }
URI objects can be read directly. The returned string is also extended by OpenURI::Meta.
str = uri.read p str.base_uri
Author:: Tanaka Akira [email protected]
Defined Under Namespace
Modules: Meta, OpenRead Classes: Buffer, HTTPError
Class Method Summary collapse
- .build_response(req, status, status_text) ⇒ Object
- .close_io(io) ⇒ Object
- .data(req) ⇒ Object
-
.open_loop(uri, options) ⇒ Object
:nodoc:.
-
.open_uri(name, *rest) ⇒ Object
:nodoc:.
- .request(uri) ⇒ Object
Class Method Details
.build_response(req, status, status_text) ⇒ Object
130 131 132 133 134 135 136 137 138 139 140 |
# File 'opal/stdlib/open-uri.rb', line 130 def self.build_response(req, status, status_text) buf = Buffer.new buf << data(req).pack('c*') io = buf.io #io.base_uri = uri # TODO: Generate a URI object from the uri String io.status = "#{status} #{status_text}" io.('content-type', `req.getResponseHeader("Content-Type") || ''`) last_modified = `req.getResponseHeader("Last-Modified")` io.('last-modified', last_modified) if last_modified io end |
.close_io(io) ⇒ Object
110 111 112 113 114 115 116 |
# File 'opal/stdlib/open-uri.rb', line 110 def self.close_io(io) if io.respond_to? :close! io.close! # Tempfile else io.close unless io.closed? end end |
.data(req) ⇒ Object
142 143 144 145 146 147 148 149 150 151 152 153 |
# File 'opal/stdlib/open-uri.rb', line 142 def self.data(req) %x{ var binStr = req.responseText; var byteArray = []; for (var i = 0, len = binStr.length; i < len; ++i) { var c = binStr.charCodeAt(i); var byteCode = c & 0xff; // byte at offset i byteArray.push(byteCode); } return byteArray; } end |
.open_loop(uri, options) ⇒ Object
:nodoc:
118 119 120 121 122 123 124 125 126 127 128 |
# File 'opal/stdlib/open-uri.rb', line 118 def self.open_loop(uri, ) # :nodoc: req = request(uri) data = `req.responseText` status = `req.status` status_text = `req.statusText && req.statusText.errno ? req.statusText.errno : req.statusText` if status == 200 || (status == 0 && data) build_response(req, status, status_text) else raise OpenURI::HTTPError.new("#{status} #{status_text}", '') end end |
.open_uri(name, *rest) ⇒ Object
:nodoc:
96 97 98 99 100 101 102 103 104 105 106 107 108 |
# File 'opal/stdlib/open-uri.rb', line 96 def self.open_uri(name, *rest) # :nodoc: io = open_loop(name, {}) io.rewind if block_given? begin yield io ensure close_io(io) end else io end end |
.request(uri) ⇒ Object
155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
# File 'opal/stdlib/open-uri.rb', line 155 def self.request(uri) %x{ try { var xhr = new XMLHttpRequest(); xhr.open('GET', uri, false); // We cannot use xhr.responseType = "arraybuffer" because XMLHttpRequest is used in synchronous mode. // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseType#Synchronous_XHR_restrictions xhr.overrideMimeType('text/plain; charset=x-user-defined'); xhr.send(); return xhr; } catch (error) { #{raise OpenURI::HTTPError.new(`error.message`, '')} } } end |