fluke/devops-client/lib/devops-client/handler/helpers/http_utils.rb

168 lines
4.1 KiB
Ruby

module HttpUtils
def get_chunk path, params={}
submit do |http|
http.get(create_url(path), convert_params(params)) do |chunk|
puts chunk
end
end
""
end
def get path, params={}
get_with_headers path, params, self.headers("Content-Type")
end
def get_with_headers path, params={}, headers={}
submit do |http|
http.get(create_url(path), convert_params(params), headers)
end
end
def post path, params={}
self.post_body(path, params.to_json)
end
def post_body path, body
post_body_with_headers path, body, self.headers
end
def post_chunk_body path, body, json=true
h = (json ? self.headers : self.headers("Content-Type", "Accept"))
submit do |http|
buf = ""
http.force_basic_auth = true
resp = http.post(create_url(path), body: body, header: h) do |chunk|
puts chunk
buf = chunk
end
if resp.ok?
status = check_status(buf)
exit(status) unless status == 0
end
resp
end
""
end
def post_chunk path, params={}
self.post_chunk_body path, params.to_json
end
def post_body_with_headers path, body='', headers={}
submit do |http|
http.post(create_url(path), body, headers)
end
end
def delete path, params={}
delete_body path, params.to_json
end
def delete_body path, body
submit do |http|
http.delete(create_url(path), body, self.headers)
end
end
def put path, params={}
put_body path, params.to_json
end
def put_body path, body
submit do |http|
http.put(create_url(path), body, self.headers)
end
end
protected
def update_object_from_file object_class, object_id, file
unless File.exists?(file)
@options_parser.invalid_update_command
abort I18n.t("handler.error.file.not_exist", :file => file)
end
update_object_from_json object_class, object_id, File.read(file)
end
def update_object_from_json object_class, object_id, json
put_body "/#{object_class}/#{object_id}", json
rescue NotFound => e
post_body "/#{object_class}", json
end
def create_url path
a = [self.options[:api], path]
a.unshift(self.options[:prefix]) unless self.options[:prefix].nil?
p = ""
a.each{|e| p << (e.start_with?("/") ? e : "/" + e)}
URI.join(self.host, p).to_s
end
def submit
http = HTTPClient.new
http.receive_timeout = 0
http.send_timeout = 0
http.set_auth(nil, self.username, self.password)
res = yield http
if res.ok?
return (res.contenttype.include?("application/json") ? JSON.parse(res.body) : res.body)
end
case res.status
when 404
raise NotFound.new(extract_message(res))
when 400
raise InvalidQuery.new(extract_message(res))
when 401
e = extract_message(res)
e = I18n.t("handler.error.unauthorized") if (e.nil? or e.strip.empty?)
raise DevopsException.new(e)
else
raise DevopsException.new(extract_message(res))
end
end
def headers *exclude
h = {
"Accept" => "application/json",
"Content-Type" => "application/json; charset=UTF-8"
}
h["Accept-Language"] = I18n.locale
exclude.each do |key|
h.delete(key)
end
h
end
def extract_message result
return nil if result.body.nil?
result.contenttype.include?("application/json") ? JSON.parse(result.body)["message"] : result.body
end
def convert_params params
params_filter(params.select{|k,v| k != :cmd and !v.nil?}).join("&")
end
def params_filter params
r = []
return params if params.kind_of?(String)
params.each do |k,v|
key = k.to_s
if v.kind_of?(Array)
v.each do |val|
r.push "#{key}[]=#{val}"
end
elsif v.kind_of?(Hash)
buf = {}
v.each do |k1,v1|
buf["#{key}[#{k1}]"] = v1
end
r = r + params_filter(buf)
else
r.push "#{key}=#{v}"
end
end
r
end
end