Packages
tesla
0.3.1
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/core.ex
defmodule Tesla.Middleware.BaseUrl do
def call(env, run, base) do
run.(apply_base(env, base))
end
def apply_base(env, base) do
if Regex.match?(~r/^https?:\/\//, env.url) do
env # skip if url is already with scheme
else
%{env | url: join(base, env.url)}
end
end
defp join(base, url) do
case {String.last(base), url} do
{"/", "/" <> rest} -> base <> rest
{"/", rest} -> base <> rest
{_, "/" <> rest} -> base <> "/" <> rest
{_, rest} -> base <> "/" <> rest
end
end
end
defmodule Tesla.Middleware.Headers do
def call(env, run, headers) do
headers = Map.merge(env.headers, headers)
run.(%{env | headers: headers})
end
end
defmodule Tesla.Middleware.QueryParams do
def call(env, run, query) do
env = %{env | url: merge_url_and_query(env.url, query)}
run.(env)
end
@spec merge_url_and_query(String.t, %{}) :: String.t
def merge_url_and_query(url, query) do
query = for {key, val} <- query, into: %{}, do: {to_string(key), val}
uri = URI.parse(url)
q = if uri.query do
env_query = URI.decode_query(uri.query)
Map.merge(query, env_query)
else
query
end
uri |> Map.put(:query, URI.encode_query(q)) |> URI.to_string
end
end
defmodule Tesla.Middleware.DecodeRels do
def call(env, run, []) do
env = run.(env)
if env.headers['Link'] do
rels = env.headers['Link']
|> to_string
|> String.split(",")
|> Enum.map(&String.strip/1)
|> Enum.map(fn e -> Regex.run(~r/\A<(.+)>; rel="(.+)"\z/, e, capture: :all_but_first) |> List.to_tuple end)
|> Enum.reduce(%{}, fn ({url, key}, a) -> Dict.put(a, key, url) end)
env |> Map.put(:rels, rels)
else
env
end
end
end
defmodule Tesla.Middleware.AdapterOptions do
def call(env, run, opts) do
run.(%{env | opts: env.opts ++ opts})
end
end
defmodule Tesla.Middleware.BaseUrlFromConfig do
def call(env, run, opts) do
run.(%{env | url: config(opts)[:base_url] <> env.url})
end
defp config(opts) do
Application.get_env(Keyword.fetch!(opts, :otp_app), Keyword.fetch!(opts, :module))
end
end