class FoucaultHttp::HttpPort
Constants
- BAD_REQUEST
- FAIL
- NOT_FOUND
- OK
- SYSTEM_FAILURE
- UNAUTHORISED
- UNPROCESSABLE_ENTITY
Public Class Methods
address()
click to toggle source
# File lib/foucault_http/http_port.rb, line 79 def address -> service, resource { (service || "") + (resource || "") }.curry end
addressed()
click to toggle source
# File lib/foucault_http/http_port.rb, line 69 def addressed -> service, resource, connection { connection.(address.(service, resource)) }.curry end
catastrophic_failure(response)
click to toggle source
# File lib/foucault_http/http_port.rb, line 159 def catastrophic_failure(response) OpenStruct.new( status: SYSTEM_FAILURE, exception: parse_error_response(response), code: 418 ) end
connection()
click to toggle source
# File lib/foucault_http/http_port.rb, line 75 def connection -> opts, encoding, address { HttpConnection.new.connection(address, opts, encoding) }.curry end
context_for_log(service, resource, response)
click to toggle source
# File lib/foucault_http/http_port.rb, line 209 def context_for_log(service, resource, response) { http_code: response.code, resource: address.(service, resource), fail_response: log_of_failure(response) } end
delete()
click to toggle source
# File lib/foucault_http/http_port.rb, line 40 def delete -> correlation, service, resource, opts, hdrs { ( Fn.either.(net_ok).(Monad.success).(Monad.failure) << log_response.([], service, resource, __method__) << response_value << run_delete.(hdrs) << addressed.(service, resource)).(connection.(opts, nil)) } end
evalulate_status()
click to toggle source
# File lib/foucault_http/http_port.rb, line 103 def evalulate_status -> status { case status when 200..300 OK when 400 BAD_REQUEST when 401, 403 UNAUTHORISED when 404 NOT_FOUND when 422 UNPROCESSABLE_ENTITY when 500..530 SYSTEM_FAILURE else FAIL end } end
get()
click to toggle source
# File lib/foucault_http/http_port.rb, line 30 def get -> correlation, service, resource, opts, hdrs, enc, query { ( Fn.either.(net_ok).(Monad.success).(Monad.failure) << log_response.(correlation, service, resource, __method__) << response_value << run_get.(hdrs, query) << addressed.(service, resource)).(connection.(opts, enc)) } end
json_parser()
click to toggle source
# File lib/foucault_http/http_port.rb, line 176 def json_parser -> response { JSON.parse(response.body) } end
log_of_failure(response)
click to toggle source
# File lib/foucault_http/http_port.rb, line 217 def log_of_failure(response) return nil if net_ok.(response) response.body.inspect end
log_response()
click to toggle source
# File lib/foucault_http/http_port.rb, line 91 def log_response -> correlation, service, resource, api, response { info(structured_log(service, resource, api, response, correlation)) response }.curry end
net_ok()
click to toggle source
# File lib/foucault_http/http_port.rb, line 196 def net_ok -> value { value.status == OK } end
nil_parser()
click to toggle source
# File lib/foucault_http/http_port.rb, line 192 def nil_parser -> response { response.body } end
parse_error_response(response)
click to toggle source
# File lib/foucault_http/http_port.rb, line 167 def parse_error_response(response) result = response.to_result if result.failure.respond_to?(:exception) {exception_class: result.failure.exception.class.name, exception: result.failure.message} else {execepton: "not-determined"} end end
parser_fn()
click to toggle source
# File lib/foucault_http/http_port.rb, line 131 def parser_fn -> type { case type when "text/html" xml_parser when "text/plain" text_parser when "text/csv" text_parser when "application/json" json_parser when "application/xml", "application/soap+xml", "text/xml" xml_parser else nil_parser end } end
post()
click to toggle source
# File lib/foucault_http/http_port.rb, line 20 def post -> correlation, service, resource, opts, hdrs, body_fn, enc, body { ( Fn.either.(net_ok).(Monad.success).(Monad.failure) << log_response.(correlation, service, resource, __method__) << response_value << run_post.(hdrs, body_fn, body) << addressed.(service, resource)).(connection.(opts, enc)) } end
response_body_parser()
click to toggle source
takes a content type and returns a parser; e.g. “application/json; charset=utf-8” returns the json_parser
# File lib/foucault_http/http_port.rb, line 125 def response_body_parser parser_fn << Fn.at.(0) << Fn.split.(";") end
response_value()
click to toggle source
# File lib/foucault_http/http_port.rb, line 85 def response_value -> response { response.success? ? try_handle_response(response) : catastrophic_failure(response) } end
returned_response(response)
click to toggle source
# File lib/foucault_http/http_port.rb, line 150 def returned_response(response) raise(NoContentTypeError.new("Content Type in response is nil; body: #{response.value_or.body}")) unless response.value_or.headers["content-type"] OpenStruct.new( status: evalulate_status.(response.value_or.status), code: response.value_or.status, body: response_body_parser.(response.value_or.headers["content-type"]).(response.value_or) ) end
run_delete()
click to toggle source
# File lib/foucault_http/http_port.rb, line 63 def run_delete -> hdrs, connection { connection.delete(hdrs) }.curry end
run_get()
click to toggle source
# File lib/foucault_http/http_port.rb, line 57 def run_get -> hdrs, query, connection { connection.get(hdrs, query) }.curry end
run_post()
click to toggle source
# File lib/foucault_http/http_port.rb, line 51 def run_post -> hdrs, body_fn, body, connection { connection.post(hdrs, Try { body_fn.(body) }) }.curry end
structured_log(service, resource, api, response, correlation={})
click to toggle source
# File lib/foucault_http/http_port.rb, line 200 def structured_log(service, resource, api, response, correlation={}) { msg: "Common::Network::Net", context: context_for_log(service, resource, response), step: api, status: response.status }.merge(correlation || {}) end
text_csv()
click to toggle source
# File lib/foucault_http/http_port.rb, line 188 def text_csv -> response { response.body } end
text_parser()
click to toggle source
# File lib/foucault_http/http_port.rb, line 184 def text_parser -> response { response.body } end
try_handle_response(response)
click to toggle source
# File lib/foucault_http/http_port.rb, line 98 def try_handle_response(response) result = Try { returned_response(response) } result.success? ? result.value_or : catastrophic_failure(result) end
xml_parser()
click to toggle source
# File lib/foucault_http/http_port.rb, line 180 def xml_parser -> response { Nokogiri::XML(response.body) } end