Super
да, там же есть метка в 3 символа вначале утф иногда
Snusmumriken
т.е. я точно никогда не скажу, могу предположить получаетя только
Конечно. Бинарный файл может состоять из печатных символов. Тут только и исключительно предположения. У бинарей нет сигнатуры "привет, я - бинарь, не пытайтесь читать меня как текст". То есть, обычно есть, но вообще без гарантий.
Super
понял, спасибо, буду думать, как это реализовать
Snusmumriken
Автоматические определяляторы mime-типов или, например, кодировок - тоже работают с эвристикой и никогда не могут точно гарантировать результат. Даже по сигнатуре, можно задетектить не то что там есть (по счастливому стечению обстоятельств, у бессигнатурного файла создалась сигнатура чего-то левого).
Super
понял, спасибо, буду думать. возможно я выберу самые отвратительные символы и попробую именно их искать. в большом файле они обязательно встретятся почти всегда.
Super
те, которые вообще не видно визуально, типа переносов всяких хитрых
Maxim
понял, спасибо, буду думать. возможно я выберу самые отвратительные символы и попробую именно их искать. в большом файле они обязательно встретятся почти всегда.
тогда вам нужно будет сначала этот файл получить и сохранить где то у себя перед тем как определить тип и принять решение отправлять в браузер или отсеить )
Super
это легко, есть же body_filter_by_lua
Snusmumriken
те, которые вообще не видно визуально, типа переносов всяких хитрых
Если тебе присылают файлы или ты читаешь с диска - проще тупо посмотреть формат. Мультипарт как бонус.
Maxim
это легко, есть же body_filter_by_lua
есть, но файлов много и они большие, оно вам нада?
Super
потому что там может быть не указан тип, может быть левый указан
Super
так хватит первого чанка
Super
в теории сделать так - поставить переменную в nginx set $first_chunk "YES" и после первой проверки ее в "NO" переименовать - сработает только 1 раз
Super
а по поводу тайпа - я вот например делал такую штуку - если нет изображения jpg я просто с помощью луа выдавал там дефолтное изображение - и оно было в png - браузер выводил пнг
Maxim
потому что там может быть не указан тип, может быть левый указан
а в каком случае будет необходимо для вашего сервиса менять content_type? что произойдет если изменят, например?
Super
ну например content-type text/html а там здоровенный бинарник видео
Super
его точно не надо трогать
Super
прикол в том, что браузер его все равно проиграет
Super
но чаще он просто вообще не указан, application/octet-stream
Super
а так я вот этот класс нашел https://github.com/spacewander/lua-resty-mime-sniff
Super
спасибо за помощь, буду думать. может быть и вправду не стоит сильно заморачиваться, в большинстве случаев все же content-type соответствует реальности
Super
спасибо, гляну ее
mva
спасибо, гляну ее
она, если что, находится в пакете с утилитой file. Которая делает ровно то, что ты хочешь: по первым чанкам определяет контент-тайп. В т.ч. может и в виде mime-type'а
Super
да, это то что нужно
mva
mva  ~  cat /tmp/a.o | file -i -b - application/x-object; charset=binary mva  ~  cat /tmp/a.sh | file -i -b - text/plain; charset=us-ascii
mva
file, а ещё binwalk
libmagic-то в пакете с file лежит :)
Maxim
Наткнулся сейчас на интересный способ определения mime_type картинки
mva
а у binwalk в коробке только толпа питонятины // среди которой я, приглядевшись, нашёл сейчас и файлы, которыми пользуется libmagic для определения типов :)
Super
у меня еще вопрос, как мне в access_by_lua тотально завершить выполнение скрипта и больше ничего не делать?
Super
ngx.exit(200) не работает, после него все равно отрабатывет прокси пасс и боди фильтр
Maxim
ngx.exit(0) уже пробовали?
mva
у меня еще вопрос, как мне в access_by_lua тотально завершить выполнение скрипта и больше ничего не делать?
оно завершается и ничего не делает если ngx.exit(HTTP_FORBIDDEN). А если OK, то, что логично, продолжает обработку дальше (потому что длаьше могут быть более конкретные запреты).
Super
а как мне ее прекратить, есть способ?
Super
я хочу выдать контент из кеша и завершить работу, не хочу дальше обрабатывать
Super
при этом я хочу 200 выдать естественно
Super
ngx.say(page) ngx.exit(200)
Super
но проблема в том, что после этого оно выполняет дальнейшие директивы
mva
x>200
mva
это прямо в документации написано >_>
mva
хотя, нет, вру
mva
там написано >=200
mva
Тогда, возможно, баг
Super
ну вот проблема в том, что на этом скрипт не заканчивается
Super
выполняется proxy_pass
mva
покажи целиком локейшн
Super
ой, там на несколько страниц
Super
я кусок покажу, секунду
mva
ой, там на несколько страниц
нет, покажи весь. Можешь на pastebin/guthub's gist
Super
access_by_lua { ngx.say(page) ngx.exit(200) } proxy_pass $target; header_filter_by_lua_block { ... } body_filter_by_lua_block { ... }
Super
ну вот общая схема
Super
я хочу сделать следующее - в access_by_lua при моем желании остановить скрипт
Super
выдать нужный мне контент и не выполнять proxy_pass, не выполнять хедер фильтр и не выполнять боди фильтр
Super
хотя я кажется понял, в чем глюк
Super
вероятно body_filter и header_filter выполняются в любом случае, даже если я вывожу просто ngx.say в access
Super
я сейчас должен убегать, надо дочь к врачу вести, спасибо за помощь, чуть попозже сегодня проверю это
mva
собственно, судя по всему, да
mva
*filter'ы выполняются на другом уровне
Super
просто я думал ngx.exit(200) их тоже завершает
Super
а получается, что нет
mva
но ты можешь попробовать внутри access положить в ctx "не надо выполняться" и в фильтрах проверять это дело
Super
я как это увидел, я писал </html> = <!— FROM CACHE —></html> в фильтре и клал в кеш
Super
и оно нарастало - потом 2 надписи стало, потом 3
Super
так я понял, что оно продолжает выполняться
Super
в ообщем, протестирую как вернусь это
Pavel
К слову - можно как либо пробрасывать контекст между инструкциями? Я сейчас через флаги в хедерах делаю, но это неудобно
Super
через ngx.var.
Pavel
через ngx.var.
Оно в рамках каждого запроса живёт?
Super
в рамках одного запроса, но оно видно во всех фильтрах в аксес в хедер
Pavel
То что надо
Super
я проверил - ngx.var. решает вопрос, просто когда я выдаю страницу из кеша в аксесе, я пишу переменную from_cache = YES и если она в таком значении, то фильтры вхолостую прогоняю
Artem
привет всем, подскажите плиз хороший класс на луа, который детектит контент тайп по переменной content-type и по первому чанку
Могу дать написанный мною cdn сервис, который распознает тип по содержимому, но он на c++, от туда можно понять как и чем узнать тип файла
Super
привет, спасибо, было бы интересно глянуть
Super
написал тебе в личку