Indy总是返回ResponseCode 200 - 即使登录失败也是如此

Joh*_*nny 1 delphi login indy10 delphi-xe

我正在使用Indy 10.5.7

我最近看到了如何使用Indy登录具有有效凭据的网站.现在我可以执行搜索并返回我需要的结果.

但是,我还是有问题.我必须理所当然地认为我已成功登录页面重定向,因为我无法获得200以外的响应代码.

我的意思是,我想处理用户输入用户名或密码输入错误的情况,并至少告诉他们有什么不对劲.

为了这个问题,我把Indy设置如下......

var
  client      : TidHTTP;
  cookieMan   : TidCookieManager;
  params      : TStringList;
  response    : string;

begin
  cookieMan := TidCookieManager.Create(nil);
  client := TidHTTP.Create(nil);
  params := TStringList.Create;

  try
    with client do
    begin
      ProtocolVersion     := pv1_1;
      HTTPOptions         := [hoForceEncodeParams, hoKeepOrigProtocol];
      AllowCookies        := True;
      cookieManager       := cookieMan;
      HandleRedirects     := True;
      //Request.UserAgent   := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0';
      //Request.UserAgent   := 'Mozilla/5.0 (Windows NT 6.3; WOW64)  AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.103 Safari/537.36';
      Request.UserAgent   := 'Mozilla/5.0 (X11; U; Linux i586; en-US; rv:1.7.3) Gecko/20040924 Epiphany/1.4.4 (Ubuntu)';
      //OnRedirect          := handleRedirect;
    end;

    params.Add('username=aFakeUser');
    params.Add('password=aFakePass');

    try
      response := client.Post('http://assurance.redtractor.org.uk/rtassurance/services.eb', params);
      mmoResponseCodes.Lines.Add('No exception, INDY OK ' + intToStr(client.ResponseCode));         // << ALWAYS returns 200
      // do nothing with params ...  just to try to raise any exception

      // I need to be logged in to reach the next page, this is a search page ...
      response := client.Post('http://assurance.redtractor.org.uk/rtassurance/services/cr_services/checking.eb', params);
      mmoResponseCodes.Lines.Add('Still no exception, INDY OK ' + intToStr(client.ResponseCode));   // << ALWAYS returns 200
      mmoResponse.Text := response;

    except
      on e: EIdHTTPProtocolException do
      begin
        // No exception raised, I expected e.ErrorCode = 401
        mmoResponseCodes.Lines.Add('Post Indy Error ' + intToStr(e.ErrorCode) + ' >>> ' + e.Message);
      end;
    end;

  finally
    client.Free;
    cookieMan.Free;
    params.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

我真的不知道我做错了什么.我已经看到Remy的很多帖子指出要捕获异常并查看e.ErrorCode,但我不能用我故意伪造的凭据引发异常.

我可以请你指出我正确的方向,并指出我做错了什么?

Rem*_*eau 6

您正在使用基于HTML的身份验证(发布的HTML Webform),而不是基于HTTP的身份验证(HTTP Authentication请求标头).

从HTTP的角度来看,HTML webform的失败身份验证仍然可以在HTTP层报告为成功的200回复​​.客户端请求了URL,服务器发送了一个HTML页面作为回复.无论HTML声明身份验证成功还是失败都无关紧要,HTTP只是一种传输,它并不关心正在传递的特定内容.仅在发生HTTP层错误时才会报告HTTP错误.如果HTML身份验证失败,则生成的HTML页面通常会再次包含错误消息和/或登录HTML webform.

因此,在这种情况下,您将获得HTTP 200回复​​,因为HTTP成功完成了它的工作.您将不得不分析返回的实际HTML以了解身份验证是否真的成功或失败.HTTP层没有任何指示方式.