module NiceHttpHttpMethods
def get(arg, save_data: '')
begin
path, data, = manage_request(arg)
@start_time = Time.now if @start_time.nil?
if @use_mocks and arg.kind_of?(Hash) and arg.keys.include?(:mock_response)
data = ""
if arg[:mock_response].keys.include?(:data)
data = arg[:mock_response][:data]
if data.kind_of?(Hash) begin
require "json"
data = data.to_json
rescue
@logger.fatal "There was a problem converting to json: #{data}"
end
end
end
@logger.warn "Pay attention!!! This is a mock response:"
@start_time_net = Time.now if @start_time_net.nil?
manage_response(arg[:mock_response], data.to_s)
return @response
end
begin
if path.start_with?("http:") or path.start_with?("https:") require "uri"
uri = URI.parse(path)
ssl = false
ssl = true if path.include?("https:")
server = "http://"
server = "https://" if path.start_with?("https:")
if uri.port != 443
server += "#{uri.host}:#{uri.port}"
else
server += "#{uri.host}"
end
http_redir = nil
self.class.connections.each { |conn|
if conn.host == uri.host and conn.port == uri.port
http_redir = conn
break
end
}
if !http_redir.nil?
path, data, = manage_request(arg)
http_redir.cookies.merge!(@cookies)
http_redir..merge!()
resp = http_redir.get(path.gsub(server, ""))
@response = http_redir.response
else
@logger.warn "It seems like the http connection cannot redirect to #{server} because there is no active connection for that server. You need to create previously one."
end
else
@start_time_net = Time.now if @start_time_net.nil?
resp = @http.get(path, )
if resp.code == 401 and @headers_orig.values.map(&:class).include?(Proc)
try = false
@headers_orig.each do |k,v|
if v.is_a?(Proc) and .key?(k)
try = true
[k] = v.call
end
end
if try
@logger.warn "Not authorized. Trying to generate a new token."
resp = @http.get(path, )
end
end
data = resp.body
manage_response(resp, data)
end
rescue Exception => stack
@logger.warn stack
@logger.warn "The connection seems to be closed in the host machine. Trying to reconnect"
@http.finish()
@http.start()
@start_time_net = Time.now if @start_time_net.nil?
@headers_orig.each {|k,v| [k] = v.call if v.is_a?(Proc) and .key?(k)}
resp = @http.get(path, )
data = resp.body
manage_response(resp, data)
end
if @auto_redirect and @response[:code].to_i >= 300 and @response[:code].to_i < 400 and @response.include?(:location)
if @num_redirects <= 30
@num_redirects += 1
current_server = "http"
current_server += "s" if @ssl == true
current_server += "://#{@host}"
location = @response[:location].gsub(current_server, "")
@logger.info "(#{@num_redirects}) Redirecting NiceHttp to #{location}"
get(location)
else
@logger.fatal "(#{@num_redirects}) Maximum number of redirections for a single request reached. Be sure everything is correct, it seems there is a non ending loop"
@num_redirects = 0
end
else
@num_redirects = 0
end
if save_data!=''
require 'pathname'
pn_get = Pathname.new(path)
if Dir.exist?(save_data)
save = save_data + "/" + pn_get.basename.to_s
elsif save_data[-1]=="/"
save = save_data + pn_get.basename.to_s
else
save = save_data
end
if Dir.exist?(Pathname.new(save).dirname)
File.open(save, 'wb') { |fp| fp.write(@response.data) }
else
@logger.fatal "The folder #{Pathname.new(save).dirname} doesn't exist"
end
end
return @response
rescue Exception => stack
@logger.fatal stack
return { fatal_error: stack.to_s, code: nil, message: nil, data: "" }
end
end
def post(*arguments)
begin
path, data, = manage_request(*arguments)
@start_time = Time.now if @start_time.nil?
if arguments.size > 0 and arguments[0].kind_of?(Hash)
arg = arguments[0]
if @use_mocks and arg.kind_of?(Hash) and arg.keys.include?(:mock_response)
data = ""
if arg[:mock_response].keys.include?(:data)
data = arg[:mock_response][:data]
if data.kind_of?(Hash) begin
require "json"
data = data.to_json
rescue
@logger.fatal "There was a problem converting to json: #{data}"
end
end
end
@logger.warn "Pay attention!!! This is a mock response:"
@start_time_net = Time.now if @start_time_net.nil?
manage_response(arg[:mock_response], data.to_s)
return @response
end
end
begin
@start_time_net = Time.now if @start_time_net.nil?
if ["Content-Type"] == "multipart/form-data"
require "net/http/post/multipart"
.each { |key, value|
arguments[0][:data].add_field(key, value) }
resp = @http.request(arguments[0][:data])
elsif ["Content-Type"].to_s.include?("application/x-www-form-urlencoded")
encoded_form = URI.encode_www_form(arguments[0][:data])
resp = @http.request_post(path, encoded_form, )
data = resp.body
else
resp = @http.post(path, data, )
if resp.code == 401 and @headers_orig.values.map(&:class).include?(Proc)
try = false
@headers_orig.each do |k,v|
if v.is_a?(Proc) and .key?(k)
try = true
[k] = v.call
end
end
if try
@logger.warn "Not authorized. Trying to generate a new token."
resp = @http.post(path, data, )
end
end
data = resp.body
end
rescue Exception => stack
@logger.warn stack
@logger.warn "The connection seems to be closed in the host machine. Trying to reconnect"
@http.finish()
@http.start()
@start_time_net = Time.now if @start_time_net.nil?
@headers_orig.each {|k,v| [k] = v.call if v.is_a?(Proc) and .key?(k)}
resp, data = @http.post(path, data, )
end
manage_response(resp, data)
if @auto_redirect and @response[:code].to_i >= 300 and @response[:code].to_i < 400 and @response.include?(:location)
if @num_redirects <= 30
@num_redirects += 1
current_server = "http"
current_server += "s" if @ssl == true
current_server += "://#{@host}"
location = @response[:location].gsub(current_server, "")
@logger.info "(#{@num_redirects}) Redirecting NiceHttp to #{location}"
get(location)
else
@logger.fatal "(#{@num_redirects}) Maximum number of redirections for a single request reached. Be sure everything is correct, it seems there is a non ending loop"
@num_redirects = 0
end
else
@num_redirects = 0
end
return @response
rescue Exception => stack
@logger.fatal stack
return { fatal_error: stack.to_s, code: nil, message: nil, data: "" }
end
end
def put(*arguments)
begin
path, data, = manage_request(*arguments)
@start_time = Time.now if @start_time.nil?
if arguments.size > 0 and arguments[0].kind_of?(Hash)
arg = arguments[0]
if @use_mocks and arg.kind_of?(Hash) and arg.keys.include?(:mock_response)
data = ""
if arg[:mock_response].keys.include?(:data)
data = arg[:mock_response][:data]
if data.kind_of?(Hash) begin
require "json"
data = data.to_json
rescue
@logger.fatal "There was a problem converting to json: #{data}"
end
end
end
@logger.warn "Pay attention!!! This is a mock response:"
@start_time_net = Time.now if @start_time_net.nil?
manage_response(arg[:mock_response], data.to_s)
return @response
end
end
begin
@start_time_net = Time.now if @start_time_net.nil?
resp = @http.send_request("PUT", path, data, )
if resp.code == 401 and @headers_orig.values.map(&:class).include?(Proc)
try = false
@headers_orig.each do |k,v|
if v.is_a?(Proc) and .key?(k)
try = true
[k] = v.call
end
end
if try
@logger.warn "Not authorized. Trying to generate a new token."
resp = @http.send_request("PUT", path, data, )
end
end
data = resp.body
rescue Exception => stack
@logger.warn stack
@logger.warn "The connection seems to be closed in the host machine. Trying to reconnect"
@http.finish()
@http.start()
@headers_orig.each {|k,v| [k] = v.call if v.is_a?(Proc) and .key?(k)}
@start_time_net = Time.now if @start_time_net.nil?
resp, data = @http.send_request("PUT", path, data, )
end
manage_response(resp, data)
return @response
rescue Exception => stack
@logger.fatal stack
return { fatal_error: stack.to_s, code: nil, message: nil, data: "" }
end
end
def patch(*arguments)
begin
path, data, = manage_request(*arguments)
@start_time = Time.now if @start_time.nil?
if arguments.size > 0 and arguments[0].kind_of?(Hash)
arg = arguments[0]
if @use_mocks and arg.kind_of?(Hash) and arg.keys.include?(:mock_response)
data = ""
if arg[:mock_response].keys.include?(:data)
data = arg[:mock_response][:data]
if data.kind_of?(Hash) begin
require "json"
data = data.to_json
rescue
@logger.fatal "There was a problem converting to json: #{data}"
end
end
end
@logger.warn "Pay attention!!! This is a mock response:"
@start_time_net = Time.now if @start_time_net.nil?
manage_response(arg[:mock_response], data.to_s)
return @response
end
end
begin
@start_time_net = Time.now if @start_time_net.nil?
resp = @http.patch(path, data, )
if resp.code == 401 and @headers_orig.values.map(&:class).include?(Proc)
try = false
@headers_orig.each do |k,v|
if v.is_a?(Proc) and .key?(k)
try = true
[k] = v.call
end
end
if try
@logger.warn "Not authorized. Trying to generate a new token."
resp = @http.patch(path, data, )
end
end
data = resp.body
rescue Exception => stack
@logger.warn stack
@logger.warn "The connection seems to be closed in the host machine. Trying to reconnect"
@http.finish()
@http.start()
@headers_orig.each {|k,v| [k] = v.call if v.is_a?(Proc) and .key?(k)}
@start_time_net = Time.now if @start_time_net.nil?
resp, data = @http.patch(path, data, )
end
manage_response(resp, data)
if @auto_redirect and @response[:code].to_i >= 300 and @response[:code].to_i < 400 and @response.include?(:location)
if @num_redirects <= 30
@num_redirects += 1
current_server = "http"
current_server += "s" if @ssl == true
current_server += "://#{@host}"
location = @response[:location].gsub(current_server, "")
@logger.info "(#{@num_redirects}) Redirecting NiceHttp to #{location}"
get(location)
else
@logger.fatal "(#{@num_redirects}) Maximum number of redirections for a single request reached. Be sure everything is correct, it seems there is a non ending loop"
@num_redirects = 0
end
else
@num_redirects = 0
end
return @response
rescue Exception => stack
@logger.fatal stack
return { fatal_error: stack.to_s, code: nil, message: nil, data: "" }
end
end
def delete(argument)
begin
if argument.kind_of?(String)
argument = { :path => argument }
end
path, data, = manage_request(argument)
@start_time = Time.now if @start_time.nil?
if argument.kind_of?(Hash)
arg = argument
if @use_mocks and arg.kind_of?(Hash) and arg.keys.include?(:mock_response)
data = ""
if arg[:mock_response].keys.include?(:data)
data = arg[:mock_response][:data]
if data.kind_of?(Hash) begin
require "json"
data = data.to_json
rescue
@logger.fatal "There was a problem converting to json: #{data}"
end
end
end
@logger.warn "Pay attention!!! This is a mock response:"
@start_time_net = Time.now if @start_time_net.nil?
manage_response(arg[:mock_response], data.to_s)
return @response
end
end
begin
@start_time_net = Time.now if @start_time_net.nil?
if data.to_s == ""
resp = @http.delete(path, )
if resp.code == 401 and @headers_orig.values.map(&:class).include?(Proc)
try = false
@headers_orig.each do |k,v|
if v.is_a?(Proc) and .key?(k)
try = true
[k] = v.call
end
end
if try
@logger.warn "Not authorized. Trying to generate a new token."
resp = @http.delete(path, )
end
end
else
request = Net::HTTP::Delete.new(path, )
request.body = data
resp = @http.request(request)
if resp.code == 401 and @headers_orig.values.map(&:class).include?(Proc)
try = false
@headers_orig.each do |k,v|
if v.is_a?(Proc) and .key?(k)
try = true
[k] = v.call
end
end
if try
@logger.warn "Not authorized. Trying to generate a new token."
request = Net::HTTP::Delete.new(path, )
request.body = data
resp = @http.request(request)
end
end
end
data = resp.body
rescue Exception => stack
@logger.warn stack
@logger.warn "The connection seems to be closed in the host machine. Trying to reconnect"
@http.finish()
@http.start()
@headers_orig.each {|k,v| [k] = v.call if v.is_a?(Proc) and .key?(k)}
@start_time_net = Time.now if @start_time_net.nil?
resp, data = @http.delete(path, )
end
manage_response(resp, data)
return @response
rescue Exception => stack
@logger.fatal stack
return { fatal_error: stack.to_s, code: nil, message: nil, data: "" }
end
end
def head(argument)
begin
if argument.kind_of?(String)
argument = { :path => argument }
end
path, data, = manage_request(argument)
@start_time = Time.now if @start_time.nil?
if argument.kind_of?(Hash)
arg = argument
if @use_mocks and arg.kind_of?(Hash) and arg.keys.include?(:mock_response)
@logger.warn "Pay attention!!! This is a mock response:"
@start_time_net = Time.now if @start_time_net.nil?
manage_response(arg[:mock_response], "")
return @response
end
end
begin
@start_time_net = Time.now if @start_time_net.nil?
resp = @http.head(path, )
if resp.code == 401 and @headers_orig.values.map(&:class).include?(Proc)
try = false
@headers_orig.each do |k,v|
if v.is_a?(Proc) and .key?(k)
try = true
[k] = v.call
end
end
if try
@logger.warn "Not authorized. Trying to generate a new token."
resp = @http.head(path, )
end
end
data = resp.body
rescue Exception => stack
@logger.warn stack
@logger.warn "The connection seems to be closed in the host machine. Trying to reconnect"
@http.finish()
@http.start()
@headers_orig.each {|k,v| [k] = v.call if v.is_a?(Proc) and .key?(k)}
@start_time_net = Time.now if @start_time_net.nil?
resp, data = @http.head(path, )
end
manage_response(resp, data)
return @response
rescue Exception => stack
@logger.fatal stack
return { fatal_error: stack.to_s, code: nil, message: nil }
end
end
def send_request(request_hash)
unless request_hash.is_a?(Hash) and request_hash.key?(:method) and request_hash.key?(:path) and
request_hash[:method].is_a?(Symbol) and
[:get, :head, :post, :put, :delete, :patch].include?(request_hash[:method])
message = "send_request: it needs to be supplied a Request Hash that includes a :method and :path. "
message += "Supported methods: :get, :head, :post, :put, :delete, :patch"
@logger.fatal message
return { fatal_error: message, code: nil, message: nil }
else
case request_hash[:method]
when :get
resp = get request_hash
when :post
resp = post request_hash
when :head
resp = head request_hash
when :put
resp = put request_hash
when :delete
resp = delete request_hash
when :patch
resp = patch request_hash
end
return resp
end
end
end