PAC-файл (Proxy Auto-Configuration) АнтиЗапрета не обновляется с 28 января, из-за слишком большого количества заблокированных доменов в Реестре запрещённых сайтов, которые не укладываются в лимит браузеров на основе Chrome.
Эта проблема не нова, но до недавнего времени с ней удавалось справляться фильтром нерабочих (и припаркованных) доменов, исключением мусорных зеркал вручную, простыми алгоритмами сжатия и оптимизации. Сейчас же доменов стало так много, что у меня не получается справится в этим эффективно и автоматизированно.
Поэтому принимаются любые предложения, идеи, реализации в виде кода, которые помогут уменьшить размер файла.
Задача заключается в реализации алгоритма сжатия (упаковки) доменов и IP-адресов, который бы уменьшил размер файла до приемлемого (<950 КиБ), а также алгоритмов исключения нерабочих, разделегированных и припаркованных доменов из списка, «мусорных» зеркал сайтов.
Сейчас реализовано:
- Исключение нерабочих доменов, которые возвращают NXDOMAIN/YXDOMAIN
- Исключение припаркованных доменов, если у них указан один из известных парковочных NS-серверов
- Сжатие доменов алгоритмом а-ля RLE, который не требует разжатия (запрашиваемый домен наоборот сжимается)
- Уплощение доменов до зоны (избавление от поддоменов, кроме определённых исключений)
- Не особо эффективный разностный алгоритм для паковки заблокированных IP-адресов
Что нужно учитывать:
- PAC это Javascript, но с особым API/Runtime. В нём нельзя выполнять HTTP-запросы (вроде fetch/XMLHttpRequest), но можно резолвить DNS. В нём нет доступа до DOM/document, нет HTML.
- Нет поддержки Unicode, содержимое парсится как однобитовая кодировка cp1252. Русскоязычные домены должны паковаться в punycode, бинарные данные — в base64/base85 сотоварищи.
- Скрипт исполняется целиком при инициализации контекста JS (на каждый поток/процесс), в это время можно однократно выполнить какую-то затратную по CPU/RAM операцию. Затем на каждый сетевой запрос вызывается функция FindProxyForURL, которая возвращает результат необходимости проксирования.
- Файл должен работать в очень старых браузерах, вроде Internet Explorer 9/10/11. Если установить ссылку на PAC-файл в старой версии Windows, все программы, использующие функции wininet для общения по сети, будут исполнять файл в системной версии IE. Если в файле используются слишком новые технологии, старые клиенты в случае ошибки начнут бесконтрольно запрашивать файл по сто раз в секунду.
- В браузерах есть (неустановленное и разное) ограничение на количество потребляемой оперативной памяти PAC-файлом, поэтому алгоритмы инициализации и сжатия должны укладываться во вменяемые размеры heap. Самый ограниченный в этом плане — Firefox 52 на Windows XP 32 bit, с лимитом в 4 МБ.
- Сжатие в идеале не должно требовать инициализации при запуске: лучше сжимать/преобразовывать запрашиваемый домен при каждом запросе, а не разжимать списки блокировок в память.
Более-менее детальную информацию о структуре и функциях PAC-файла можно найти на сайте http://findproxyforurl.com/, дополнительная информация:
- GitHub - anticensority/about-pac-scripts: What we know about PAC scripts
- about-pac-scripts/pac-script-api-chrome-55.md at master · anticensority/about-pac-scripts · GitHub
Исходный код генератора: Bitbucket (branch fixmeplz)
Скачивание листов и резолвинг отключён, запускайте doall.sh и проверяйте размер result/proxy-host-ssl.pac
.
Если хотите тестировать nxdomain-резолвер, запускайте только его: scripts/resolve-dns-nxdomain.py result/hostlist_zones.txt