Как обнаружить де-прокси, используемый в пакете - PullRequest
8 голосов
/ 18 июня 2010

В FireFox подключение к Интернету осуществляется через файл автоматической настройки прокси-сервера "thing.pac "

Как узнать для определенного URL-адреса, какой прокси-сервер используется?

Спасибо.

Ответы [ 2 ]

7 голосов
/ 18 июня 2010

.pac файл - это просто ECMAscript - он же JavaScript.Проверьте статью в википедии о формате файла.

Если вы скопируете код PAC, вы можете обработать его, чтобы увидеть, какой прокси-сервер используется на основе целевого URL.Если вам нравится, вы можете поместить скрипт в веб-страницу (локально), чтобы создать инструмент для локальной оценки.

Редактировать:

В качестве альтернативы методу, который я начал рекомендовать,Вы можете проверить PACTester , доступный в Google Code.Это позволит вам быстро протестировать ряд параметров.

Если у вас есть доступный .Net и вы хотите поиграть с C #, тогда вы можете прочитать эту статью на MSDN , в которой есть кодможно использовать аналогично описанному выше.

Чтобы расширить исходный метод, описанный выше, существует ряд функций, которые могут (и обычно есть) обеспечиваться браузером хоста.Основная функция, которая должна быть реализована в файле pac: FindProxyForUrl().Это принимает два параметра: URL и хост (хост, полученный из имени URL).«Предоставляемые» функции включают в себя: isInNet(), localHostOrDomainIs(), isPlainHostName(), isResolvable() и т. Д.

Если вы работаете в среде Microsoft, вы можете проверить эту страницу наTechnet , который описывает формат .pac с некоторыми полезными примерами.

Согласно документации Microsoft для isInNet():

Функция isInNet(host, pattern, mask) возвращает TRUE, еслиIP-адрес хоста соответствует указанному pattern.mask указывает, какая часть IP-адреса должна совпадать (255 = совпадение, 0 = игнорирование).

Если вы хотите получить техническую информацию, вот исходный код Mozilla для реализации сервисов, связанных с автоматической настройкой прокси.Он определяет код JS для isInNet() как:

200 function isInNet(ipaddr, pattern, maskstr) {
201     var test = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/(ipaddr);
202     if (test == null) {
203         ipaddr = dnsResolve(ipaddr);
204         if (ipaddr == null)
205             return false;
206     } else if (test[1] > 255 || test[2] > 255 ||
207                test[3] > 255 || test[4] > 255) {
208         return false;    // not an IP address
209     }
210     var host = convert_addr(ipaddr);
211     var pat  = convert_addr(pattern);
212     var mask = convert_addr(maskstr);
213     return ((host & mask) == (pat & mask));
214     
215 }

Надеюсь, это поможет!

5 голосов
/ 11 мая 2011

Я создал простой прокси-сервер разрешения HTML-страниц:

<html>
<head>
    <script type="text/javascript">
    function myIpAddress() {
        return "192.168.1.2"; // Your IP
    }

    function isInNet(ipaddr, pattern, maskstr) {
        var test = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/(ipaddr);
        if (test == null) {
            ipaddr = dnsResolve(ipaddr);
            if (ipaddr == null) return false;
        } else if (test[1] > 255 || test[2] > 255 || test[3] > 255 || test[4] > 255) {
            return false;    // not an IP address
        }
        var host = convert_addr(ipaddr);
        var pat  = convert_addr(pattern);
        var mask = convert_addr(maskstr);
        return ((host & mask) == (pat & mask));
    }

    function dnsResolve(host) {
        try {
            return dns.resolve(host, 0).getNextAddrAsString();
        } catch (e) {
            return null;
        }
    }

    function convert_addr(ipchars) {
        var bytes = ipchars.split('.');
        var result = ((bytes[0] & 0xff) << 24) |
                     ((bytes[1] & 0xff) << 16) |
                     ((bytes[2] & 0xff) <<  8) |
                      (bytes[3] & 0xff);
        return result;
    }

    function isPlainHostName(host) {
        return host.search('\\\\.') == -1;
    }

    function shExpMatch(url, pattern) {
       pattern = pattern.replace(/\\./g, '\\\\.');
       pattern = pattern.replace(/\\*/g, '.*');
       pattern = pattern.replace(/\\?/g, '.');
       var newRe = new RegExp('^' + pattern + '$');
       return newRe.test(url);
    }

    function dnsDomainIs(host, domain) {
        return host.length >= domain.length && host.substring(host.length - domain.length) == domain;
    }
    </script>

    <!-- Your proxy script -->
    <script type="text/javascript" src="webproxy.js"></script>
</head>
<body>
    Host: <input id="host"/><br/>
    URL: <input id="url"/><br/>
    Proxy: <input id="proxy" disabled="disabled"/><br/>
    <input type="button" value="Resolve"
           onclick="document.getElementById('proxy').value = FindProxyForURL(document.getElementById('host').value, document.getElementById('url').value)"/><br/>
</body>
</html>

Код для myIpAddress и т. Д. Я получил из источников в Mozilla.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...