SASGIS - SAS.Планета
View Issue Details
0000596SAS.Планета[All Projects] Хотелкаpublic15-04-2011 11:5410-10-2012 11:45
zed 
vdemidov 
normalfeaturehave not tried
closedfixed 
WindowsXPSP3
110418 
120808120808 
0000596: Возможность выполнять HTTP запросы из паскаль-скриптов
Чтобы можно было запрашивать дополнительные данные от сервера, для правильного формирования url и headers основного запроса.
http headers, скрипты
related to 0000366closed zed Возможность определять headers сокетов 
child of 0000984closed  PreloadPage= 
Issue History
15-04-2011 11:54zedNew Issue
15-04-2011 11:54zedStatusnew => assigned
15-04-2011 11:54zedAssigned To => zed
15-04-2011 11:55zedNote Added: 0001920
15-04-2011 11:56zedRelationship addedrelated to 0000366
15-04-2011 12:01vdemidovNote Added: 0001921
15-04-2011 12:03vdemidovTarget Version110418 => 24xxxx
15-04-2011 12:14zedNote Added: 0001922
15-04-2011 12:15zedNote Edited: 0001922bug_revision_view_page.php?bugnote_id=1922#r800
15-04-2011 12:22vdemidovNote Added: 0001923
15-04-2011 15:00gpsMaxTag Attached: http headers
15-04-2011 15:00gpsMaxTag Attached: скрипты
05-09-2011 18:50zOnNote Added: 0003702
26-09-2011 17:24zedRelationship addedchild of 0000984
24-10-2011 15:54zedStatusassigned => resolved
24-10-2011 15:54zedFixed in Version => 120808
24-10-2011 15:54zedResolutionopen => fixed
24-10-2011 15:58zedNote Added: 0004171
24-10-2011 16:00zedNote Edited: 0004171bug_revision_view_page.php?bugnote_id=4171#r2108
25-10-2011 06:00TolikNote Added: 0004172
25-10-2011 06:23vdemidovNote Added: 0004173
25-10-2011 17:56zedNote Added: 0004180
23-01-2012 08:29vdemidovTarget Version24xxxx => 120808
23-01-2012 10:50vdemidovProduct Version => 110418
20-06-2012 08:12zedNote Added: 0007545
20-06-2012 08:36vdemidovNote Added: 0007548
20-06-2012 11:14vdemidovNote Edited: 0007548bug_revision_view_page.php?bugnote_id=7548#r3695
20-06-2012 13:06zedAssigned Tozed =>
20-06-2012 13:06zedStatusresolved => confirmed
20-06-2012 13:06zedFixed in Version120808 =>
20-06-2012 13:08zedAssigned To => vdemidov
20-06-2012 13:08zedStatusconfirmed => resolved
20-06-2012 13:08zedFixed in Version => 120808
20-06-2012 17:23zedNote Added: 0007566
20-06-2012 17:32vdemidovNote Added: 0007568
20-06-2012 17:37zedNote Added: 0007569
20-06-2012 17:40vdemidovNote Added: 0007570
20-06-2012 17:45zedNote Added: 0007571
21-06-2012 17:14zedStatusresolved => assigned
22-06-2012 13:37vdemidovResolutionfixed => reopened
25-06-2012 11:49vdemidovNote Added: 0007640
25-06-2012 11:49vdemidovStatusassigned => resolved
25-06-2012 11:49vdemidovResolutionreopened => fixed
10-10-2012 11:45TolikStatusresolved => closed

Notes
(0001920)
zed   
15-04-2011 11:55   
Вот такая функция будет доступна в скрипте:
function DoRequest(const AHost, ADoc, ARequestHeader, APostData: AnsiString; UseSSL: Boolean; out AResponseHeader, AResponseData: AnsiString): Cardinal;

Она работает как с POST так и с обычными GET + введена опция UseSSL по которой устанавливается (либо нет) SSL соединение. Если нужен POST запрос, то заполняется переменная APostData, в противном случае (APostData = '') выполняется GET запрос.

Эта функция НЕ часть стандартной качалки, а сама в себе - абсолютно независимая. Основное назначение - получение дополнительных данных от сервера для формирования правильного запроса на тайл.

Результат функции - статус код ответа сервера.
(0001921)
vdemidov   
15-04-2011 12:01   
Только нужно заметить, что этот запрос будет подвешивать все обращения к скриптам этой карты.
(0001922)
zed   
15-04-2011 12:14   
(edited on: 15-04-2011 12:15)
Да, но это уже вопрос к архитектуре SAS - несколько потоков данной карты юзают один объект скрипта, когда по-хорошему надо бы использовать свой экземпляр на каждый поток. Поэтому, любой вызов скрипта подвешивает остальные запросы к этому скрипту. А http лишь частный случай, и упомянуто о нём в свете того, что запрос к серверу может занять несколько секунд (вплоть до тайм-аута) и соответственно притормозить (заставить ждать в очереди) остальные потоки. До этого в скриптах небыло столь время-затратных операций.

(0001923)
vdemidov   
15-04-2011 12:22   
Имено поэтому оно все так и устроено было, что затратных операций там не предвиделось.
(0003702)
zOn   
05-09-2011 18:50   
т.е. таким образом можно будет проверять версии и ключи?
странно, но хотелки с "автоматическим обновлением версий" я не нашел.
хотя многие об этом говорили на форумах. я только "за".
(0004171)
zed   
24-10-2011 15:58   
(edited on: 24-10-2011 16:00)
Можно пользоваться. Вот такой синтаксис:
function DoHttpRequest(const ARequestUrl, ARequestHeader, APostData: string; out AResponseHeader, AResponseData: string): Cardinal;

Да, и у каждого потока теперь свой экземпляр скрипта.

(0004172)
Tolik   
25-10-2011 06:00   
А можно пример? Как пользоваться?
(0004173)
vdemidov   
25-10-2011 06:23   
Лучше пока не пользоваться. Я собираюсь в ближайшее время синтаксис поменять. Вместо простой функции будет переменная с указателем на объект.
(0004180)
zed   
25-10-2011 17:56   
>А можно пример? Как пользоваться?

var
  url, head, head1, data, data1: string;
begin
  url := 'http(s)://example.com/index.html';
  head := 'User-Agent: SASPlanet';
  data := 'Some post data or empty string for GET request';
  if DoHttpRequest(url, head, data, head1, data1) = 200 then begin
    ...
  end;
end
(0007545)
zed   
20-06-2012 08:12   
Тоже сломано?
(0007548)
vdemidov   
20-06-2012 08:36   
(edited on: 20-06-2012 11:14)
Нет. Просто теперь вместо функции есть переменная Downloader типа ISimpleHttpDownloader, в которой может быть объект, который может делать http-запрос. И в zmp должна быть включена возможность запросов из скрипта:
IsUseDownloaderInScript=1

PS: Буду рад, если кто-то опишет это в Wiki

(0007566)
zed   
20-06-2012 17:23   
Не работает: Exception class Exception with message 'Error at script bytecode loading Cannot Import class:-'.

Делаю (в zmp прописал IsUseDownloaderInScript=1):

var
  VRequestUrl, VRequestHeader, VPostData: string;
  VResponseCode: Cardinal;
  VResponseHeader, VResponseData: string;
begin
  
  if (Downloader <> nil) then begin
    VRequestUrl := 'http://google.com/';
    VRequestHeader := '';
    VPostData := '';
    VResponseHeader := '';
    VResponseData := '';
    
    VResponseCode := Downloader.DoHttpRequest(VRequestUrl, VRequestHeader, VPostData, VResponseHeader, VResponseData);
  
    if VResponseCode = 200 then begin
      ScriptBuffer := VResponseData;
    end else begin
      ScriptBuffer := VResponseHeader;
    end;
  end;
end.

Если убрать проверку (Downloader <> nil), то падает с сообщением: Exception class EAccessViolation with message 'Access violation at address 00000001. Read of address 00000001'.
(0007568)
vdemidov   
20-06-2012 17:32   
Потому что проверять нужно используя Assigned()
(0007569)
zed   
20-06-2012 17:37   
Ну да, зато всё-равно падает при вызове качалки с EAccessViolation.
(0007570)
vdemidov   
20-06-2012 17:40   
Ну это значит что качалка не создалась. Нужно смотреть почему.
(0007571)
zed   
20-06-2012 17:45   
Создаётся. Но ты посмотри.
(0007640)
vdemidov   
25-06-2012 11:49   
Мда. Мелкая ошибка была.