Расширение представляет из себя организованный специальным образом скрипт на языке lua .
Для начала использования расширений в HandyCache необходимо чтобы в папке HandyCache находился файл библиотеки lua5.x.dll.
В начале расширения располагается заголовок. Заголовок имеет следующую структуру:
--[[ <HCEXTENSION> @field value @field value @field value ... @field value </HCEXTENSION> ]]
Имя (field) |
Значение (value) |
name | Наименование расширения |
author | Имя автора расширения |
version | Номер версии расширения |
min_HC_version | Номер версии HandyCache, начиная с которой возможно использование данного расширения. |
description | Краткое описание расширения |
rule | Правило (регулярное выражение), которым будет проверяться URL запроса перед вызовом расширения. В заголовке может быть несколько полей rule. |
exception | Исключение (регулярное выражение), которым будет проверяться URL запроса перед вызовом расширения. В заголовке может быть несколько полей exception. |
event | Наименование события, для обработки которого будет вызываться расширение, и через косую черту имя функции, предназначенной для обработки этого события. В заголовке может быть несколько полей event. |
--[[ <HCEXTENSION> @name Save or block 403 and 404 @author DenZzz @version 0.01 @min_HC_version 1.0.0.193 @description Сохраняет или блокирует ответы 403 и 404 @exception _rtsi?_|rts_chart_ru|informer\.rts\.ru/|aton-line\.ru/.*index\.gif @exception ^http://[^/]*rambler\.ru/|^http://192\.168\.\d+\. @event AnswerHeaderReceived/answer </HCEXTENSION> ]]
За заголовком следуют функции-обработчики событий, а также функции вызываемые из этих обработчиков. Когда в HandyCache наступает событие, для которого зарегистрирован обработчик, вызывается соответсвующая функция.
Событие |
Условия возникновения |
Init | Возникает при загрузке расширений во время старта HandyCache и при нажатии кнопки Перечитать расширение на вкладке Настройки/Расширения. При загрузке расширения текст файла расширения сохраняется в памяти. Поэтому, если файл расширения изменился, нужно выделить расширение в списке и нажать кнопку Перечитать расширение . |
Options | Возникает при нажатии кнопки Настройки расширения на вкладке Настройки/Расширения . |
Timer1s | Возникает раз в секунду. |
Timer1m | Возникает раз в минуту. |
URLToFileNameConverting | Возникает, когда требуется выполнить преобразование URL в имя файла в кэше. |
BeforeViewInMonitor | Возникает перед созданием новой строки в мониторе. |
RequestHeaderReceived | Возникает, когда получен заголовок запроса от клиента. |
BeforeRequestHeaderSend | Возникает, когда заголовок запроса готов к отправке на сервер. |
AnswerHeaderReceived | Возникает, когда получен заголовок ответа от сервера. |
BeforeAnswerHeaderSend | Возникает, когда заголовок ответа готов к отправке клиенту. Заголовок может быть получен от сервера или сформирован самим HandyCache. |
BeforeAnswerBodySend | Возникает, когда получена очередная порция данных для отправки клиенту. Данные могут быть получены от сервера или взяты из кэша. Если данные упакованы, то они перед передачей обработчику распаковываются. |
Destroy | Возникает при завершении работы расширения (при удалении расширения по кнопке Удалить расширение, при перезагрузке расширения по кнопке Перечитать расширение, при закрытии HandyCache) |
Перед вызовом функций расширения HandyCache создает в lua-машине две таблицы: hc и re. В первой собраны значения и функции, позволяющие получать информацию о значениях внутренних переменных HandyCache и изменять некоторые из них. Во второй собраны функции, позволяющие использовать в расширениях возможности библиотеки регулярных выражений PCRE .
Имя |
Допустимые действия | События |
Допустимые значения |
Описание |
ver | чтение | Init, Options, Timer1s, Timer1m, URLToFileNameConverting,
BeforeViewInMonitor, RequestHeaderReceived, BeforeRequestHeaderSend, AnswerHeaderReceived, BeforeAnswerHeaderSend, BeforeAnswerBodySend, Destroy |
"<строка>" | Строка, содержащая версию HandyCache, например, 'Version 1.00 RC3 (1.0.0.250)' |
version_number | чтение | Init, Options, Timer1s, Timer1m, URLToFileNameConverting,
BeforeViewInMonitor, RequestHeaderReceived, BeforeRequestHeaderSend, AnswerHeaderReceived, BeforeAnswerHeaderSend, BeforeAnswerBodySend, Destroy |
"<строка>" | Строка, содержащая номер версии HandyCache, например, '1.0.0.250' |
script_name | чтение |
Init, Options, Timer1s, Timer1m, URLToFileNameConverting, BeforeViewInMonitor, |
"<строка>" | Имя текущего расширения. |
event | чтение |
Init, Options, Timer1s, Timer1m, URLToFileNameConverting, BeforeViewInMonitor, |
"<строка>" | Содержит наименование обрабатываемого события. |
ini_path | чтение |
Init, Options, Timer1s, Timer1m, URLToFileNameConverting, BeforeViewInMonitor, |
"<строка>" | Содержит путь к папке с файлами настройки. |
cache_path | чтение |
Init, Options, Timer1s, Timer1m, URLToFileNameConverting,
BeforeViewInMonitor, |
"<строка>" | Содержит путь к папке кэша. |
listening_port | чтение |
Init, Options, Timer1s, Timer1m, URLToFileNameConverting,
BeforeViewInMonitor, |
"<строка>" | Содержит порт доступа к HandyCache |
client_connected | чтение | BeforeViewInMonitor, RequestHeaderReceived, BeforeRequestHeaderSend, AnswerHeaderReceived, BeforeAnswerHeaderSend, BeforeAnswerBodySend | true, false | Принимает значение true, если имеется соединение с клиентом, и - false , если соединение с клиентом разорвано |
url | чтение | URLToFileNameConverting, BeforeViewInMonitor, RequestHeaderReceived, BeforeRequestHeaderSend, AnswerHeaderReceived, BeforeAnswerHeaderSend, BeforeAnswerBodySend | В соответствие с RFC 2616 п.3.2.2 | URL запроса |
method | чтение | RequestHeaderReceived, BeforeRequestHeaderSend, AnswerHeaderReceived, BeforeAnswerHeaderSend, BeforeAnswerBodySend | В соответствие с RFC 2616 п.9 | Метод, использованный в запросе |
ignore_traffic | чтение, запись (только в обработчиках BeforeViewInMonitor, RequestHeaderReceived) | URLToFileNameConverting, BeforeViewInMonitor, RequestHeaderReceived, BeforeRequestHeaderSend, AnswerHeaderReceived, BeforeAnswerHeaderSend, BeforeAnswerBodySend | "<строка>" |
Добавив в эту строку определенные символы можно запретить учет определенного вида трафика для текущего запроса. Для запрета учета трафика, поступившего из интернета нужно добавить латинский символ "i" или кирилический "и" (строчный или заглавный). Для запрета учета трафика из кэша нужно добавить латинский символ "c" или кирилический "к". Для запрета учета отправленного трафика нужно добавить латинский символ "u" или кирилический "о". Например, для запрета учета всех видов трафика можно добавить в обработчик события строку hc.ignore_traffic='IкО' |
use_proxy | чтение, запись | RequestHeaderReceived, BeforeRequestHeaderSend | "<строка>" | Содержит параметры внешнего HTTP прокси-сервера, назначенного для текущего запроса. Пример: "192.186.55.2:8080" или "proxy.com:8081"; если этой переменной присвоено значение "direct", то запрос будет отправлен без использования прокси |
use_proxy_login | чтение, запись | RequestHeaderReceived, BeforeRequestHeaderSend | "<строка>" | Содержит логин доступа внешнего HTTP прокси-сервера, назначенного для текущего запроса (basic-авторизация). Пример: "user:password" |
use_bound_ip | чтение, запись | RequestHeaderReceived, BeforeRequestHeaderSend | "<строка>" | Содержит IP-адрес сетевого устройства, через которое будет отправлен запрос. Пример: "192.186.0.2" |
request_header | чтение, запись | BeforeViewInMonitor (только чтение), RequestHeaderReceived, BeforeRequestHeaderSend | В соответствие с RFC 2616 | Содержит заголовок запроса. Если расширение изменит значение этой переменной, измененный заголовок будет отправлен серверу. |
cache_file_name | чтение | RequestHeaderReceived, BeforeRequestHeaderSend, AnswerHeaderReceived | "<строка>" | Имя файла в кэше, соответсвующего текущему запросу. |
cache_file_size | чтение | RequestHeaderReceived, BeforeRequestHeaderSend, AnswerHeaderReceived | <число> | Размер файла в кэше (-1 если файла нет). |
cache_file_age | чтение | RequestHeaderReceived, BeforeRequestHeaderSend, AnswerHeaderReceived | <число> | Возраст файла в кэше в секундах. |
cache_file_content_type | чтение | RequestHeaderReceived, BeforeRequestHeaderSend, AnswerHeaderReceived | "<строка>" | Тип содержимого файла в кэше. |
user_name | чтение | URLToFileNameConverting, BeforeViewInMonitor, RequestHeaderReceived, BeforeRequestHeaderSend, AnswerHeaderReceived, BeforeAnswerHeaderSend, BeforeAnswerBodySend | "<строка>" | Имя пользователя, от которого поступил запрос. |
user_ip | чтение | URLToFileNameConverting, BeforeViewInMonitor, RequestHeaderReceived, BeforeRequestHeaderSend, AnswerHeaderReceived, BeforeAnswerHeaderSend, BeforeAnswerBodySend | "<строка>" | IP комрпьютера, с которого поступил запрос пользователя. |
user_from_internet | чтение | RequestHeaderReceived, BeforeRequestHeaderSend, AnswerHeaderReceived, BeforeAnswerHeaderSend, BeforeAnswerBodySend | <число> | Количество данных, полученных пользователем из интернета за текущие сутки. |
user_from_cache | чтение | RequestHeaderReceived, BeforeRequestHeaderSend, AnswerHeaderReceived, BeforeAnswerHeaderSend, BeforeAnswerBodySend | <число> | Количество данных, полученных пользователем из кэша за текущие сутки. |
user_to_internet | чтение | RequestHeaderReceived, BeforeRequestHeaderSend, AnswerHeaderReceived, BeforeAnswerHeaderSend, BeforeAnswerBodySend | <число> | Количество данных, отправленных пользователем за текущие сутки. |
answer_header | чтение, запись | RequestHeaderReceived, AnswerHeaderReceived, BeforeAnswerHeaderSend, BeforeAnswerBodySend | В соответствие с RFC 2616 | Заголовок ответа, полученный от сервера или сформированный расширением. Если этой переменной расширение присвоило новое значение, то клиенту будет передан измененный заголовок. |
answer_body | чтение, запись | RequestHeaderReceived, AnswerHeaderReceived, BeforeAnswerHeaderSend, BeforeAnswerBodySend | "<строка>", "file=<имя файла>", "file=URLToCache(<URL>)" |
При обработке событий RequestHeaderReceived, AnswerHeaderReceived,
BeforeAnswerHeaderSend содержит тело ответа, сформированное расширением. Если этой переменной присвоено значение, то клиенту будет передано содержимое этой переменной в качестве тела ответа. При обработке события BeforeAnswerBodySend через эту переменную расширение получает очередную порцию данных для обработки. В эту же переменную расширение записывает результат обработки. |
last_part | чтение | BeforeAnswerBodySend | true, false | Принимает значение true, когда расширение вызывается последний раз для обработки текущего запроса. |
action | чтение, запись | RequestHeaderReceived, BeforeRequestHeaderSend, AnswerHeaderReceived | Для RequestHeaderReceived: "stop", "dont_update", "only_from_cache", Для AnswerHeaderReceived: "stop", "dont_update", "save", "dont_save" |
Действие, которое должен выполнить НС:
|
extensions_on | чтение, запись | RequestHeaderReceived, BeforeRequestHeaderSend, AnswerHeaderReceived, BeforeAnswerHeaderSend, BeforeAnswerBodySend | true, false | Если присвоить этой переменной значение false, то для текущего запроса все последующие обработчики событий вызываться уже не будут. |
read_from_cache_on | чтение, запись | RequestHeaderReceived | true, false | Присвоение false запрещает чтение из кэша для текущего запроса. |
white_mask | чтение, запись | BeforeViewInMonitor, RequestHeaderReceived | "<строка>" | Маска Белого списка - в эту переменную можно добавить по одному символу для каждого из списков, если нужно, чтобы этот список не работал с данным запросом. Для обозначения списков можно использовать символы:
|
file_speed_limit | чтение, запись | RequestHeaderReceived, AnswerHeaderReceived | <число> | Если этой переменной присвоить значение больше 0, то это значение будет использоваться как лимит скорости (в байтах в секунду) для загрузки данного файла. |
user_speed_limit | чтение, запись | RequestHeaderReceived, AnswerHeaderReceived | <число> | Если этой переменной присвоить значение больше 0, то это значение будет использоваться как лимит скорости (в байтах в секунду) для данного пользователя до задания другого значения или перезапуска HandyCache. hc.user_speed_limit=0 снимает ограничения скорости для данного пользователя. |
dont_load_large_files_on | чтение |
Init, Options, Timer1s, Timer1m, BeforeViewInMonitor, |
true, false | Принимает текущее состояние опции Не загружать большие файлы. |
speed_limit_on | чтение |
Init, Options, Timer1s, Timer1m, BeforeViewInMonitor, |
true, false | Принимает текущее состояние опции Ограничить скорость загрузки. |
offline_on | чтение |
Init, Options, Timer1s, Timer1m, BeforeViewInMonitor, |
true, false | Принимает текущее состояние опции Автономный режим. |
monitor_index | чтение | BeforeViewInMonitor, RequestHeaderReceived, BeforeRequestHeaderSend, AnswerHeaderReceived, BeforeAnswerHeaderSend, BeforeAnswerBodySend |
<число> | Принимает значение номера строки в мониторе, соответствующей текущему запросу. |
hide_in_active_list | чтение, запись | BeforeViewInMonitor | true, false | Если этой переменной присвоено значение true, то строка в в списке активных запросов, соответсвующая текущему запросу будет спрятана. |
hide_in_monitor | чтение, запись | BeforeViewInMonitor | true, false | Если этой переменной присвоено значение true, то строка в мониторе, соответсвующая текущему запросу будет спрятана. |
monitor_text_color | чтение, запись | BeforeViewInMonitor | <число> | Задает цвет текста в строке монитора. Если уровни основных цветовых составляющих R, G и B, то цвет задается числом R+G*256+B*256*256. R, G и B могут принимать значения от 0 до 255. |
monitor_parent_url | чтение, запись (только в обработчике BeforeViewInMonitor) | BeforeViewInMonitor, RequestHeaderReceived, BeforeRequestHeaderSend, AnswerHeaderReceived, BeforeAnswerHeaderSend, BeforeAnswerBodySend | "<строка>" | Задает URL строки монитора, которая будет 'родительской' для строки текущего запроса. Если переменной значение не было присвоено, то при чтении этой переменной выдается значение поля Referer заголовка запроса. |
monitor_string | чтение, запись | URLToFileNameConverting, BeforeViewInMonitor, RequestHeaderReceived, BeforeRequestHeaderSend, AnswerHeaderReceived, BeforeAnswerHeaderSend, BeforeAnswerBodySend | "<строка>" | Содержит значение, присвоенное предыдущими расширениями при обработке текущего события. Расширение может присвоить свое значение этой переменной. Значение этой переменной будет выведено в колонке Правила в Мониторе в строке текущего запроса. |
Имя |
Описание |
shell_execute |
Функция является оберткой Windows API функции ShellExecute (аргумент Operation="Open"). Подробнее смотрите здесь. Аргументы функции: Возвращаемое значение: Возвращает строку 'OK' при успешном вызове функции. В случае ошибки, возвращает сообщение об ошибке. Пример использования: hc.shell_execute('notepad.exe', 'stat.txt', nil, 'SW_SHOW') |
play_sound |
Функция является оберткой Windows API функции PlaySound. Подробнее смотрите здесь. Аргументы функции: Возвращаемое значение: нет. Примеры использования: |
recode |
Функция выполняет преобразование одной кодировки строки в другую. Аргументы функции: Возвращаемое значение: строка в новой кодировке. Пример использования: local new_str= hc.recode(str, 20866, 1251) |
execute_cmd |
Функция выполняет команду (те же команды, что и для утилиты HCCmd). Аргументы функции: Список команд.
Возвращаемое значение: нет. Примеры использования: |
sleep |
Функция останавливает выполнение расширения на заданный интервал времени. Аргументы функции: Возращаемое значение: нет. Пример использования: hc.sleep(1000) |
put_msg |
Функция вызывает появление на экране информационного окошка с заданным сообщением. Аргументы функции: Возращаемое значение: нет. Пример использования: hc.put_msg(10, 'Очистка кэша запущена') |
put_to_log |
Функция помещает заданное сообщение в лог программы. Аргументы функции: Возращаемое значение: нет. Пример использования: hc.put_to_log('method='..hc.method) |
get_keyboard_state |
Функция получает список нажатых клавиш. Аргументы функции: нет. Возвращаемое значение: Строка со списком
нажатых клавиш. Пример использования: |
systime_to_str |
Функция преобразует системное время в строковое представление. Аргументы функции: Возвращаемое значение: Время в строковом представлении. Пример использования: s = hc.systime_to_str(os.time(), false) |
str_to_systime |
Функция преобразует строковое представление времени в числовое. Аргументы функции: Возращаемое значение: Время в числовом представлении (время в секундах, прошедшее после 0 часов 0 минут 1 января 1970 года). Пример использования: |
get_host_IP |
Функция получает IP-адрес для заданного имени сетевого узла. Аргументы функции: Возвращаемое значение: Первым значением возвращается IP-адрес в виде строки; если IP-адрес не найден, то первое значение равно nil; вторым значением функция возвращает строку - сообщение; в случае удачи сообщается был ли найден адрес в кэше; в случае неудачи - причина. Пример использования: ip,e=hc.get_host_IP('handycache.ru') |
enable_user |
Функция позволяет разрешить или запретить пользователю доступ к HandyCache. Аргументы
функции: Возвращаемое значение: true, если пользователю разрешен доступ, и - false, если доступ запрещен; Пример использования: hc.enable_user('Boss', true) |
get_users_stat |
Функция позволяет получить информацию о пользователях. Аргументы
функции: Возвращаемое значение: Таблица с информацией о пользователях; каждый элемент возвращаемой таблицы имеет следующие поля: 'from_internet', 'from_cache', 'to_internet', 'connections_number', 'speed_limit '; Пример использования: |
set_user_speed |
Функция позволяет задать ограничение скорости загрузки для пользователя. Аргументы
функции: Возвращаемое значение: лимит скорости загрузки пользователя; если скорость загрузки пользователя не ограничена, то возвращается ноль; если пользователь с именем name не найден, то возвращается nil ; Пример использования: hc.set_user_name('Boss', 0) |
prepare_path |
Функция создает каталоги в соответсвии с путем, заданным аргументом. Аргументы функции: Возвращаемое значение: Нет. Пример использования: hc.prepare_path('c:\program files\handycache\cache\example') |
repeat_options |
Функция задает опции, управляющие процессом получения данных от удаленного сервера. Аргументы функции: Возвращаемое значение: Нет. Пример использования: hc.repeat_options('connect', 30, 3) |
call_me_for |
Функция регистрирует функцию текущего расширения в качестве обработчика события для текущего запроса. Аргументы функции: Возвращаемое значение: Нет. Пример использования: hc.call_me_for('BeforeAnswerBodySend', 'body') |
client_disconnect |
Разрывает соединение с клиентом. Аргументы функции: Нет. Возвращаемое значение: Нет. Пример использования: hc.client_disconnect() |
server_disconnect |
Разрывает соединение с сервером. Аргументы функции: Нет. Возвращаемое значение: Нет. Пример использования: hc.server_disconnect() |
user_disconnect |
Функция разрывает все установленные на данный момент соединения заданного пользователя. Аргументы
функции: Возвращаемое значение: Нет. Пример использования: hc.user_disconnect('Иванов') |
prepare_url |
Функция выполняет преобразование заданного URL в имя файла в кэше без вызова обработчика события URLToFileNameConverting. Аргументы
функции: Возвращаемое значение: Имя файла в кэше, полученное из заданного URL с помощью встроенного алгоритма преобразования; Пример использования: local s= hc.prepare_url(hc.url) |
preform_cache_file_name |
Функция задает имя файла в кэше, которое может быть сформировано расширением в обработчике события URLToFileNameConverting. HandyCache, если потребуется, может изменить заданное имя файла для его адаптации к текущему состоянию кэша. Путь к файлу может быть задан абсолютным (начинается с имени диска) или относительным. Во втором случае в начало имени добавляется путь к папке кэша. Замечание. По умолчанию HandyCache не использует файлы вне папки кэша. Чтобы разрешить использование файлов вне папки кэша, нужно в файл HandyCache.ini в секции MainForm добавить строку ReadOnlyFromCachePath=False Аргументы функции: Возвращаемое значение: Нет. Пример использования: hc.preform_cache_file_name('site1.ru\example.jpg') |
get_cache_file_name |
Функция получает имя файла в кэше и его наличие для заданного URL. Аргументы функции: Возвращаемое значение: Первым значением возвращается имя файла; вторым - наличие файла в кэше (true/false ); Пример использования: s,e=hc.get_cache_file_name('http://handycache.ru/') |
delete_cache_file |
Функция удаляет файл в кэше, соответствующий заданному URL. Аргументы функции: Возвращаемое значение: Нет. Пример использования: hc.delete_cache_file('http://site.ru/example.gif') |
file_last_modified_time |
Функция получает время последнего изменения файла. Аргументы функции: Возвращаемое значение: время последнего изменения файла в числовом представлении. Пример
использования: |
update_url_info |
Функция удаляет информацию о заданном файле из RAM-кэша и очищает внутренние переменные HandyCache, хранящие информацию об этом файле. Если информация о файле понадобится, она будет добываться из дискового кэша заново. Аргументы
функции: Возвращаемое значение: Нет. Пример использования: hc.update_url_info('http://handycache.ru/') |
set_global |
Функция позволяет сохранить в памяти значение глобальной переменной. Сразу после завершения работы этой функции присвоенное значение будет доступно из других потоков. Аргументы функции: Возвращаемое значение: Нет. Пример использования: hc.set_global('MyVar', 'Value') |
get_global |
Функция позволяет получить значение глобальной переменной. Аргументы функции: Возвращаемое значение: Значение переменной name. Если переменной с заданным именем нет, то возвращается nil. Пример использования: |
set_global_table_item |
Функция позволяет сохранить в значение в глобальной таблице. Сразу после завершения работы этой функции присвоенное значение будет доступно из других потоков. Аргументы функции: Возвращаемое значение: Нет. Пример использования: hc.set_global_table_item('MyTable', 'Item1', 'Value') |
get_global_table_item |
Функция позволяет получить значение глобальной переменной. Аргументы функции: Возвращаемое значение: Значение элемента глобальной таблицы item_name. Если элемента глобальной таблицы с заданным именем нет, то возвращается nil. Пример использования: |
window_pos |
Функция получает положение и размер главного окна HandyCache. Аргументы функции: Нет. Возвращаемое значение: Первым значением возвращается горизонтальная координата верхнего левого угла окна; вторым - вертикальная координата верхнего левого угла окна; третьим - ширина окна; четвертым - высота окна; Пример использования: x,y,w,h=hc.window_pos() |
enable_extension |
Функция позволяет разрешать или запрещать работу расширения с заданным именем. Аргументы
функции: Возвращаемое значение: Текущее состояние разрешения работы расширения (true/false). Пример использования: hc.enable_extension('Cache cleaner', true) |
reload_extension |
Функция заставляет HandyCache перечитать файл расширения с заданным именем с последущим вызовом обработчика события Init. Аргументы
функции: Возвращаемое значение: Нет. Пример использования: hc.reload_extension('Cache cleaner') |
Для выполнения регулярных выражений в HandyCache и расширениях используется библиотека PCRE.
PCRE License
PCRE is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Copyright (c) 1997-2009 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Функции таблицы re для работы с регулярными выражениями
Имя |
Описание |
select_engine |
Расширения могут использовать до трех движков, исполняющих регулярные выражения. Эта функция позволяет выбрать для использования один из этих трех движков. Как правило, для выполнения своей работы расширению достаточно одного движка. Если не вызывать эту функцию, то по умолчанию будет использоваться первый движок. Однако, если, например, в callout-функции требуется выполнить регулярное выражение, то использовать для этой цели первый движок нельзя, это вызовет нарушение работы первого движка после выхода из callout-функции. Для использования в callout-функции нужно использовать другой движок. В callout-функции следует перед выполнением регулярных выражений включить другой движок, а потом вернуть расширение к использованию первого движка. Аргументы
функции: Возвращаемое значение: Нет. Пример использования: |
set_regex |
Задает регулярное выражение. Аргументы функции: Возвращаемое значение: Нет. Пример использования: re.set_regex([[(.*\.).*]]) |
set_subj |
Задает строку, над которой буде исполняться регулярное выражение. Аргументы функции: Возвращаемое значение: Нет. Пример использования: re.set_subj(hc.answer_header) |
set_callout |
Задает имя callout-функции. Аргументы функции: Возвращаемое значение: Нет. Пример использования: re.set_callout('callout_func') |
match |
Вызывает исполнение регулярного выражения. Аргументы функции: Возвращаемое значение: Если в результате исполнения регулярного выражения найдена хотя бы одна подстрока, то первым значением функция возвращает таблицу; в этой таблице для каждой найденной подстроки находится по паре значений: begin_pos и end_pos; эти значения задают соответственно позиции в subj-строке для начала и конца каждой найденной подстроки; если в результате исполнения регулярного выражения не найдено ни одной подстроки, то первому возвращаемому значению присваивается nil, а в качестве второго значения возвращается строка с описанием ошибки. Пример использования: |
substr_count |
Получает количество подстрок, найденных в результате последнего исполнения регулярного выражения. Аргументы функции: Нет. Возвращаемое значение: Количество найденных подстрок. Пример использования: local num= re.substr_count() |
substr |
Получает подстроку с заданным номером, найденную в результате последнего исполнения регулярного выражения. Аргументы функции: Возвращаемое значение: Возвращается подстрока; если подстроки с заданным номером нет, то возвращается nil ; Пример использования: local s=re.substr(0) |
substr_length |
Получает длину подстроки с заданным номером, найденной в результате последнего исполнения регулярного выражения. Аргументы функции: Возвращаемое значение: Возвращается длина подстроки; если подстроки с заданным номером нет, то возвращается -1; Пример использования: local l=re.substr_length(0) |
substr_offset |
Получает смещение позиции начала подстроки с заданным номером в subj-строке, найденной в результате последнего исполнения регулярного выражения. Аргументы функции: Возвращаемое значение: Возвращается смещение подстроки; если подстроки с заданным номером нет, то возвращается -1 ; Пример использования: local offset=re.substr_offset(0) |
named_substr_index |
Получает индекс именованной подстроки, найденной в результате последнего исполнения регулярного выражения. Аргументы функции: Возвращаемое значение: Возвращается индекс подстроки с заданным именем; если подстроки с заданным именем нет, то возвращается -1 ; Пример использования: |
offsets_vector_size |
Получает размер вектора (массива) результатов выполнения регулярного выражения. Аргументы функции: Нет. Возвращаемое значение: Возвращается размер массива результатов; Пример использования: local n=re.offsets_vector_size() |
offsets_vector |
Получает элемент вектора (массива) результатов выполнения регулярного выражения. Аргументы
функции: Возвращаемое значение: Возвращается элемент массива результатов, обычно это смещение от начала строки, с которой работает регулярное выражение; если элемента с заданным номером нет, то возвращается -1 ; Пример использования: local offset=re.offsets_vector(0) |
find |
Получает значение заданной подстроки. Аргументы функции: Возвращаемое значение: Если в результате исполнения регулярного выражения найдена подстрока с заданным номером, то первым значением функция возвращает эту подстроку; если не найдена заданная подстрока, то первому возвращаемому значению присваивается nil; если при исполнении регулярного выражения произошла ошибка, то в качестве второго значения возвращается строка с описанием ошибки. Пример использования: local s=re.find(hc.answer_header, [[^Content-Length: (.+)]], 1) |
replace |
Заменяет в строке найденные подстроки заданным значением. Аргументы функции: Возвращаемое значение: Если при исполнении регулярного выражения не было ошибок (даже если не найдено ни одной подстроки), то первым значением функция возвращает строку - результат обработки (в противном случае nil); вторым значением возвращается число произведенных замен; третьим значением функция возвращает позицию в результирующей строке, с которой начинается неизмененная часть; если в результате исполнения регулярного выражения произошла ошибка, то четвертым значением возвращается строка с описанием ошибки. Пример использования: s=re.replace(hc.answer_header, [[(?-s)(Cache-Control:.*\r\n)]], nil) |
Для исполнения обработчиков событий в каждом потоке-обработчике соединения с клиентом создается своя lua-машина. Глобальные переменные, создаваемые обработчиками в lua -машине доступны для всех обработчиков, которые будут вызваны позднее в этом потоке.
При загрузке каждого расширения в HandyCache создается пустая таблица hc_static, привязанная к этому расширению. Следом для каждого расширения вызывается обработчик Init (если таковой зарегистрирован). Он может сохранить значения в таблице hc_static и они будут доступны во всех обработчиках этого расширения при обработке всех последующих запросов. Также обработчик Options (вызывается нажатием кнопки Настройки расширения на вкладке Расширения ) может изменить значения в этой таблице (или добавить новые) и они будут доступны при обработке всех последующих запросов.
Когда создается поток-обработчик запроса клиента, в нем создается копия таблицы hc_static для каждого расширения и внутри потока работа идет уже с этой копией. Обработчики событий могут добавлять/изменять переменные, но доступны эти значения будут только внутри этого потока.
Обработчики событий при необходимости могут сохранять значения в глобальных переменных. Значения, сохраненные в глобальных переменных, с момента присвоения и до завершения работы программы становятся доступны из всех обработчиков всех потоков. Для доступа к глобальным переменным используются функции hc.set_global и hc.get_global.
Расширения HandyCache как и другие программы на lua могут использовать графический интерфейс пользователя. Вот несколько примеров предназначенных для таких целей библиотек: wxlua, LuaInterface, VCLua. Мне наиболее подходящей для расширений HandyCache показалась библиотека VCLua (сравнительно просто использовать, малый размер dll). Пример использования этой библиотеки в обработчике события Options можно найти в расширении eCacheCleaner (для использования этой библиотеки в папке HandyCache должен находиться файл vcl.dll).
В файле LuaTest.exe находится программа для тестирования работы расширений. Для тестирования расширения загрузите его в эту программу и нажмите кнопку Перечитать. В появившемся ниже списке обработчиков событий выберите интерисующий и нажмите кнопку Выполнить (F5) для вызова выделенной функции-обработчика. Чтобы выполнить функцию, отсутствующую в списке, впишите ее имя в поле ввода рядом с кнопкой Выполнить и нажмите эту кнопку.
Информацию о языке lua можно найти, например, здесь: