Current section

Files

Jump to
exvcr lib exvcr adapter httpc.ex
Raw

lib/exvcr/adapter/httpc.ex

defmodule ExVCR.Adapter.Httpc do
@moduledoc """
Provides adapter methods to mock :httpc methods.
"""
use ExVCR.Adapter
defmacro __using__(_opts) do
# do nothing
end
defdelegate convert_from_string(string), to: ExVCR.Adapter.Httpc.Converter
defdelegate convert_to_string(request, response), to: ExVCR.Adapter.Httpc.Converter
@doc """
Returns the name of the mock target module.
"""
def module_name do
:httpc
end
@doc """
Returns list of the mock target methods with function name and callback.
TODO:
{:request, &ExVCR.Recorder.request(recorder, [&1,&2])}
{:request, &ExVCR.Recorder.request(recorder, [&1,&2,&3,&4,&5])}
"""
def target_methods(recorder) do
[ {:request, &ExVCR.Recorder.request(recorder, [&1])},
{:request, &ExVCR.Recorder.request(recorder, [&1,&2,&3,&4])} ]
end
@doc """
Generate key for searching response.
"""
def generate_keys_for_request(request) do
if Enum.count(request) <= 2 do
[url: Enum.fetch!(request, 0), method: :get]
else
url = Enum.fetch!(request, 1) |> elem(0)
method = Enum.fetch!(request, 0)
[url: url, method: method]
end
end
@doc """
Callback from ExVCR.Handler when response is retrieved from the HTTP server.
"""
def hook_response_from_server(response) do
filter_sensitive_data(response)
end
defp filter_sensitive_data({:ok, {status_code, headers, body}}) do
replaced_body = to_string(body) |> ExVCR.Filter.filter_sensitive_data
{:ok, {status_code, headers, replaced_body}}
end
defp filter_sensitive_data({:error, reason}) do
{:error, reason}
end
@doc """
Returns the response from the ExVCR.Reponse record.
"""
def get_response_value_from_cache(response) do
if response.type == "error" do
{:error, response.body}
else
{:ok, {response.status_code, response.headers, response.body}}
end
end
end