Packages
tesla
0.1.0
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/adapter/ibrowse.ex
defmodule Tesla.Adapter.Ibrowse do
def start do
:ibrowse.start
end
def call(env) do
opts = []
if target = env.opts[:respond_to] do
gatherer = spawn_link fn -> gather_response(env, target, {:ok, nil, nil, nil}) end
opts = opts ++ [stream_to: gatherer]
{:ibrowse_req_id, id} = send_req(env, opts)
{:ok, id}
else
format_response(env, send_req(env, opts))
end
end
defp format_response(env, res) do
{:ok, status, headers, body} = res
{status, _} = Integer.parse(to_string(status))
headers = Enum.into(headers, %{})
%{env | status: status,
headers: headers,
body: body}
end
defp send_req(env, opts) do
:ibrowse.send_req(
env.url |> to_char_list,
Enum.into(env.headers, []),
env.method,
[],
opts
)
end
defp gather_response(env, target, res) do
{:ok, _status, _headers, _body} = res
receive do
{:ibrowse_async_headers, _, status, headers} ->
gather_response(env, target, {:ok, status, headers, _body})
{:ibrowse_async_response, _, body} ->
body = if _body do
_body <> body
else
body
end
gather_response(env, target, {:ok, _status, _headers, body})
{:ibrowse_async_response_end, _} ->
response = format_response(env, res)
send target, {:tesla_response, response}
end
end
end