2010-03-08 2 views
2

Можно ли использовать HtmlUnit через прокси SOCKS? Может ли кто-нибудь указать образец кода?Как я могу использовать SOCKS с HtmlUnit?

====

Так я копался источников WebClient, вот лучший способ, которым я могу думать:

  1. Подкласс MultiThreadedHttpConnectionManager так, что позволяет устанавливать SOCKS информацию и, если это набор, перед возвратом соединения, устанавливает параметры SOCKS

  2. Подкласс WebConnection - переписать createHttpClient так, что он использует менеджер из шага 1 и добавить метод, чтобы получить, что менеджер прямо или HTTP Clien т в первом (это защищен сейчас - так плохо ...)

  3. Чтобы использовать 1) создать экземпляр WebClient 2) Создание подклассов WebConnection 3) Установить использовать его менеджером WebClient СОЕДИНЕНИЕ 4) Доступ и использовать его методы использовать носки

+0

Как вы в конечном итоге решили эту проблему, имея разные прокси-серверы для разных экземпляров веб-клиента? –

+0

@XCoder, мне не нужно было с htmlunit 2.8 вышел, и он настраивается с той версии – Fluffy

+0

yup! Я тоже нашел его, спасибо за быстрый ответ. –

ответ

0

HtmlUnit использует HttpClient в качестве базовой библиотеки подключений, я это исследовал немного, но:

1- Couldn't find a way to configure HttpClient (except by the generic Java Socks mechanism defined in http://java.sun.com/javase/6/docs/technotes/guides/net/proxies.html) 
2- Do not have access to a public Socks Proxy to test against 
+0

Работает в 2.8 из-за нового httpclient. Ты один из разработчиков, верно? Спасибо за вашу работу. – Fluffy

+0

Да, я одна из команды. 2.8 поддерживает SOCKS, даже на уровне запроса, наслаждайтесь :) –

2

Все, что вам нужно сделать устанавливается appropriate system properties перед созданием объекта WebClient. Например:

System.setProperty("socksProxyHost", "localhost"); // replace "localhost" with your proxy server 
System.setProperty("socksProxyPort", "9999"); // replace "9999" with your proxy port number 

WebClient client = new WebClient(); 

На данный момент, HttpClient (который используется HtmlUnit под одеялом) подберет настройки и использовать прокси-сервер SOCKS для всех сетевых коммуникаций.

ОБНОВЛЕНИЕ: Я прочитал ваш пересмотренный вопрос (и ваш комментарий), и я думаю, что вы на правильном пути. Проблема в том, что если вы реализуете шаг 1 с использованием вышеуказанных системных свойств, то ваш код не является потокобезопасным (поскольку эти системные свойства являются глобальными). Одним из решений является синхронизация на чем-то, но, конечно, это может привести к проблемам производительности (может быть, и не важно для вас).

Если вы действительно хотите контролировать это в основе каждого сокета, то я думаю, что вам нужно будет сделать что-то вроде следующего:

  1. Создание пользовательского ProtocolSocketFactory, которая передает java.net.Proxy объект в Socket конструктор (как в this example).
  2. Создать пользовательскую форму Protocol, которая использует это ProtocolSocketFactory.
  3. Примените это Protocol к новым подключениям в своем менеджере соединений, используя HttpConnection.setProtocol().

Я действительно не проверял это, но, основываясь на быстром взгляде на исходный код HttpClient 3.1, я думаю, что так оно и будет. Я хотел бы услышать, как вы в конечном итоге решаете эту проблему :-). Удачи!

+0

Таким образом, я буду устанавливать свойства SOCKS для всех экземпляров WebClient. Я хочу иметь возможность устанавливать разные прокси-серверы для разных экземпляров – Fluffy

Смежные вопросы