On 01.09.2020 08:59, Alexey Galygin wrote:
nginx из официального докер образа 1.18.0
njs шла в комплекте и отдельно не ставилась — 0.4.2
вообще никак не вмешивались…

за альтернативу кода спасибо!
сейчас думаем, как бы аккуратно выпилить эти артефакты совсем


Спасибо за баг-репорт. Могу подтвердить что проблема в NJS и появилась в версии 0.4.2 (вероятно обновилась вместе деплоем нового образа?).

Удалось воспроизвести проблему самостоятельно. Она действительно оказалась связана с регулярными выражениями, а точнее с глобальным реплейсом replace(/_/g, "%5F"). При определенных условиях код мог уходить в endless-loop при этом поглощая всю доступную память. Исправленная версия приедет в 0.4.4.

Уточнее касательно исходных сниппетов:

function unescapeURI(r) { return r.uri.replace(/%20/g, ' '); }

r.uri уже возвращает unescaped версию URI, и replace(/%20/g, ' ') вернет исходный URI.
Как результат $uri $unescaped_uri должны быть идентичными.

On 1 Sep 2020, at 07:56, Dmitry Volyntsev <xei...@nginx.com> wrote:


On 01.09.2020 00:42, Alexey Galygin wrote:
но на всякий случай, может есть версия как-то это нативно переписать для 
конфига без всяких языков и модулей?
какие есть рекомендации? (совсем выкидывать всё же стрёмно…)
А подскажите свою версию njs (Если njs ставился из официальных пакетов, будет 
доступен бинарник njs, и тогда версию можно узнать так `njs -v`).

оказалось проблема в NJS части, какой-то баг там именно в связке 1.18.0 + 
Ubuntu 20.04
менялась ли версия njs при апгрейде? Если нет, единственное что пока приходит 
на ум это изменения в версии libpcre между дистрибутивами.

Как воркараунд можно попробовать переписать эти функции без использования 
глобальных регулярок (наиболее вероятное место проблемы).

function unescapeURI(r) {
         return r.uri.replace(/%20/g, " ");
}

->

1)
// идентична по поведению исходной функции
function unescapeURI(r) {
         return r.uri.split(/%20/).join(" ");
}

2)
// более стандартный метод, но заменит все %-encoded комбинации
https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/decodeURI
function unescapeURI(r) {
         return decodeURI(r.uri);
}


function escapeURI(r) {
         return r.uri.replace(/\s/g, "%20").replace(/_/g, "%5F");
}

->

1)
// идентична по поведению исходной функции
function escapeURI(r) {
         return r.uri.split(" ").join("%20").split("_").join("%5F");
}

2)
// более стандартный метод, но заменит все %-encoded комбинации
https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/encodeURI
function escapeURI(r) {
         return encodeURI(r.uri);
}

_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Ответить