I want to use httpoison
in my first project in Elixir. It’s the only dependency I’ve put into my mix.exs
file. I would love some helpful direction, please and thank you
I see no errors when I run mix deps.get
, however I do see errors when I run mix compile
.
Here are my versions:
OS:
$ grep -E 'NAME|VERS' /etc/os-release
PRETTY_NAME="Ubuntu 22.04.3 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
UBUNTU_CODENAME=jammy
Elixir (vanilla installation via apt install elixir
):
$ elixir --version
Erlang/OTP 24 [erts-12.2.1] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit]
Elixir 1.12.2 (compiled with Erlang/OTP 24)
My httpoison version per the mix file:
$ awk '/defp/,/]/' mix.exs
defp deps do
[
{:httpoison, "~> 2.0"}
# {:dep_from_hexpm, "~> 0.3.0"},
# {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
]
Below, you’ll see output of a couple of commands. I’ve tried the various mix deps.{update|clean}
commands but ultimately none have succeeded in getting this to work. Also, I’ve tried mix local.rebar --force
however I still end up w/ the same issue with ssl_verify_fun
.
You’ll see below the first line in the compile step mentions the following, which I assume is (part of) the issue, though I’m unsure what is expected. Here’s me showing that the files exist as well as their content and ownership (which seems correct to me?):
<snip>
src/ssl_verify_pk.erl:14:14: can't find include lib "public_key/include/public_key.hrl"
% 14| -include_lib("public_key/include/public_key.hrl").
$ grep -r public_key.hrl ./
./deps/ssl_verify_fun/src/ssl_verify_fun_cert_helpers.erl:-include_lib("public_key/include/public_key.hrl").
./deps/ssl_verify_fun/src/ssl_verify_pk.erl:-include_lib("public_key/include/public_key.hrl").
./deps/ssl_verify_fun/src/ssl_verify_fingerprint.erl:-include_lib("public_key/include/public_key.hrl").
./deps/ssl_verify_fun/src/ssl_verify_hostname.erl:-include_lib("public_key/include/public_key.hrl").
someone@machine:~/code/elixir/web_scraper$
someone@machine:~/code/elixir/web_scraper$ for i in $(grep -rl public_key.hrl ./); do ls -lAF "${i}"; done
-rw-rw-r-- 1 someone someone 2733 Dec 22 10:17 ./deps/ssl_verify_fun/src/ssl_verify_fun_cert_helpers.erl
-rw-rw-r-- 1 someone someone 3415 Dec 22 10:17 ./deps/ssl_verify_fun/src/ssl_verify_pk.erl
-rw-rw-r-- 1 someone someone 2402 Dec 22 10:17 ./deps/ssl_verify_fun/src/ssl_verify_fingerprint.erl
-rw-rw-r-- 1 someone someone 7984 Dec 22 10:17 ./deps/ssl_verify_fun/src/ssl_verify_hostname.erl
someone@machine:~/code/elixir/web_scraper$
Output of the build-related commands:
- mix deps.get
$ mix deps.get
Resolving Hex dependencies...
Resolution completed in 0.043s
Unchanged:
certifi 2.12.0
hackney 1.20.1
httpoison 2.2.1
idna 6.1.1
metrics 1.0.1
mimerl 1.2.0
parse_trans 3.4.1
ssl_verify_fun 1.1.7
unicode_util_compat 0.7.0
All dependencies are up to date
- mix deps.compile
$ mix deps.compile
===> Analyzing applications...
===> Compiling parse_trans
===> Analyzing applications...
===> Compiling mimerl
===> Analyzing applications...
===> Compiling metrics
===> Analyzing applications...
===> Compiling unicode_util_compat
===> Analyzing applications...
===> Compiling idna
==> ssl_verify_fun
Compiling 7 files (.erl)
src/ssl_verify_pk.erl:14:14: can't find include lib "public_key/include/public_key.hrl"
% 14| -include_lib("public_key/include/public_key.hrl").
% | ^
src/ssl_verify_fun_cert_helpers.erl:13:14: can't find include lib "public_key/include/public_key.hrl"
% 13| -include_lib("public_key/include/public_key.hrl").
% | ^
src/ssl_verify_hostname.erl:16:14: can't find include lib "public_key/include/public_key.hrl"
% 16| -include_lib("public_key/include/public_key.hrl").
% | ^
src/ssl_verify_fingerprint.erl:15:14: can't find include lib "public_key/include/public_key.hrl"
% 15| -include_lib("public_key/include/public_key.hrl").
% | ^
src/ssl_verify_pk.erl:26:26: record 'OTPCertificate' undefined
% 26| -spec verify_fun(Cert :: #'OTPCertificate'{},
% | ^
src/ssl_verify_fun_cert_helpers.erl:23:34: undefined macro 'id-ce-subjectAltName'
% 23| AltSubject = select_extension(?'id-ce-subjectAltName', Extensions),
% | ^
src/ssl_verify_hostname.erl:28:26: record 'OTPCertificate' undefined
% 28| -spec verify_fun(Cert :: #'OTPCertificate'{},
% | ^
src/ssl_verify_fingerprint.erl:27:26: record 'OTPCertificate' undefined
% 27| -spec verify_fun(Cert :: #'OTPCertificate'{},
% | ^
src/ssl_verify_pk.erl:28:39: record 'Extension' undefined
% 28| {extension, #'Extension'{}}, InitialUserState :: term()) ->
% | ^
src/ssl_verify_fun_cert_helpers.erl:9:2: function extract_dns_names/1 undefined
% 9| -export([extract_dns_names/1,
% | ^
src/ssl_verify_hostname.erl:30:39: record 'Extension' undefined
% 30| {extension, #'Extension'{}} |
% | ^
src/ssl_verify_fingerprint.erl:29:39: record 'Extension' undefined
% 29| {extension, #'Extension'{}}, InitialUserState :: term()) ->
% | ^
src/ssl_verify_pk.erl:51:30: record 'OTPCertificate' undefined
% 51| -spec verify_cert_pk(Cert :: #'OTPCertificate'{}, Pk :: pk()) ->
% | ^
src/ssl_verify_fun_cert_helpers.erl:19:2: spec for undefined function extract_dns_names/1
% 19| -spec extract_dns_names(Cert :: #'OTPCertificate'{}) -> [] | [string()].
% | ^
src/ssl_verify_hostname.erl:48:36: record 'OTPCertificate' undefined
% 48| -spec verify_cert_hostname(Cert :: #'OTPCertificate'{}, Hostname :: hostname()) ->
% | ^
src/ssl_verify_fingerprint.erl:44:39: record 'OTPCertificate' undefined
% 44| -spec verify_cert_fingerprint(Cert :: #'OTPCertificate'{}, Fingerprint :: fingerprint()) ->
% | ^
src/ssl_verify_fun_cert_helpers.erl:19:33: record 'OTPCertificate' undefined
% 19| -spec extract_dns_names(Cert :: #'OTPCertificate'{}) -> [] | [string()].
% | ^
src/ssl_verify_fun_cert_helpers.erl:32:26: record 'OTPCertificate' undefined
% 32| -spec extract_cn(Cert :: #'OTPCertificate'{}) -> {error, no_common_name} | {ok, string()} | {error, invalid}.
% | ^
src/ssl_verify_hostname.erl:78:38: record 'OTPCertificate' undefined
% 78| Cert :: #'OTPCertificate'{},
% | ^
src/ssl_verify_fun_cert_helpers.erl:34:17: record 'OTPCertificate' undefined
% 34| TBSCert = Cert#'OTPCertificate'.tbsCertificate,
% | ^
src/ssl_verify_fun_cert_helpers.erl:35:32: record 'OTPTBSCertificate' undefined
% 35| {rdnSequence, List} = TBSCert#'OTPTBSCertificate'.subject,
% | ^
src/ssl_verify_fun_cert_helpers.erl:38:26: record 'OTPCertificate' undefined
% 38| -spec extract_pk(Cert :: #'OTPCertificate'{}) -> {error, no_common_name} | #'SubjectPublicKeyInfo'{}.
% | ^
src/ssl_verify_fun_cert_helpers.erl:38:76: record 'SubjectPublicKeyInfo' undefined
% 38| -spec extract_pk(Cert :: #'OTPCertificate'{}) -> {error, no_common_name} | #'SubjectPublicKeyInfo'{}.
% | ^
src/ssl_verify_fun_cert_helpers.erl:40:17: record 'OTPCertificate' undefined
% 40| TBSCert = Cert#'OTPCertificate'.tbsCertificate,
% | ^
src/ssl_verify_fun_cert_helpers.erl:41:26: record 'OTPTBSCertificate' undefined
% 41| PublicKeyInfo = TBSCert#'OTPTBSCertificate'.subjectPublicKeyInfo,
% | ^
src/ssl_verify_fun_cert_helpers.erl:42:16: record 'OTPSubjectPublicKeyInfo' undefined
% 42| PublicKeyInfo#'OTPSubjectPublicKeyInfo'.subjectPublicKey.
% | ^
src/ssl_verify_fun_cert_helpers.erl:48:24: record 'Extension' undefined
% 48| -spec extensions_list([#'Extension'{}] | asn1_NOVALUE) -> [] | [#'Extension'{}].
% | ^
src/ssl_verify_fun_cert_helpers.erl:48:65: record 'Extension' undefined
% 48| -spec extensions_list([#'Extension'{}] | asn1_NOVALUE) -> [] | [#'Extension'{}].
% | ^
src/ssl_verify_fun_cert_helpers.erl:55:39: record 'Extension' undefined
% 55| -spec select_extension(Id :: term(), [#'Extension'{}]) -> undefined | #'Extension'{}.
% | ^
src/ssl_verify_fun_cert_helpers.erl:55:71: record 'Extension' undefined
% 55| -spec select_extension(Id :: term(), [#'Extension'{}]) -> undefined | #'Extension'{}.
% | ^
src/ssl_verify_fun_cert_helpers.erl:57:28: record 'Extension' undefined
% 57| Matching = [Extension || #'Extension'{extnID = ExtId} = Extension <- Extensions, ExtId =:= Id],
% | ^
src/ssl_verify_fun_cert_helpers.erl:57:84: variable 'ExtId' is unbound
% 57| Matching = [Extension || #'Extension'{extnID = ExtId} = Extension <- Extensions, ExtId =:= Id],
% | ^
src/ssl_verify_fun_cert_helpers.erl:75:15: record 'AttributeTypeAndValue' undefined
% 75| extract_cn2([[#'AttributeTypeAndValue'{type={2, 5, 4, 3},
% | ^
src/ssl_verify_fun_cert_helpers.erl:77:39: variable 'CN' is unbound
% 77| ssl_verify_fun_encodings:get_string(CN);
% | ^
src/ssl_verify_fun_cert_helpers.erl:49:1: Warning: function extensions_list/1 is unused
% 49| extensions_list(E) ->
% | ^
src/ssl_verify_fun_cert_helpers.erl:56:1: Warning: function select_extension/2 is unused
% 56| select_extension(Id, Extensions) ->
% | ^
src/ssl_verify_fun_cert_helpers.erl:64:1: Warning: function extract_dns_names_from_alt_names/2 is unused
% 64| extract_dns_names_from_alt_names([ExtValue | Rest], Acc) ->
% | ^
could not compile dependency :ssl_verify_fun, "mix compile" failed. You can recompile this dependency with "mix deps.compile ssl_verify_fun", update it with "mix deps.update ssl_verify_fun" or clean it with "mix deps.clean ssl_verify_fun"