Packages
exvcr
0.8.10
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/json.ex
defmodule ExVCR.JSON do
@moduledoc """
Provides a feature to store/load cassettes in json format.
"""
@doc """
Save responses into the json file.
"""
def save(file_name, recordings) do
gunzipped_recordings = recordings
|> Enum.map(&gunzip_recording/1)
json = gunzipped_recordings |> Enum.reverse |> JSX.encode!
unless File.exists?(path = Path.dirname(file_name)), do: File.mkdir_p!(path)
File.write!(file_name, JSX.prettify!(json))
end
defp gunzip_recording(recording = %{request: _, response: %ExVCR.Response{body: nil}}) do
recording
end
defp gunzip_recording(recording = %{request: request, response: response}) do
encoding_header = List.keyfind(response.headers, "Content-Encoding", 0)
case encoding_header do
{"Content-Encoding", "gzip"} ->
decoded_body = :zlib.gunzip(response.body)
decoded_response = %{ response | body: decoded_body }
%{request: request, response: decoded_response}
_ -> recording
end
end
@doc """
Loads the JSON files based on the fixture name and options.
For options, this method just refers to the :custom attribute is set or not.
"""
def load(file_name, custom_mode, adapter) do
case { File.exists?(file_name), custom_mode } do
{ true, _ } -> read_json_file(file_name) |> Enum.map(&adapter.convert_from_string/1)
{ false, true } -> raise ExVCR.FileNotFoundError, message: "cassette file \"#{file_name}\" not found"
{ false, _ } -> []
end
end
@doc """
Reads and parse the json file located at the specified file_name.
"""
def read_json_file(file_name) do
file = File.read!(file_name)
recordings = JSX.decode!(file)
recordings
|> Enum.map(&gzip_recording/1)
end
defp gzip_recording(recording) do
%{recording | "response" => gzip_response(recording["response"])}
end
defp gzip_response(response = %{"body" => nil, "headers" => %{"Content-Encoding" => "gzip"}}) do
response
end
defp gzip_response(response = %{"headers" => %{"Content-Encoding" => "gzip"}}) do
encoded_body = :zlib.gzip(response["body"])
%{ response | "body" => encoded_body }
end
defp gzip_response(response), do: response
end