From d83c6d09f3161f9ae4f873230596e28a4d0d28ed Mon Sep 17 00:00:00 2001 From: DanX Date: Wed, 25 Jan 2017 21:28:54 -0200 Subject: [PATCH] Forward http options to httpc request --- lib/detergentex.ex | 4 ++-- lib/detergentex/client.ex | 30 ++++++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/lib/detergentex.ex b/lib/detergentex.ex index 9c3194c..de28730 100644 --- a/lib/detergentex.ex +++ b/lib/detergentex.ex @@ -10,8 +10,8 @@ defmodule Detergentex do Supervisor.start_link(children, opts) end - def call(wsdl, method, params) do - Detergentex.Client.call_service(wsdl, method, params) + def call(wsdl, method, params, options \\ []) do + Detergentex.Client.call_service(wsdl, method, params, options) end def init_model(wsdl_url, prefix \\ 'p') do diff --git a/lib/detergentex/client.ex b/lib/detergentex/client.ex index 7c03cf3..2e9c65e 100644 --- a/lib/detergentex/client.ex +++ b/lib/detergentex/client.ex @@ -1,18 +1,30 @@ defmodule Detergentex.Client do use GenServer + require Record + + def default_logger(_), do: :ok + + original_record = Record.extract(:call_opts, from_lib: "detergent/include/detergent.hrl") + call_opts_record = Keyword.merge(original_record, request_logger: &__MODULE__.default_logger/1, response_logger: &__MODULE__.default_logger/1) + Record.defrecord :call_opts, call_opts_record def start_link do :inets.start() GenServer.start_link(__MODULE__, {}, [name: :detergent_client]) end - def call_service(wsdl, method, params) do + def call_service(wsdl, method, params, options \\ []) do if not is_wsdl(wsdl) do wsdl = to_char_list wsdl end method_to_call = to_char_list(method) detergent_params = convert_to_detergent_params(params) - :detergent.call(wsdl, method_to_call, detergent_params) + + call_options = options + |> convert_to_detergent_params + |> call_opts_from_klist + + :detergent.call(wsdl, method_to_call, detergent_params, call_options) end def init_model(wsdl_url, prefix \\ 'p') do @@ -40,4 +52,18 @@ defmodule Detergentex.Client do end end) end + + defp call_opts_from_klist(keywords) do + call_options = call_opts() + Enum.reduce(keywords, call_options, fn ({k,v}, acc) -> + case k do + :url -> call_opts(acc, url: v) + :prefix -> call_opts(acc, prefix: v) + :http_headers -> call_opts(acc, http_headers: v) + :http_client_options -> call_opts(acc, http_client_options: v) + :request_logger -> call_opts(acc, request_logger: v) + :response_logger -> call_opts(acc, response_logger: v) + end + end) + end end