aboutsummaryrefslogtreecommitdiff
path: root/lib/exping/http.ex
blob: 576562f8e08a9260207135193e701f1b45d5e55b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
defmodule ExPing.HTTP do
  require Logger
  @moduledoc """
  Provides basic HTTP client for pinging endpoints
  """

  @timeout Application.get_env(:exping, :http)[:timeout] || 5000

  @spec head(URI.t) :: {:ok, {integer, binary}} | {:error, term}
  def head(endpoint) do
    ref = make_ref()
    :ok = Logger.info("Sending HEAD request to #{inspect(endpoint)}")
    {:ok, _} = spawn_http_task(:head, [endpoint, ref, self()])

    receive do
      {:http_task_resp, ^ref, {:ok, {_, _}} = resp} -> resp
      {:http_task_resp, ^ref, {:error, _} = error} -> error
      after @timeout ->
        {:error, :timeout}
    end
  end

  @spec get(URI.t) :: {:ok, {integer, binary}} | {:error, term}
  def get(endpoint) do
    ref = make_ref()
    :ok = Logger.info("Sending GET request to #{inspect(endpoint)}")
    {:ok, _} = spawn_http_task(:get, [endpoint, ref, self()])

    receive do
      {:http_task_resp, ^ref, {:ok, _} = resp} -> resp
      {:http_task_resp, ^ref, {:error, _} =  error} -> error
      after @timeout ->
        {:error, :timeout}
    end
  end

  defp spawn_http_task(method, args) do
    Task.Supervisor.start_child(
      ExPing.Supervisor.Task,
      ExPing.HTTP.Task,
      method,
      args)
  end

end