Сохранение промежуточного результата во временной переменной в lua openresty дает другой результат

Я столкнулся с чем-то очень странным и хотел бы понять, что происходит. По какой-то причине я получаю другой результат, если я устанавливаю временную переменную в lua для хранения промежуточного результата.

У меня есть следующий код:

local random = require("resty.random")
local token = ngx.encode_base64(random.bytes(32))

print("len(" .. string.len(token) .. ") " .. token) -- > len(43) OUOoBKfxLZDtE7yrHFzThF2e7dc6Wtjmzz3C6lQC67I

Он не возвращает допустимую строку base64. Символ = отсутствует, а строка состоит всего из 43 символов.

Но если я сделаю следующее, это сработает

local random = require("resty.random")
local bytes = random.bytes(32)
local token = ngx.encode_base64(bytes)

print("len(" .. string.len(token) .. ") " .. token) -- > len(44) 1E49IwlcsyfIBEwWBRXhTV2eFrc7QyYoFZ0kC1OsuTM=

Строка base64 действительна. Строка состоит из 44 символов со знаком = в конце.

Что может быть причиной этого. Мне очень странно, что результат между обоими кодами будет разным. Я подтвердил, что это так на openresty 1.15.8.2 как на mac os x, так и на ubuntu 16.04 lts.


person Thomas Wang    schedule 04.03.2020    source источник
comment
Вероятно, объект для сборки мусора, возвращаемый random.bytes(32), становится сборщиком мусора до того, как ngx.encode_base64() (функция, написанная на C) завершится.   -  person Egor Skriptunoff    schedule 04.03.2020
comment
Это может быть encode_base64 проблемой, так как вы генерируете случайную последовательность, и это зависит от ввода. Можете ли вы воспроизвести это с фиксированными данными?   -  person Darius    schedule 04.03.2020
comment
Попробуйте ngx.encode_base64((random.bytes(32))). Может быть, есть второе возвращаемое значение, а base64 создает безопасный URL-адрес b64   -  person moteus    schedule 04.03.2020


Ответы (1)


encode_base64 имеет второй аргумент, который включает режим без заполнения. Поэтому я думаю, что ваша случайная функция возвращает второе истинное значение. Я предлагаю просто попробовать назвать это как ngx.encode_base64((random.bytes(32))

person moteus    schedule 06.03.2020