lib/eac_rest/response.rb in eac_rest-0.4.0 vs lib/eac_rest/response.rb in eac_rest-0.5.0
- old
+ new
@@ -4,10 +4,22 @@
require 'eac_ruby_utils/core_ext'
require 'json'
module EacRest
class Response < ::StandardError
+ HEADER_LINE_PARSER = /\A([^:]+):(.*)\z/.to_parser do |m|
+ [m[1].strip, m[2].strip]
+ end
+
+ # https://www.w3.org/wiki/LinkHeader
+ LINKS_HEADER_NAME = 'Link'
+
+ # https://www.w3.org/wiki/LinkHeader
+ LINK_PARSER = /\A\<(.+)\>\s*;\s*rel\s*=\s*\"(.*)\"\z/.to_parser do |m|
+ [m[2], m[1]]
+ end
+
common_constructor :curl, :body_data_proc
def body_data
r = performed_curl.headers['Accept'].if_present(body_str) do |v|
method_name = "body_data_from_#{v.parameterize.underscore}"
@@ -21,18 +33,38 @@
raise_unless_200
body_data
end
- delegate :body_str, :headers, to: :performed_curl
+ delegate :body_str, to: :performed_curl
def body_str_or_raise
raise_unless_200
body_str
end
+ def header(name)
+ hash_search(headers, name)
+ end
+
+ def headers
+ performed_curl.header_str.each_line.map(&:strip)[1..-1].reject(&:blank?)
+ .map { |header_line| HEADER_LINE_PARSER.parse!(header_line) }
+ .to_h
+ end
+
+ def link(rel)
+ hash_search(links, rel)
+ end
+
+ def links
+ header(LINKS_HEADER_NAME).if_present({}) do |v|
+ v.split(',').map { |w| LINK_PARSER.parse!(w.strip) }.to_h
+ end
+ end
+
def raise_unless_200
return nil if status == 200
raise self
end
@@ -53,9 +85,17 @@
::JSON.parse(body_str)
end
def body_data_from_application_xml
Hash.from_xml(body_str)
+ end
+
+ def hash_search(hash, key)
+ key = key.to_s.downcase
+ hash.each do |k, v|
+ return v if k.to_s.downcase == key
+ end
+ nil
end
def perform
@perform ||= begin
curl.perform || raise("CURL perform failed for #{url}")