erlang elixir nif char* данные в двоичном коде не выполняются для запроса OCSP
Я пытаюсь создать OCSP-запрос к провайдеру с данными, возвращенными из nif. Я хочу сделать запрос следующим образом:
HTTPoison.post!(
oscp_info[:access],
:unicode.characters_to_binary(oscp_info[:data], utf8),
[{"Content-Type", "application/ocsp-request"}],
timeout: 1000
)
У меня есть блок кода в C, который формирует данные от C до Erlang:
static ERL_NIF_TERM CreateElixirBinary(ErlNifEnv *env, const char *str, int strLength)
{
ERL_NIF_TERM databytes = enif_make_list(env, 0);
for (int i=0; i < strLength; i++)
{
databytes = enif_make_list_cell(env, enif_make_uint(env, str[i]), databytes);
}
return databytes;
}
и сформировать карту пары ключей в C
enif_make_map_put(env, osp, enif_make_atom(env, "data"), CreateElixirBinary(env, baseValidationResult.certsCheckInfo[i].data, baseValidationResult.certsCheckInfo[i].dataLen), &osp);
У меня есть карта oscp_info
`oscp_info = %{
access: "http://acsk.any.provider.ua/services/ocsp/",
crl: "http://acsk.any.provider.ua/crl/PB-S9.crl",
data: [0, 113, 4294967247, 69, 0, 34, 4294967231, 4294967213, 0, 0, 0, 4,
4294967272, 4294967169, 4294967187, 4294967227, 4294967201, 4294967277,
4294967172, 13, 20, 2, 87, 85, 24, 93, 4294967256, 87, 17, 55, 4294967224, 1,
74, 4294967238, 4294967172, 4294967239, 4294967256, 4294967236, 63,
4294967173, 4294967186, 4294967212, 4294967208, 4294967184, 17, 4294967235,
4294967272, ...],
delta_crl: "http://acsk.any.provider.ua/crldelta/PB-Delta-S9.crl"
}`
Если я использую enif_make_int
вместо enif_make_uint
данные выглядят так:
data: [0, 113, -49, 69, 0, 34, -65, -83, 0, 0, 0, 4, -24, -127, -109, -69,
-95, -19, -124, 13, 20, 2, 87, 85, 24, 93, -40, 87, 17, 55, -72, 1, 74, -58,
-124, -57, -40, -60, 63, -123, -110, -84, -88, -112, 17, -61, -24, ...]
Проблема в том, что данные нельзя преобразовать ни в unicode, ни в двоичный код, поэтому я не могу сделать http-запрос. Как мне вернуть данные (char*) из nif, чтобы иметь возможность сделать запрос?
1 ответ
Правильный способ формирования двоичного файла erlang из c:
ErlNifBinary derDataBin;
enif_alloc_binary(baseValidationResult.certsCheckInfo[i].dataLen, &derDataBin);
memcpy(derDataBin.data, baseValidationResult.certsCheckInfo[i].data,
baseValidationResult.certsCheckInfo[i].dataLen);
ERL_NIF_TERM derData = enif_make_binary(env, &derDataBin);