Difference between revisions of "IPConnection.UseProxy"

From SunFlurry wiki
Jump to: navigation, search
1>Admin
 
m (1 revision imported)
(No difference)

Revision as of 19:07, 20 November 2021

  UseProxy (Задает прокси сервер для соединения)
Объект:Объект IP
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Невозможно превратить в строку, неверные аргументы
Визуальность:Нет

Функция настраивает прокси сервер для использования с данным соединением. Функция должна быть вызвана до фактического соединения с удаленной стороной на неактивном объекте, затем этот объект может использоваться совместно с функцией Connect. Для получения неактивного объекта соединения необходимо использовать функцию Create. Прокси сервер может быть использован как для прямых, так и для шифрованных соединений. Причем, SOCKS прокси работает для любых передач, а WEB прокси только для работы с Web-запросами (функции группы HTTP).

Синтаксис

IPConnection.UseProxy(<Адрес и порт прокси сервера (STRING)>,<Тип прокси сервера (STRING)>,<Имя пользователя прокси (STRING)>,<Пароль пользователя прокси (STRING)>,<Дополнительные параметры прокси (STRING)>)

Аргументы

  • <Адрес и порт прокси сервера (STRING)> - Адрес прокси сервера задается в виде <Доменное имя сервера, адрес IPv4 или IPv6>[:<Номер порта>] (примеры: 127.0.0.1:8080, webproxy.orgname.local:200, <::1=8080). При указании IP адреса (xxx.xxx.xxx.xxx или xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx), можно использовать квадратные скобки [, ] для отделения IP адреса от номера порта. Номер порта можно указывать после знака : или знака =, для IPv6 адресов можно использовать только знак = или использовать квадратные скобки, как разделитель, так как : занят для указания элементов адреса (примеры: 127.0.0.1=8080, [::1]:2020). Если номер порта в адресе не задан, используется порт 8080. Доменное имя будет автоматически закодировано в формат Punycode.
  • <Тип прокси сервера (STRING)> - Указание на тип используемого прокси сервера. Возможны следующие значения:
    • SOCKS4 -- для данного типа прокси не может использоваться пароль (имя пользователя можно передать). Прокси сервер работает только с IPv4 и требует прямое указание на IP-адрес с которым будет происходить соединение. Если для идентификации удаленной стороны при соединении используется URL нотация, а не IP-адрес, система автоматически в момент соединения попытается ее превратить в IP и передать прокси. Если DNS-серверы в сети недоступны, соединение не будет выполнено.
    • SOCKS4A -- является дополнением к SOCKS4, позволяющим передавать на прокси сервер не только IP-адрес соединения, но и URL. В случае, когда в сети недоступны DNS-серверы, прокси-соединение будет продолжать работать корректно.
    • SOCKS5 -- является развитием SOCKS4, позволяющим задавать пароль и использовать IPv6.
    • HTTP или HTTPS -- равнозначные указания на Web-прокси (HTTP прокси может использоваться для нешифрованных соединений и наоборот), который может использоваться для доступа к Web-страницам. При указании этого типа сервера, пятый аргумент функции задает метод аутентификации (см. ниже).
  • <Имя пользователя прокси (STRING)> - (необязательный аргумент) Задает имя пользоваля прокси сервера.
  • <Пароль пользователя прокси (STRING)> - (необязательный аргумент) Задает имя пароль прокси сервера (не используется для серверов SOCKS4(A).
  • <Дополнительные параметры прокси (STRING)> - (необязательный аргумент) Задает дополнительные параметры в зависимости от типа прокси-сервера. Возможны следующие значения аргумента:
    • Для HTTP или HTTPS серверов параметр задает метод аутентификации и может принимать значения:
      • Basic -- (по умолчанию) простой метод аутентификации, передающий имя пользоваля и пароль в заголовке HTTP пакета.
      • Bearer -- (планируется к реализации) аутентификация с помощью особой строки (токена), полученного от прокси-сервера ранее и имеющего определенный срок жизни.
      • OAuth -- (планируется к реализации) аутентификация, не передающая в заголовке прямым текстом имя пользоваля и пароль, а только их хеш. Позволяет не опасаться, что пароль станет известен третьим лицам, если прокси сервер находится в Интернете.
      • SCRAM-SHA-1 или SCRAM-SHA-256 -- (планируется к реализации) методы аутентификации, позволяющие использовать хеши, ключи и шифрование.

Примеры

//Измененный пример из статьи Connect показывает, как можно осуществить загрузку веб-страницы по ее адресу посредством SOCKS5 прокси сервера.
//Для загрузки по протоколу https требуется указание пути к библиотекам OpenSSL или LibreSSL.

  Function LoadPage(URL)
    bHTTPs:=pos("https://",Lowercase(URL));
    If pos("//",URL)>0 Then
      tearStr(URL,"//");
    EndIf;
    СтрДоб:=URL;    
    URL:=tearStr(СтрДоб,"/");
    //URL может содержать название параграфа
    СтрДоб:=TearStr(СтрДоб,"#");
    For i:=1 to 3 Do
      //Создаем неактивное соединение
      tcp:=IPConnection.Create();
      //Задаем прокси сервер для текущего соединения
      tcp.UseProxy("192.168.1.1:8080","SOCKS5","User","test123");
      if bHTTPs Then
        tcp.Connect(URL+?(Pos(":",URL)+Pos("=",URL)=0,"=443"),1);
      Else
        tcp.Connect(URL+?(Pos(":",URL)+Pos("=",URL)=0,"=80"));
      EndIf;  
      if tcp.IsConnected Then
        Break;
      EndIf;
    EndDo;
    if not tcp.IsConnected Then
      Message("Could not connect: "+URL,"!");
      Exit;
    EndIf;
    СтрДоб:="/"+СтрДоб;
    if bHTTPs then
      //tcp.InitEncryption("LibreSSL","C:\LibreSSL255\libtls-15.dll");
      tcp.InitEncryption("OpenSSL","C:\OpenSSL111e\libssl-1_1.dll");
    endif;  
    tcp.HTTPSetOperation("GET "+СтрДоб+" HTTP/1.0");
    tcp.HTTPSetHeaderField("Host",tcp.HTTPPunycodeEncode(URL));
    tcp.HTTPSetHeaderField("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
    tcp.HTTPSetHeaderField("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    tcp.HTTPSetHeaderField("Accept-Language","en");
    tcp.HTTPSetHeaderField("Connection","Close");
    Стр:="";
    Try
      If tcp.HTTPSendAndReceive Then
        Стр:=tcp.HTTPBodyAsString;
        If _And(Pos(_NEWLINE,Стр)=0,Pos(Chr(10),Стр)>0) Then
          Стр:=Replace(Стр,Chr(10),_NEWLINE);
        EndIf;
      EndIf;
    Except
      Message("Could not load: "+URL,"!");
    EndTry;  
    Exit Стр;
  EndFunction

s:=LoadPage("https://en.wikipedia.org/wiki/Main_Page");
Message(s);