IPConnection.HTTPSendAndReceive

From SunFlurry wiki
Revision as of 08:27, 24 April 2020 by Admin (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
  HTTPSendAndReceive (Работа с HTTP)
Объект:Объект IP
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Невозможно превратить в число, разрыв соединения, системная ошибка
Визуальность:Нет

Функция выполняет отправку подготовленного пакета (запроса или ответа на запрос), после чего при необходимости, может загрузить ответ удаленной стороны. Если ответ удаленной стороны не должен присутствовать (данный пакет был ответом), либо ответ не содержит поля Content-Length (к примеру, видео), необходимо вызвать функцию со значением аргумента, равным 0, либо использовать одну из функций HTTPReceive.

Синтаксис

IPConnection.HTTPSendAndReceive(<После отправки запроса, ждать и получить ответ (INT)>=1):<Удачное выполнение (INT)>

Аргументы

  • <После отправки запроса, ждать и получить ответ (INT)> - (необязательный аргумент) Аргумент задает режим получения ответного пакета после отправки. Если аргумент равен нулю, функция выполняет такие же действия, как и функция HTTPSend, отсылая подготовленный заголовок и тело HTTP пакета. В ином случае, выполняются последовательно две функции HTTPSend, затем HTTPReceive.

Возвращаемое значение

Возвращает 1, если операция выполнена успешно, иначе возвращает 0.

Примеры

//Пример показывает, как можно осуществить загрузку веб-страницы по ее адресу.
//Для загрузки по протоколу 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
      if bHTTPs Then
        tcp:=IPConnection.Connect(URL+?(Pos(":",URL)+Pos("=",URL)=0,"=443"),1);
      Else
        tcp:=IPConnection.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);