HEX0x29A

InternetCheckUrl

Nov 5th, 2016
327
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //uses wininet;
  2. function InternetCheckUrl( AURL: WideString;
  3.                            AHTTPStatus: PDWORD = nil;
  4.                            AConnectTimeout: Cardinal = INFINITE;
  5.                            ARecieveTimeout: Cardinal = INFINITE;
  6.                            ASendTimeout: Cardinal = INFINITE ): Integer;
  7. const
  8.   C_CLIENT: WideString = 'checkurl';
  9.   C_HTTP_W : WideString = 'http';
  10.   C_ADD_W: WideString = '://';
  11. var
  12.   lSession,
  13.   lFile: hInternet;
  14.   lBuf,
  15.   lLen,
  16.   lIdx: DWORD;
  17. begin
  18.   if Pos( C_HTTP_W, WideLowerCase( AURL ) ) <> 1 then
  19.     AURL := C_HTTP_W + C_ADD_W + AURL;
  20.   Result := -1;
  21.   lSession := InternetOpenW( PWideChar(C_CLIENT), PRE_CONFIG_INTERNET_ACCESS, nil, nil, 0);
  22.   if not Assigned(lSession) then
  23.     Result := GetLastError
  24.   else
  25.   try
  26.     if InternetSetOption( lSession, INTERNET_OPTION_CONNECT_TIMEOUT, @AConnectTimeOut, SizeOf(Cardinal) ) and
  27.        InternetSetOption( lSession, INTERNET_OPTION_RECEIVE_TIMEOUT, @ARecieveTimeOut, SizeOf(Cardinal) ) and
  28.        InternetSetOption( lSession, INTERNET_OPTION_SEND_TIMEOUT, @ASendTimeout, SizeOf(Cardinal) ) then
  29.     begin
  30.       lFile :=InternetOpenURLW( lSession, PWideChar(AURL), nil, 0 , INTERNET_FLAG_RELOAD, 0);
  31.       if not Assigned( lFile ) then
  32.         Result := GetLastError
  33.       else
  34.       try
  35.         lIdx := 0;
  36.         lLen := SizeOf(lBuf);
  37.         if not Assigned( AHTTPStatus ) then
  38.           AHTTPStatus := @lBuf;
  39.         if not HttpQueryInfoW( lFile, HTTP_QUERY_STATUS_CODE or HTTP_QUERY_FLAG_NUMBER, AHTTPStatus, lLen, lIdx) then
  40.           Result := GetLastError
  41.         else
  42.         if (AHTTPStatus^ = 200 ) or (AHTTPStatus^ = 302 ) then
  43.           Result := 0 //если все ОК, то обнулим результат;
  44.       finally
  45.         InternetCloseHandle( lFile )
  46.       end;
  47.     end;
  48.   finally
  49.     InternetCloseHandle(lSession);
  50.   end;
  51. end;
  52. ///////////////////////////////////////////////////////////////////////
  53. //использование
  54. while InternetCheckUrl('http://www.***сайт',nil,3000,3000,3000)<>0 do begin
  55. LabelB2.Caption:='NO_CONNECT_URL';
  56. Application.ProcessMessages;
  57. if (FileExists(ExtractFilePath(ParamStr(0))+'OKSOUND.WAV')) and alarm then
  58. PlaySound(pchar(ExtractFilePath(ParamStr(0))+'OKSOUND.WAV'), 0, SND_ASYNC);
  59. Sleep(10000);
  60. end;
  61. ///////////////////////////////////////////////////////////////////////
  62. {
  63. Как пользоваться:
  64. AURL - соотв ссылка, которую проверяем.
  65. AHTTPStatus - HTTP статус запрошенной странички на сервере.
  66. AConnectTimeout,
  67. ARecieveTimeout,
  68. ASendTimeout - соответственно таймауты на подключение, чтение и посылку данных. по умолчанию - бесконечность.
  69. Result функции будут следующие:
  70. -1: запрос по адресу странички выдал HTTP Status Code <> 200 или 302. если был передан указатель на DWORD вторым параметром, то по его адресу можно прочитать собственно выданный сервером статус.
  71. 0: Все нормально, сервер существует и вернул HTTP Status Code равным 200 или 302.
  72. >0: ошибка произошла при вызове функций WinInet. результат работы GetLastError. для получения текстового представления (не для всех ошибок) можно вызвать SysErrorMessage для получения текста с сообщением об ошибке.
  73.  
  74. единственный косяк в функции, который сразу заметен, это разные типы Result'а функции и типа, возвращаемого GetLastError...
  75. з.ы. можно сделать и асинхронный вариант проверки...
  76. }
Add Comment
Please, Sign In to add comment