diff options
Diffstat (limited to 'lib/recaptcha/http.ex')
-rw-r--r-- | lib/recaptcha/http.ex | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/lib/recaptcha/http.ex b/lib/recaptcha/http.ex new file mode 100644 index 0000000..01c088a --- /dev/null +++ b/lib/recaptcha/http.ex @@ -0,0 +1,37 @@ +defmodule Recaptcha.Http do + @moduledoc """ + Responsible for managing HTTP requests to the reCAPTCHA API + """ + @headers [{"Content-type", "application/x-www-form-urlencoded"}, {"Accept", "application/json"}] + @url Application.get_env(:recaptcha, :verify_url) + @timeout Application.get_env(:recaptcha, :timeout, 5000) + + @doc """ + Sends an HTTP request to the reCAPTCHA version 2.0 API. + + See the [documentation](https://developers.google.com/recaptcha/docs/verify#api-response) for more details on the API response. + + ## Options + + * `:timeout` - the timeout for the request (defaults to 5000ms) + + ## Example + + {:ok, %{ "success" => success, "challenge_ts" => ts, "hostname" => host, "error-codes" => errors}} = Recaptcha.Http.request_verification(%{ secret: "secret", response: "response", remote_ip: "remote_ip"}) + """ + @spec request_verification(map, [timeout: integer]) :: {:ok, map} | {:error, [atom]} + def request_verification(body, options \\ []) do + result = + with {:ok, response} <- HTTPoison.post(@url, body, @headers, timeout: options[:timeout] || @timeout), + {:ok, data} <- Poison.decode(response.body) do + {:ok, data} + end + + case result do + {:ok, data} -> {:ok, data} + {:error, :invalid} -> {:error, [:invalid_api_response]} + {:error, {:invalid, _reason}} -> {:error, [:invalid_api_response]} + {:error, %{reason: reason}} -> {:error, [reason]} + end + end +end |