Почему этот код для проверки прокси валидности падает? - PullRequest
0 голосов
/ 18 января 2010

У меня есть следующий код в моей программе. Когда я пытаюсь проверить, является ли прокси действительным прокси или нет, это приводит к сбою моей программы. Любые идеи, как это исправить? Я пользуюсь инди 10.

if checkproxy('http://www.google.com') label1.text:='Good' else label1.text:='bad';

Если я пытаюсь вызвать другое соединение idHTTP после запроса checkproxy, происходит сбой программы.

Это фактический код ...., который возвращает ошибку ...


function TregForm.webSession(sURL : ansistring) : ansistring;
  var  sstream : Tstringstream;
       httpcon : TIdHTTP;
       antifreeze : TIdAntiFreeze;
begin
  result := '';
  sstream := tstringstream.Create('');
  try
    if length(SettingsForm.edtProxyServer.text) >= 7 then  // 0.0.0.0 
    if checkproxy('<a href="http://www.google.com" rel="nofollow noreferrer">http://www.google.com</a>') then
    begin
      antifreeze := TIdAntiFreeze.Create(nil);
      httpcon := TIdHTTP.create;
      httpcon.ProxyParams.BasicAuthentication:=true;
      httpcon.ProxyParams.ProxyPassword:=SettingsForm.edtProxyPass.Text;
      httpcon.ProxyParams.ProxyPort:=strtoint(SettingsForm.edtProxyPort.Text);
      httpcon.ProxyParams.ProxyServer:=SettingsForm.edtProxyServer.Text;
      httpcon.ProxyParams.ProxyUsername:=SettingsForm.edtProxyUserName.Text;
    end
    else
    begin
      showmessage('Proxy Server Not Working..  Attempting to bypass the Proxy');
      antifreeze := TIdAntiFreeze.Create(nil);
      httpcon := TIdHTTP.create;
      //httpcon.Request.ProxyConnection:='';
      //httpcon.ProxyParams.BasicAuthentication:=false;
      //httpcon.ProxyParams.ProxyPassword:='';
      //httpcon.ProxyParams.ProxyPort:=0;
      //httpcon.ProxyParams.ProxyServer:='';
      //httpcon.ProxyParams.ProxyUsername:='';
    end;
    httpcon.HandleRedirects := true;
    antifreeze.Active := true;
    HttpCon.Get(sURL,sstream);
    result := utf8towidestring(sstream.DataString);
  except
    httpcon.Disconnect;
  end;
  antifreeze.Active := false;
  freeandnil(httpcon);
  freeandnil(antifreeze);
  freeandnil(sstream);
end;</p>

<p>function TregForm.checkproxy(sURL : ansistring) : boolean;
  var  //sstream : Tstringstream;
       httpcon : TIdHTTP;
       antifreeze : TIdAntiFreeze;
begin
  result := true;
  try
    antifreeze := TIdAntiFreeze.Create(nil);
    httpcon := TIdHTTP.create;
    //sstream := tstringstream.Create('');
      httpcon.ProxyParams.BasicAuthentication:=true;
      httpcon.ProxyParams.ProxyPassword:=SettingsForm.edtProxyPass.Text;
      httpcon.ProxyParams.ProxyPort:=strtoint(SettingsForm.edtProxyPort.Text);
      httpcon.ProxyParams.ProxyServer:=SettingsForm.edtProxyServer.Text;
      httpcon.ProxyParams.ProxyUsername:=SettingsForm.edtProxyUserName.Text;</p>

<pre><code>httpcon.HandleRedirects := true;
antifreeze.Active := true;
HttpCon.Request.ProxyConnection:=SettingsForm.edtProxyServer.Text;
HttpCon.head(sURL);
httpCon.Disconnect;

за исключением на E: EIdException действительно начинаются Результат: = FALSE; конец; На E: исключение начинаются // showmessage ('Внешняя ошибка:' + # 13 # 10 + E.Message); showmessage («Ошибка настроек прокси»); Результат: = FALSE; конец; конец; антифриз. Актив: = ложь; FreeAndNil (httpcon); FreeAndNil (антифриз); // FreeAndNil (sstream); конец;

Сообщение об ошибке: исключение AccessViolation в модуле key.exe на E001B844A. Нарушение прав доступа по адресу 005B844A в модуле «key.exe». Чтение адреса 00000000.

1 Ответ

4 голосов
/ 18 января 2010

В приведенном выше коде, если «SettingsForm.edtProxyServer.text» меньше 7 символов, у вас будет ситуация, когда вы используете AntiFreeze и HttpCon без их предварительного создания.

Я немного поэкспериментировал с вашим кодом и протестировал его на моем WinXP SP3 (D2010, Indy v10.5.5). Это должен быть рабочий код ...

procedure TForm1.Button1Click(Sender: TObject);
Var
   Resp : String;
begin
     Resp := webSession('http://www.celarius.com');
     if Length(Resp)>0 then
        MessageDlg('Got the body ok',mtInformation,[mbOk],0);
end;

function TForm1.webSession(sURL : ansistring) : ansistring;
var
   SStream    : Tstringstream;
   HTTPCon    : TIdHTTP;
   AntiFreeze : TIdAntiFreeze;
begin
     Result := '';
     if Length(SettingsForm.edtProxyServer.text) >= 7 then  // 0.0.0.0
     Try
        SStream := NIL;
        AntiFreeze := NIL;
        HTTPCon := NIL;
        Try
           SStream := tstringstream.Create('');
           { Create & Set IdHTTP properties }
           HTTPCon := TIdHTTP.create;
           HTTPCon.HandleRedirects := true;
           { Check Proxy }
           if checkproxy('http://www.google.com') then
           Begin
                HTTPCon.ProxyParams.ProxyServer := SettingsForm.edtProxyServer.text;
                HTTPCon.ProxyParams.ProxyPort := StrToInt(SettingsForm.edtProxyPort.Text);
                HTTPCon.ProxyParams.BasicAuthentication := True;
                HTTPCon.ProxyParams.ProxyUsername := SettingsForm.edtProxyServer.Text;
                HTTPCon.ProxyParams.ProxyPassword := SettingsForm.edtProxyUserName.Text;
           End;
           { Create another AntiFreeze - only 1/app }
           AntiFreeze := TIdAntiFreeze.Create(nil);
           AntiFreeze.Active := true;
           HTTPCon.Get(sURL,SStream);
           Result := UTF8ToWideString(SStream.DataString);
        Finally
           If Assigned(HTTPCon) then FreeAndNil(HTTPCon);
           If Assigned(AntiFreeze) then FreeAndNil(AntiFreeze);
           If Assigned(SStream) then FreeAndNil(SStream);
        End;
     Except
        { Handle exceptions }
        On E:Exception do
           MessageDlg('Exception: '+E.Message,mtError, [mbOK], 0);
     End;
end;

function TForm1.checkproxy(sURL : ansistring) : boolean;
var
   HTTPCon : TIdHTTP;
   AntiFreeze : TIdAntiFreeze;
begin
     Result := False;
     Try
        { Inti vars }
        AntiFreeze := NIL;
        HTTPCon := NIL;
        Try
           { AntiFreeze }
           AntiFreeze := TIdAntiFreeze.Create(NIL);
           AntiFreeze.Active := true;
           { Create & Set IdHTTP properties }
           HTTPCon := TIdHTTP.Create(NIL);
           HTTPCon.ProxyParams.ProxyServer := SettingsForm.edtProxyServer.text;
           HTTPCon.ProxyParams.ProxyPort := StrToInt(SettingsForm.edtProxyPort.Text);
           HTTPCon.ProxyParams.BasicAuthentication := True;
           HTTPCon.ProxyParams.ProxyUsername := SettingsForm.edtProxyServer.Text;
           HTTPCon.ProxyParams.ProxyPassword := SettingsForm.edtProxyUserName.Text;
           HTTPCon.HandleRedirects := true;
           HTTPCon.ConnectTimeout := 1000;
           HTTPCon.Request.Connection := 'close';
           HTTPCon.Head(sURL);
        Finally
           { Cleanup }
           if Assigned(HTTPCon) then
           Begin
                { Return Success/Failure }
                Result := HTTPCon.ResponseCode = 200;
                If HTTPCon.Connected then HTTPCon.Disconnect;
                FreeAndNil(HTTPCon);
           End;
           if Assigned(AntiFreeze) then FreeAndNil(AntiFreeze);
        End;
     Except
        On E:EIdException do ;
        { Handle exceptions }
        On E:Exception do
           MessageDlg('Exception: '+E.Message,mtError, [mbOK], 0);
     End;
end;
...