olDjeka
Постоялец
Репутация: +6/-0
Offline
Сообщений: 117
|
|
« Ответ #460 : 16 января 2013, 23:11:22 » |
|
Это не хорошо. Заметил поскольку одни и те же запросы стали идти то через расширение, то мимо. Если ошибка влияет и на списки правил, то это совсем плохо.
|
|
|
|
|
Михаил
|
|
« Ответ #461 : 17 января 2013, 00:19:29 » |
|
Вы нашли ошибку PCRE. Я написал разработчикам. Для сохранения работоспособности в приведенном выше правиле используйте "\A" вместо "^": и оптимальней чуток, и ошибку обойдете.
|
|
|
|
|
olDjeka
Постоялец
Репутация: +6/-0
Offline
Сообщений: 117
|
|
« Ответ #462 : 17 января 2013, 00:29:32 » |
|
Заменять только второй символ или все? В правилах тоже лучше заменить?
|
|
|
|
|
Михаил
|
|
« Ответ #463 : 17 января 2013, 00:33:24 » |
|
Заменять только первый символ или все? Только первый. В правилах тоже лучше заменить? Я ж не знаю, о каких правилах речь.
|
|
|
|
|
olDjeka
Постоялец
Репутация: +6/-0
Offline
Сообщений: 117
|
|
« Ответ #464 : 17 января 2013, 00:39:12 » |
|
Например:
ЧС ^bs\.yandex\.ru/
Не обновлять ^[^?]+[?/]\w*\d{4,}(\.(aspx?|txt))?/?$ исключая ^gismeteo\.ru/(weather/)?g?m?towns\d?/|/20[01]\d/|^soft\.softodrom\.ru/ap/|^inosmi\.ru/translation/|pogoda
Переадресация ^[^?]*%(2[56f]|3[adf])
|
|
|
|
|
Михаил
|
|
« Ответ #465 : 17 января 2013, 00:48:53 » |
|
В правилах тоже лучше заменить? Строго говоря, да. Но эта строгость выигрыш дает малый, а удобочитаемость \A хуже, чем ^. Поэтому выбирайте, как Вам нравится.
|
|
|
|
|
olDjeka
Постоялец
Репутация: +6/-0
Offline
Сообщений: 117
|
|
« Ответ #466 : 17 января 2013, 01:04:38 » |
|
Михаил Спасибо Привёл правила в которых много попаданий, плюс ещё расширения надо посмотреть. Нравится, не нравиться здесь дело десятое.
|
|
|
|
|
Михаил
|
|
« Ответ #467 : 17 января 2013, 01:24:12 » |
|
Привёл правила в которых много попаданий Выгода от использования \A в правиле происходит только при НЕпопадании. При попадании скорость работы будет одинакова. Число НЕпопаданий гораздо больше количества попаданий, поэтому эта замена дает практически одинаковый эффект в любом правиле Черного списка (т.к. каждое из них бОльшую часть попыток НЕ срабатывает). Но на самом деле даже на глаз этой выгоды не увидите - очень уж она мала. Я столкнулся с реальными эффектами ускорения только при написании СМ, который регулярными выражениями лопатит гораздо большие объемы, чем списки НС.
|
|
|
|
|
olDjeka
Постоялец
Репутация: +6/-0
Offline
Сообщений: 117
|
|
« Ответ #468 : 17 января 2013, 01:58:42 » |
|
Полностью согласен, но многие ссылки состоят из двух url, типа http://сайт-1/тра-та-та (=`~!:?$&! и т.д.) http://сайт-2/тру-ту-ту Но самое главное, у меня несколько правил в списке "Преобразование URL" используют этот метасимвол, а это уже чревато проблемами.
|
|
|
|
|
Михаил
|
|
« Ответ #469 : 17 января 2013, 12:24:45 » |
|
olDjeka, авторы PCRE отписались, что нашли и исправили ошибку. Опыт показывает, что примерно в течение месяца исправление может быть внедрено в НС.
|
|
|
|
|
olDjeka
Постоялец
Репутация: +6/-0
Offline
Сообщений: 117
|
|
« Ответ #470 : 17 января 2013, 14:39:57 » |
|
Хорошая новость, ещё раз спасибо. Проверил у себя всё в тренажёре, только это правило работало неверно. Заменил, и теперь порядок. Но гложут сомнения (необоснованные, но гложут), PCRE наверно используется и для внутренних преобразований в самом HC. И осталось непонятно почему? то срабатывало, то нет. Вот начала отладочных логов, URL один и тот же, но в первом случае сработало, во втором нет. * Пользователь один и тот же, долго ловил когда сработает и начало почему то не захватило. 16.01.13 21:16:01,554 # 9 MappedPortExecute_begin
16.01.13 21:16:01,554 # 9 MappedPortExecuteDo_begin/476
16.01.13 21:16:01,564 # 9 <<< URL: http://addons.cdn.mozilla.net:443/media/img/app-icons/med/firefox.png *** IdConnectionIntercept1SendDo/476 SInd=2 ***
16.01.13 21:16:01,564 # 9: Connect to proxy from script: (127.0.0.1:8192) 16.01.13 21:17:23,242 # 10: Start connection from client
16.01.13 21:17:23,252 # 10: Connection from 127.1.1.1:2601 to HC Version 1.00 RC3 (1.0.0.409)
16.01.13 21:17:23,252 # 10: User name: local
16.01.13 21:17:23,262 # 10 MappedPortExecute_begin
16.01.13 21:17:23,272 # 10 MappedPortExecuteDo_begin/476
16.01.13 21:17:23,382 # 10 <<< URL: http://addons.cdn.mozilla.net:443/media/img/app-icons/med/firefox.png *** IdConnectionIntercept1SendDo/476 SInd=0 ***
16.01.13 21:17:23,392 # 10: DNS resolve addons.cdn.mozilla.net --> 23.61.212.61 (From cache) используйте "\A" вместо "^": и оптимальней чуток А чем оптимальней
|
|
|
|
|
Anymore
|
|
« Ответ #471 : 17 января 2013, 15:38:46 » |
|
А чем оптимальней Я бы спросил: откуда такие глубокие познания? LinkPlease!
|
|
|
|
|
Михаил
|
|
« Ответ #472 : 17 января 2013, 22:41:09 » |
|
F чем оптимальней? PCRE изучает строку (в нашем случае http://addons.cdn.mozilla.net:443/media/img/app-icons/med/firefox.png) слева направо, начиная с первого символа. Если заданному регулярному выражению соответствия нет, то таким же образом эта строка изучается, начиная со второго, третьего и т.д. до последнего символов. Если в начале стоит \A, это дает PCRE дполнительную информацию о том, что изучать строку нужно только с первого символа и все. Если в начале стоит ^, то строка штудируется по полной программе.
|
|
|
|
|
olDjeka
Постоялец
Репутация: +6/-0
Offline
Сообщений: 117
|
|
« Ответ #473 : 17 января 2013, 23:14:09 » |
|
Михаил Отсюда об этом не додумался. начало строки '^' и конец строки '$' действуют для каждой строки в многосторочной строке, то \A и \Z обозначают начало и конец всей многосторчной строки.
|
|
|
|
|
Михаил
|
|
« Ответ #474 : 18 января 2013, 00:49:39 » |
|
Чтобы увидеть разницу воочию можете подцепить такое тестовое расширение: --[[ <HCExtension> @name Test2 @event Options </HCExtension> ]]
function Options() local subj = [[http://addons.cdn.mozilla.net/media/img/app-icons/med/firefox.png]] local regex1 = [[^http://[^:]+:443]] local regex2 = [[\Ahttp://[^:]+:443]] local count = 1 re.set_subj(subj:rep(1000000)) local function timer(regex) re.set_regex(regex) local clck = - os.clock() for _=1,count do re.find() end return clck + os.clock() end hc.put_msg(string.format('regex1 execution time = %g\r\nregex2 execution time = %g', timer(regex1), timer(regex2))) end При вызове настроек расширения всплывет окно с информацией о времени выполнения регулярных выражений, заданных в переменных regex1 и regex2. Для получения приемлемых глазу цифр времени (а не наносекунд) исходный УРЛ http://addons.cdn.mozilla.net/media/img/app-icons/med/firefox.png увеличивается в 1000000 раз. Этим расширением если есть желание можете сравнивать эффективность разных вариантов своих регулярных выражений, подставляя соответствующие значения в переменные subj, regex1 и regex2.
|
|
|
|
|
olDjeka
Постоялец
Репутация: +6/-0
Offline
Сообщений: 117
|
|
« Ответ #475 : 22 января 2013, 17:00:39 » |
|
При обработке события BeforeAnswerBodySend, чтение заголовка запроса (request_header) выдаёт пустую строку. Можно ли как-то получить заголовок запроса при обработке события BeforeAnswerBodySend?
|
|
|
|
|
olDjeka
Постоялец
Репутация: +6/-0
Offline
Сообщений: 117
|
|
« Ответ #476 : 22 января 2013, 20:03:17 » |
|
выдаёт пустую строку следует читать как "выдаёт соответствующее ошибке сообщение". Но сути вопроса это не меняет.
|
|
|
|
|
mai62
|
|
« Ответ #477 : 22 января 2013, 20:27:28 » |
|
Что за сообщение о соответствующей ошибке? Какие переменные в каких обработчиках можно использовать читайте в файле HCExtensions.html
|
|
|
|
|
olDjeka
Постоялец
Репутация: +6/-0
Offline
Сообщений: 117
|
|
« Ответ #478 : 22 января 2013, 20:39:30 » |
|
Как получить заголовок запроса при обработке события BeforeAnswerBodySend, если в обработчике BeforeAnswerBodySend нельзя использовать переменную request_header?
|
|
|
|
|
olDjeka
Постоялец
Репутация: +6/-0
Offline
Сообщений: 117
|
|
« Ответ #479 : 23 января 2013, 04:26:36 » |
|
Пока проверял - ошибся, и напутал в предидущих постах
Эксперементируя с расширениями заметил что request_header работает и для BeforeAnswerBodySend. В HCExtensions.html такой "пары" нет, поэтому хотел выяснить - можно её использовать или нет (возможны проблемы)? --[[ <HCExtension> @name ### Temp ### @event BeforeAnswerBodySend </HCExtension> ]]
function BeforeAnswerBodySend() x=hc.request_header hc.put_to_log('R-Header '..x) end
|
|
|
|
|
|