В HandyCache c помощью скриптов Lua можно обрабатывать заголовки запросов клиента и ответов сервера и выполнять следующие действия:
остановить загрузку файла;
отдать файл из кэша или сформировать свой произвольный ответ;
принудительно сохранять/не сохранять файл в кэш;
изменять заголовки запроса или ответа;
осуществлять управление скоростью закачки определенных типов файлов;
настроить ограничения трафика и скорости пользователей;
отключать проверку определенных списков в зависимости от пользователей или прочих условий;
и другое...
Чтобы опробовать работу скриптов, необходимо скачать архив hc_script.zip и распаковать его в папку НС.
Подробное описание см. ниже.
Для начала использования скриптов в HandyCache необходимо:
в папке HC должен находиться файл библиотеки lua5.x.dll (из архива hc_script.zip), файл-список luaR.lst (для обработки запросов клиента) и lua.lst (для обработки ответов удаленного сервера);
скрипты должны храниться в подкаталоге \lua (примеры скриптов можно найти в файлах _first_req.lua и first.lua или скачать рабочие скрипты с оф.форума );
в список Серверов-посредников необходимо добавить 2 строки (использовать команду Добавить из буфера):
В списке Серверов-посредников может быть несколько строк с файлами-списками для скриптов.
В файле lua.lst (luaR.lst) должны быть строки вида:
rule <script=lua\scriptname.lua>
здесь rule - правило, при выполнении которого будет работать скрипт из файла lua\scriptname.lua.
Правило может представлять из себя регулярное выражение (признак регулярного выражения - символ # в первой позиции строки), упрощенное правило (начинается с символа + и может содержать шаблоны * и ?) или просто строку символов. В последнем случае заданная строка ищется в URL запроса и если таковая найдена, то правило считается выполненным.
Если в первой позиции строки стоит символ !, то правило считается исключением. Если выполняется исключение, то все правила, расположенные ниже этого исключения, пропускаются до конца файла или строки <new_block>.
Если строка начинается с символа ; - это комментарий.
Пример файла-списка:
; Файл-список скриптов LUA для обработки заголовков ответов сервера
;------------------------------------------------------------------
!#_rtsi?_|rts_chart_ru|informer\.rts\.ru/|/graph/plot\.swf$|/graphs/micex_
!#^http://192\.168\.\d+\.
#. <script=lua\save_or_block_403_and_404.lua>
#. <script=lua\dont_update_image_by_type.lua>
#. <script=lua\dont_update_file_by_size.lua>
#. <script=lua\block_long_file.lua>
; Еще несколько строк для примера:
!otc-stock.rbc.ru/targets/graph.ser?
rbc.ru <script=lua\ex1.lua>
<new_block>
!+citforum.ru/?ab/*.html
+img?.narod.ru/*.gif <script=lua\ex2.lua>
Все скрипты, соответствующие сработавшим правилам, будут запущены НС в том порядке, в котором они расположены в файле-списке.
При выполнении скрипта HC всегда ищет и запускает функцию main. Скрипт может использовать предопределенные глобальные переменные.
Глобальные переменные скриптов:
Название
Место
Допустимые значения
Описание
hc_url
Запросы, Ответы
В соответствие с RFC 2616 п.3.2.2
URL запроса
hc_method
Запросы, Ответы
В соответствие с RFC 2616 п.9
Метод, использованный в запросе
hc_header
Запросы, Ответы
В соответствие с RFC 2616
Заголовок, передаваемый скрипту. Если скрипт изменяет этот заголовок, то он помещает результат в эту же переменную. В этом случае он должен присвоить переменной hc_header_replace значение true
hc_header_replace
Запросы, Ответы
true, false
Флаг изменения заголовка hc_header скриптом.
hc_cache_file_size
Запросы, Ответы
<число>
Размер файла в кэше (-1 если файла нет).
hc_cache_file_age
Запросы, Ответы
<число>
Возраст файла в кэше в секундах.
hc_cache_file_content_type
Запросы, Ответы
"<строка>"
Тип содержимого файла в кэше.
hc_user_name
Запросы, Ответы
"<строка>"
Имя пользователя, от которого поступил запрос.
hc_user_from_internet
Запросы, Ответы
<число>
Количество данных, полученных пользователем из интернета за текущие сутки.
hc_user_from_cache
Запросы, Ответы
<число>
Количество данных, полученных пользователем из кэша за текущие сутки.
hc_user_to_internet
Запросы, Ответы
<число>
Количество данных, отправленных пользователем за текущие сутки.
hc_answer_header
Запросы
В соответствие с RFC 2616
Заголовок ответа, сформированный скриптом. Если этой переменной присвоено значение, то клиенту будет передан этот заголовок.
Тело ответа, сформированное скриптом. Если переменной hc_answer_header (hc_header - для скриптов ответов) и этой переменной присвоены значения, то клиенту будет передано содержимое этой переменной в качестве тела ответа. Переменная hc_answer_body вместо непосредственно тела ответа может содержать также имя файла, который будет использован в качестве тела ответа ("file=c:\abc\qwerty.html"), или URL ("file=URLToCache(http://site.ru/abc.gif)"). В последнем случае в качестве тела ответа будет использован файл в кэше, соответствующий указанному URL.
hc_action
Запросы, Ответы
Для Запросов: "stop", "dont_update", "only_from_cache", Для Ответов: "stop", "dont_update", "save", "dont_save"
Действие, которое должен выполнить НС:
"stop" - заблокировать загрузку;
"dont_update" - не обновлять файл (отдать из кэша).
"only_from_cache" - если файл есть в кэше, то отдать его клиенту, иначе заблокировать загрузку.
"save" - записать файл в кэш;
"dont_save" - не записывать файл в кэш, даже если сработал список Запись в кэш.
hc_white_mask
Запросы
"<строка>"
Маска Белого списка - в эту переменную можно добавить по одному символу для каждого из списков, если нужно, чтобы этот список не работал с данным запросом. Для обозначения списков можно использовать символы:
W или Б - Белый список
B или Ч - Черный список
S или З - список Запись в кэш
D или Н - список Не обновлять
O или Т - список Только из кэша
R или А - список Переадресация
U или П - список Преобразование URL
Символы могут быть строчные или заглавные. Например, для выключения Черного списка, списка Только из кэша и списка Преобразование URL значение переменной может быть такое: hc_white_mask="ЧТu".
hc_file_speed_limit
Запросы, Ответы
<число>
Если этой переменной присвоить значение больше 0, то это значение будет использоваться как лимит скорости (в байтах в секунду) для загрузки данного файла.
hc_user_speed_limit
Запросы, Ответы
<число>
Если этой переменной присвоить значение больше 0, то это значение будет использоваться как лимит скорости (в байтах в секунду) для данного пользователя до задания другого значения или перезапуска HandyCache. hc_user_speed_limit=0 снимает ограничения скорости для данного пользователя.
Если запускается несколько скриптов подряд, то очередному скрипту передаются глобальные переменные в том виде, в каком они остались после выполнения предыдущего скрипта.
После выполнения последнего скрипта НС передает измененные заголовки, выполняет действие hc_action, применяет маску Белого списка hc_white_mask или ограничивает скорость закачки в соответствие с hc_file_speed_limit или hc_user_speed_limit.
В файле LuaTest.exe из архива hc_script.zip находится программа для тестирования работы скриптов.
Примеры скриптов можно найти в файлах _first_req.lua и first.lua или скачать рабочие скрипты с оф.форума.