Packages
new_relic_agent
1.38.0
1.40.3
1.40.2
1.40.1
1.40.0
1.39.0
1.38.0
1.37.0
1.36.0
1.35.0
1.34.0
1.33.0
1.32.0
1.31.1
1.31.0
1.30.0
1.29.0
1.28.0
1.27.8
1.27.7
1.27.6
1.27.5
1.27.4
1.27.3
1.27.2
1.27.1
1.27.0
1.26.0
1.25.3
1.25.2
1.25.1
1.25.0
1.24.5
1.24.4
1.24.3
1.24.2
1.24.1
1.24.0
1.24.0-rc.10
1.24.0-rc.9
1.24.0-rc.8
1.24.0-rc.7
1.23.6
1.23.5
1.23.4
1.23.3
1.23.2
1.23.1
1.23.0
1.23.0-rc.6
1.23.0-rc.5
1.23.0-rc.4
1.23.0-rc.3
1.23.0-rc.2
1.23.0-rc.1
1.22.6
1.22.5
1.22.4
1.22.3
1.22.2
1.22.1
1.22.0
1.21.2
1.21.1
1.21.0
1.21.0-rc.3
1.21.0-rc.1
1.20.0
1.20.0-rc.1
1.19.7
1.19.6
1.19.5
1.19.4
1.19.3
1.19.2
1.19.1
1.19.0
1.18.5
1.18.4
1.18.3
1.18.2
1.18.1
1.18.0
1.18.0-rc.5
1.18.0-rc.4
1.18.0-rc.2
1.18.0-rc.1
1.17.1
1.17.0
1.17.0-rc.4
1.17.0-rc.3
1.17.0-rc.2
1.17.0-rc.1
1.17.0-rc.0
1.16.7
1.16.6
1.16.5
1.16.4
1.16.3
1.16.2
1.16.1
1.16.0
1.16.0-rc.2
1.16.0-rc.1
1.16.0-rc.0
1.15.0
1.15.0-rc.3
1.15.0-rc.2
1.15.0-rc.1
1.14.0
1.13.1
1.13.0
1.12.0
1.11.0
1.10.2
1.10.1
1.10.0
1.9.12
1.9.11
1.9.10
1.9.9
1.9.8
1.9.7
1.9.6
1.9.5
1.9.4
1.9.3
1.9.2
1.9.1
1.9.0
1.8.0
1.7.0
1.6.2
1.6.1
1.6.0
1.5.0
1.4.0
1.3.2
1.3.1
1.3.0
1.2.1
1.2.0
1.1.0
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
New Relic's Open-Source Elixir Agent
Current section
Files
Jump to
Current section
Files
lib/new_relic/util/http.ex
defmodule NewRelic.Util.HTTP do
@moduledoc false
@gzip {~c"content-encoding", ~c"gzip"}
def post(url, body, headers) when is_binary(body) do
headers = [@gzip | Enum.map(headers, fn {k, v} -> {~c"#{k}", ~c"#{v}"} end)]
request = {~c"#{url}", headers, ~c"application/json", :zlib.gzip(body)}
with {:ok, {{_, status_code, _}, _headers, body}} <-
:httpc.request(:post, request, http_options(), []) do
{:ok, %{status_code: status_code, body: to_string(body)}}
end
end
def post(url, body, headers) do
body = NewRelic.JSON.encode!(body)
post(url, body, headers)
rescue
error ->
NewRelic.log(:debug, "Unable to JSON encode: #{inspect(body)}")
{:error, Exception.message(error)}
end
def get(url, headers \\ [], opts \\ []) do
headers = Enum.map(headers, fn {k, v} -> {~c"#{k}", ~c"#{v}"} end)
request = {~c"#{url}", headers}
with {:ok, {{_, status_code, _}, _, body}} <-
:httpc.request(:get, request, http_options(opts), []) do
{:ok, %{status_code: status_code, body: to_string(body)}}
end
end
# Certs are from `CAStore`.
# https://github.com/elixir-mint/castore
# SSL configured according to EEF Security guide:
# https://erlef.github.io/security-wg/secure_coding_and_deployment_hardening/ssl
defp http_options(opts \\ []) do
env_opts = Application.get_env(:new_relic_agent, :httpc_request_options, [])
[
connect_timeout: 1000,
ssl: [
verify: :verify_peer,
cacertfile: CAStore.file_path(),
customize_hostname_check: [
match_fun: :public_key.pkix_verify_hostname_match_fun(:https)
]
]
]
|> Keyword.merge(opts)
|> Keyword.merge(env_opts)
end
end