Packages
tesla
0.3.6
1.20.0
1.18.3
1.18.2
1.18.1
1.18.0
1.17.0
1.16.0
1.15.3
1.15.2
1.15.1
1.15.0
1.14.3
1.14.2
1.14.1
1.14.0
1.13.2
1.13.1
1.13.0
1.12.3
1.12.2
1.12.1
1.12.0
1.11.2
1.11.1
1.11.0
1.10.3
1.10.2
1.10.1
1.10.0
1.9.0
1.8.1
retired
1.8.0
1.7.0
1.6.1
1.6.0
1.5.1
1.5.0
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.3
1.3.2
1.3.1
1.3.0
1.2.1
1.2.0
1.1.0
1.0.0
1.0.0-beta.1
0.10.0
0.9.0
0.8.0
0.7.2
0.7.1
0.7.0
0.6.0
0.5.2
0.5.1
0.5.0
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.2.2
0.2.1
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
HTTP client library, with support for middleware and multiple adapters.
Current section
Files
Jump to
Current section
Files
lib/tesla/middleware/json.ex
defmodule Tesla.Middleware.DecodeJson do
# NOTE: text/javascript added to support Facebook Graph API.
# see https://github.com/teamon/tesla/pull/13
@valid_content_types ["application/json", "text/javascript"]
def call(env, run, opts \\ []) do
decode = get_decode(opts)
env = run.(env)
if json?(env) do
{:ok, body} = decode.(to_string(env.body))
%{env | body: body}
else
env
end
end
def get_decode(opts) do
if opts[:decode] do
opts[:decode]
else
engine = opts[:engine] || Poison
fn e -> apply(engine, :decode, [e, (opts[:opts] || [])]) end
end
end
def json?(env) do
valid_content_type?(env) && parsable_body?(env)
end
def valid_content_type?(env) do
if ct = find_content_type(env.headers) do
Enum.find(@valid_content_types, fn(x) -> String.starts_with?(ct, x) end)
else
false
end
end
def find_content_type(headers) do
case Enum.find(headers, fn {k,_} -> String.downcase(to_string(k)) == "content-type" end) do
{_, ct} -> to_string(ct)
nil -> nil
end
end
def parsable_body?(env) do
is_binary(env.body) || is_list(env.body)
end
end
defmodule Tesla.Middleware.EncodeJson do
def call(env, run, opts \\ []) do
if env.body do
body = encode_body(env.body, get_encode(opts))
headers = %{'Content-Type' => 'application/json'}
env = %{env | body: body}
Tesla.Middleware.Headers.call(env, run, headers)
else
run.(env)
end
end
def get_encode(opts) do
if opts[:encode] do
opts[:encode]
else
engine = opts[:engine] || Poison
fn e -> apply(engine, :encode, [e, (opts[:opts] || [])]) end
end
end
def encode_body(%Stream{} = body, encode_fun), do: encode_body_stream(body, encode_fun)
def encode_body(body, encode_fun) when is_function(body), do: encode_body_stream(body, encode_fun)
def encode_body(body, encode_fun) do
{:ok, body} = encode_fun.(body)
body
end
def encode_body_stream(body, encode_fun) do
Stream.map body, fn item -> encode_body(item, encode_fun) <> "\n" end
end
end