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