# File lib/miga/common/net.rb, line 33 def main_server 'gatech.microbial-genomes.org' end
General web-access functions shared throughout MiGA.
Download a file via FTP using the connection
(returned by
.remote_connection
) with remote name file
into
local target
. If file
is nil
, it
tries to guess the file from connection
. If
target
is nil
, it returns the read data instead
Alternatively, connection
can simply be the host (String), a
recognized Symbol (see .remote_connection
), or a parsed
URI
object, in which case the function opens the connection
automatically
Reports progress to the function block with two arguments: the currently transferred size and the total file size
# File lib/miga/common/net.rb, line 78 def download_file_ftp(connection, file = nil, target = nil) # Open connection unless passed close_conn = false if connection.is_a?(String) || connection.is_a?(Symbol) || connection.is_a?(URI) connection = remote_connection(connection) file ||= remote_connection_uri.path close_conn = true end # Prepare download FileUtils.mkdir_p(File.dirname(target)) if target filesize = connection.size(file) transferred = target && connection.resume && File.exist?(target) ? File.size(target) : 0 # Get in chunks of 1KiB ret = '' connection.getbinaryfile(file, target, 1024) do |data| yield(transferred += data.size, filesize) if block_given? ret += data unless target end # Close connection if automatically opened connection.close if close_conn ret unless target end
Submit an HTTP or HTTPS request using url
, which should be a
URL either as String or parsed URI. The
request follows the method
, which should be a Net::HTTP verb
such as :get
, :post
, or :patch
. All
additional parameters for the corresponding method should be passed as
opts
.
# File lib/miga/common/net.rb, line 112 def http_request(method, url, *opts) doc = nil remote_connection(url).start do |http| res = http.send(method, remote_connection_uri.to_s, *opts) if %w[301 302].include?(res.code) DEBUG "REDIRECTION #{res.code}: #{res['location']}" return http_request(method, res['location'], *opts) end res.value # To force exception unless success doc = res.body end doc end
Returns the URL of the host name
(Symbol)
# File lib/miga/common/net.rb, line 18 def known_hosts(name) case name.to_sym when :miga_online_ftp "ftp://#{main_server}//" # <- // to simplify chdir in connection when :miga_db "ftp://#{main_server}/db" when :miga_dist "ftp://#{main_server}/dist" else raise "Unrecognized server name: #{name}" end end
Returns the address of the main MiGA server
# File lib/miga/common/net.rb, line 33 def main_server 'gatech.microbial-genomes.org' end
# File lib/miga/common/net.rb, line 126 def net_method(method, uri, *opts) attempts ||= 0 uri = URI.parse(uri) if uri.is_a? String DEBUG "#{method.to_s.upcase}: #{uri} #{opts}" case method.to_sym when :ftp download_file_ftp(uri, *opts) else http_request(method, uri, *opts) end rescue => e raise e if (attempts += 1) >= 3 sleep 5 # <- For: 429 Too Many Requests DEBUG "RETRYING after: #{e}" retry end
Normalize the encoding of body
to UTF-8 by attempting several
common recodings. Code from github.com/seq-code/registry
# File lib/miga/common/net.rb, line 149 def normalize_encoding(body) # Test encodings body.force_encoding('utf-8') %w[iso8859-1 windows-1252 us-ascii ascii-8bit].each do |enc| break if body.valid_encoding? recode = body.force_encoding(enc).encode('utf-8') body = recode if recode.valid_encoding? end # If nothing works, replace offending characters with '?' unless body.valid_encoding? body = body.encode( 'utf-8', invalid: :replace, undef: :replace, replace: '?' ) end body end
Connect to an FTP host
(String), a known host name (Symbol,
see .known_hosts
), or a parsed URI
object
Sets the attribute remote_connection_uri
to the parsed
URI
object silently
# File lib/miga/common/net.rb, line 43 def remote_connection(host) host = known_hosts(host) if host.is_a?(Symbol) uri = host.is_a?(URI) ? host : URI.parse(host) @remote_connection_uri = uri case uri.scheme when 'ftp' ftp = Net::FTP.new(uri.host) ftp.passive = true ftp.resume = true ftp.login ftp.chdir(uri.path) unless host.is_a?(URI) ftp when 'http', 'https' http = Net::HTTP.new(uri.host, uri.port) http.read_timeout = 600 http.use_ssl = uri.scheme == 'https' http else raise 'Only FTP, HTTP, and HTTPS are currently supported' end end