/// <summary> /// Добавляет в цепочку новый прокси-клиент. /// </summary> /// <param name="proxy">Добавляемый прокси-клиент.</param> /// <exception cref="System.ArgumentNullException">Значение параметра <paramref name="proxy"/> равно <see langword="null"/>.</exception> public void AddProxy(ProxyClient proxy) { #region Проверка параметров if (proxy == null) { throw new ArgumentNullException("proxy"); } #endregion _proxies.Add(proxy); }
/// <summary> /// Преобразует строку в экземпляр класса <see cref="Socks5ProxyClient"/>. Возвращает значение, указывающее, успешно ли выполнено преобразование. /// </summary> /// <param name="proxyAddress">Строка вида - хост:порт:имя_пользователя:пароль. Три последних параметра являются необязательными.</param> /// <param name="result">Если преобразование выполнено успешно, то содержит экземпляр класса <see cref="Socks5ProxyClient"/>, иначе <see langword="null"/>.</param> /// <returns>Значение <see langword="true"/>, если параметр <paramref name="proxyAddress"/> преобразован успешно, иначе <see langword="false"/>.</returns> public static bool TryParse(string proxyAddress, out Socks5ProxyClient result) { ProxyClient proxy; if (ProxyClient.TryParse(ProxyType.Socks5, proxyAddress, out proxy)) { result = proxy as Socks5ProxyClient; return(true); } else { result = null; return(false); } }
/// <summary> /// Создаёт соединение с сервером через цепочку прокси-серверов. /// </summary> /// <param name="destinationHost">Хост сервера, с которым нужно связаться через прокси-сервер.</param> /// <param name="destinationPort">Порт сервера, с которым нужно связаться через прокси-сервер.</param> /// <param name="tcpClient">Соединение, через которое нужно работать, или значение <see langword="null"/>.</param> /// <returns>Соединение с сервером через цепочку прокси-серверов.</returns> /// <exception cref="System.InvalidOperationException"> /// Количество прокси-серверов равно 0. /// -или- /// Значение свойства <see cref="Host"/> равно <see langword="null"/> или имеет нулевую длину. /// -или- /// Значение свойства <see cref="Port"/> меньше 1 или больше 65535. /// -или- /// Значение свойства <see cref="Username"/> имеет длину более 255 символов. /// -или- /// Значение свойства <see cref="Password"/> имеет длину более 255 символов. /// </exception> /// <exception cref="System.ArgumentNullException">Значение параметра <paramref name="destinationHost"/> равно <see langword="null"/>.</exception> /// <exception cref="System.ArgumentException">Значение параметра <paramref name="destinationHost"/> является пустой строкой.</exception> /// <exception cref="System.ArgumentOutOfRangeException">Значение параметра <paramref name="destinationPort"/> меньше 1 или больше 65535.</exception> /// <exception cref="xNet.Net.ProxyException">Ошибка при работе с прокси-сервером.</exception> public override TcpClient CreateConnection(string destinationHost, int destinationPort, TcpClient tcpClient = null) { #region Проверка состояния if (_proxies.Count == 0) { throw new InvalidOperationException( Resources.InvalidOperationException_ChainProxyClient_NotProxies); } #endregion List <ProxyClient> proxies; if (EnableShuffle) { proxies = _proxies.ToList(); // Перемешиваем прокси. for (int i = 0; i < proxies.Count; i++) { int randI = Rand.Next(proxies.Count); ProxyClient proxy = proxies[i]; proxies[i] = proxies[randI]; proxies[randI] = proxy; } } else { proxies = _proxies; } int length = proxies.Count - 1; TcpClient curTcpClient = tcpClient; for (int i = 0; i < length; i++) { curTcpClient = proxies[i].CreateConnection( proxies[i + 1].Host, proxies[i + 1].Port, curTcpClient); } curTcpClient = proxies[length].CreateConnection( destinationHost, destinationPort, curTcpClient); return(curTcpClient); }
/// <summary> /// Преобразует строку в экземпляр класса <see cref="Socks5ProxyClient"/>. /// </summary> /// <param name="proxyAddress">Строка вида - хост:порт:имя_пользователя:пароль. Три последних параметра являются необязательными.</param> /// <returns>Экземпляр класса <see cref="Socks5ProxyClient"/>.</returns> /// <exception cref="System.ArgumentNullException">Значение параметра <paramref name="proxyAddress"/> равно <see langword="null"/>.</exception> /// <exception cref="System.ArgumentException">Значение параметра <paramref name="proxyAddress"/> является пустой строкой.</exception> /// <exception cref="System.FormatException">Формат порта является неправильным.</exception> public static Socks5ProxyClient Parse(string proxyAddress) { return(ProxyClient.Parse(ProxyType.Socks5, proxyAddress) as Socks5ProxyClient); }
/// <summary> /// Преобразуе?строку ?экземп??класса <see cref="HttpProxyClient"/>. /// </summary> /// <param name="proxyAddress">Строка вида - хост:порт:имя_пользовате?:пароль. Тр?последни?параметр?являют? необязательными.</param> /// <returns>Экземп??класса <see cref="HttpProxyClient"/>.</returns> /// <exception cref="System.ArgumentNullException">Значение параметр?<paramref name="proxyAddress"/> равн?<see langword="null"/>.</exception> /// <exception cref="System.ArgumentException">Значение параметр?<paramref name="proxyAddress"/> являет? пустой строко?</exception> /// <exception cref="System.FormatException">Формат порт?являет? неправильным.</exception> public static HttpProxyClient Parse(string proxyAddress) { return(ProxyClient.Parse(ProxyType.Http, proxyAddress) as HttpProxyClient); }
/// <summary> /// Отправляет GET-запрос HTTP-серверу. /// </summary> /// <param name="address">Адрес интернет-ресурса.</param> /// <param name="urlParams">Параметры URL-адреса, или значение <see langword="null"/>.</param> /// <param name="cookies">Кукисы, отправляемые HTTP-серверу, или значение <see langword="null"/>.</param> /// <param name="proxy">Прокси-клиент, используемый для запроса, или значение <see langword="null"/>.</param> /// <exception cref="System.ArgumentNullException">Значение параметра <paramref name="address"/> равно <see langword="null"/>.</exception> /// <exception cref="System.ArgumentException">Значение параметра <paramref name="address"/> является пустой строкой.</exception> /// <exception cref="xNet.Net.HttpException">Ошибка при работе с HTTP-протоколом.</exception> public static void Get(string address, RequestParams urlParams = null, CookieDictionary cookies = null, ProxyClient proxy = null) { using (var request = new HttpRequest()) { if (cookies == null) { request.Cookies = new CookieDictionary(); } else { request.Cookies = cookies; } request.Proxy = proxy; request.KeepAlive = false; request.UserAgent = HttpHelper.ChromeUserAgent(); request.Get(address, urlParams).None(); } }
/// <summary> /// Отправляет POST-запрос HTTP-серверу. Загружает тело сообщения и возвращает его в виде строки. /// </summary> /// <param name="address">Адрес интернет-ресурса.</param> /// <param name="content">Контент, отправляемый HTTP-серверу.</param> /// <param name="cookies">Кукисы, отправляемые HTTP-серверу, или значение <see langword="null"/>.</param> /// <param name="proxy">Прокси-клиент, используемый для запроса, или значение <see langword="null"/>.</param> /// <returns>Если тело сообщения отсутствует, то будет возвращена пустая строка.</returns> /// <exception cref="System.ArgumentNullException"> /// Значение параметра <paramref name="address"/> равно <see langword="null"/>. /// -или- /// Значение параметра <paramref name="content"/> равно <see langword="null"/>. /// </exception> /// <exception cref="xNet.Net.HttpException">Ошибка при работе с HTTP-протоколом.</exception> public static string Post(Uri address, HttpContent content, CookieDictionary cookies = null, ProxyClient proxy = null) { using (var request = new HttpRequest()) { if (cookies == null) { request.Cookies = new CookieDictionary(); } else { request.Cookies = cookies; } request.Proxy = proxy; request.KeepAlive = false; request.UserAgent = HttpHelper.ChromeUserAgent(); return(request.Post(address, content).ToString()); } }
/// <summary> /// Отправляет GET-запрос HTTP-серверу. Загружает тело сообщения и возвращает его в виде текста. /// </summary> /// <param name="address">Адрес интернет-ресурса.</param> /// <param name="urlParams">Параметры URL-адреса, или значение <see langword="null"/>.</param> /// <param name="cookies">Кукисы, отправляемые HTTP-серверу, или значение <see langword="null"/>.</param> /// <param name="proxy">Прокси-клиент, используемый для запроса, или значение <see langword="null"/>.</param> /// <returns>Если тело сообщения отсутствует, то будет возвращён пустой массив байтов.</returns> /// <exception cref="System.ArgumentNullException">Значение параметра <paramref name="address"/> равно <see langword="null"/>.</exception> /// <exception cref="xNet.Net.HttpException">Ошибка при работе с HTTP-протоколом.</exception> public static byte[] GetBytes(Uri address, RequestParams urlParams = null, CookieDictionary cookies = null, ProxyClient proxy = null) { using (var request = new HttpRequest()) { if (cookies == null) { request.Cookies = new CookieDictionary(); } else { request.Cookies = cookies; } request.Proxy = proxy; request.KeepAlive = false; request.UserAgent = HttpHelper.ChromeUserAgent(); return(request.Get(address, urlParams).ToBytes()); } }
/// <summary> /// Инициализирует новы?экземп??класса <see cref="xNet.Net.ProxyException"/> заданным сообщением об ошибке ?прокси-клиентом. /// </summary> /// <param name="message">Сообщени?об ошибке ?об?снение?причин?исключен?.</param> /// <param name="proxyClient">Прокси-клиент, ?которо?произошл?ошибка.</param> /// <param name="innerException">Исключение, вызвавше?текущи?исключение, ил?значение <see langword="null"/>.</param> public ProxyException(string message, ProxyClient proxyClient, Exception innerException = null) : base(message, innerException) { ProxyClient = proxyClient; }