2016-02-15 10 views
1

Я использую Indy 10.5.7Indy всегда возвращает ResponseCode 200 - даже для неисправного входа

Я недавно было показано, как использовать Indy для входа на веб-сайт с действительными учетными данными. Теперь я могу выполнять поиск и возвращать результаты, которые мне нужны.

Однако у меня все еще есть проблема. Я должен считать само собой разумеющимся, что я успешно зарегистрирован на основе перенаправления страницы, поскольку мне не удается получить код ответа, отличный от 200.

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

Ради этого вопроса, я поставил Инди следующим образом ...

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; 

Я действительно не знаю, что я делаю неправильно. Я видел много сообщений от Remy, указывающих на то, чтобы перехватывать исключения и смотреть на e.ErrorCode, но я просто не могу создать исключение с моими намеренно поддельными учетными данными.

Могу ли я попросить вас указать мне в правильном направлении, пожалуйста, и указать, что я сделал неправильно?

ответ

6

Вы используете HTML проверки подлинности на основе (отправленное HTML WebForm), не HTTP-аутентификация на основе (заголовок запроса HTTP Authentication).

С точки зрения HTTP неудавшаяся аутентификация HTML-формы все равно может быть представлена ​​как успешный ответ 200 на уровне HTTP. Клиент запросил URL-адрес, а сервер отправил HTML-страницу в ответ. Независимо от того, была ли проверка подлинности HTML-запроса успешной или неудачной, HTTP-это просто транспорт, ему не важно, какой конкретный контент будет доставлен. Ошибка HTTP сообщается только при возникновении ошибки HTTP-уровня. Если проверка подлинности HTML не удалась, в результате HTML-страница обычно будет содержать сообщение об ошибке и/или веб-форму HTML входа снова.

Итак, в этом случае вы получаете ответ HTTP 200, потому что HTTP успешно выполнил свою работу. Вам нужно будет проанализировать фактический HTML-код, чтобы узнать, действительно ли проверка подлинности или неудача. На уровне HTTP нет указаний в том или ином виде.

+0

Спасибо, я ценю ваш ответ. Ммм, боюсь, я показал свою слабость в веб-технологиях ... HTML ... HTTP ... до вашего поста, они были для меня одинаковыми. Я буду читать HTML для ошибок. – Johnny

+1

Еще в первые дни Интернета HTTP (Hyper-Text Transport Protocol) первоначально был предназначен для переноса только HTML (Hyper-Text Markup Language), но с годами он превратился в нечто гораздо большее. HTML - это только один из многих форматов данных, которые HTTP поддерживает в современных интернет-системах. –

+0

Еще раз спасибо, Реми, ваш ответ здесь ... http://stackoverflow.com/questions/30076775/how-to-clear-the-indy-tidhttp-basicauthentication-credentials помогли мне получить 401. Мне просто нужно играть и учиться сейчас. – Johnny