Packages
exvcr
0.13.3
0.17.1
0.17.0
0.16.0
0.15.2
0.15.1
0.15.0
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.5
0.13.4
0.13.3
0.13.2
0.13.1
0.13.0
0.12.3
0.12.2
0.12.1
0.12.0
0.11.2
0.11.1
0.11.0
0.10.4
0.10.3
0.10.2
0.10.1
0.10.0
0.9.1
0.9.0
0.8.12
0.8.11
0.8.10
0.8.9
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.1
0.4.0
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.1
0.2.0
0.1.7
0.1.6
0.1.5
HTTP request/response recording library for elixir, inspired by VCR.
Current section
Files
Jump to
Current section
Files
lib/exvcr/adapter/hackney/converter.ex
defmodule ExVCR.Adapter.Hackney.Converter do
@moduledoc """
Provides helpers to mock :hackney methods.
"""
use ExVCR.Converter
defp string_to_response(string) do
response = Enum.map(string, fn {x, y} -> {String.to_atom(x), y} end)
response = struct(ExVCR.Response, response)
response =
if is_map(response.headers) do
headers = response.headers |> Map.to_list()
%{response | headers: headers}
else
response
end
response
end
defp request_to_string(request) do
method = Enum.fetch!(request, 0) |> to_string()
url = Enum.fetch!(request, 1) |> parse_url()
headers = Enum.at(request, 2, []) |> parse_headers()
body = Enum.at(request, 3, "") |> parse_request_body()
options = Enum.at(request, 4, []) |> sanitize_options() |> parse_options()
%ExVCR.Request{
url: url,
headers: headers,
method: method,
body: body,
options: options
}
end
# Sanitize options so that they can be encoded as json.
defp sanitize_options(options) do
Enum.map(options, &do_sanitize/1)
end
defp do_sanitize({key, value}) when is_function(key) do
{inspect(key), value}
end
defp do_sanitize({key, value}) when is_list(value) do
{key, Enum.map(value, &do_sanitize/1)}
end
defp do_sanitize({key, value}) when is_tuple(value) do
{key, Tuple.to_list(do_sanitize(value))}
end
defp do_sanitize({key, value}) when is_function(value) do
{key, inspect(value)}
end
defp do_sanitize({key, value}) do
{key, value}
end
defp do_sanitize(key) when is_atom(key) do
{key, true}
end
defp do_sanitize(value) do
value
end
defp response_to_string({:ok, status_code, headers, body_or_client}) do
body =
case body_or_client do
string when is_binary(string) -> string
# Client is already replaced by body through ExVCR.Adapter.Hackney adapter.
ref when is_reference(ref) -> inspect(ref)
end
%ExVCR.Response{
type: "ok",
status_code: status_code,
headers: parse_headers(headers),
body: body
}
end
defp response_to_string({:ok, status_code, headers}) do
%ExVCR.Response{
type: "ok",
status_code: status_code,
headers: parse_headers(headers)
}
end
defp response_to_string({:error, reason}) do
%ExVCR.Response{
type: "error",
body: Atom.to_string(reason)
}
end
def parse_request_body({:form, body}) do
:hackney_request.encode_form(body)
|> elem(2)
|> to_string
|> ExVCR.Filter.filter_sensitive_data()
end
def parse_request_body(body), do: super(body)
end