http/1.1 405 боримся

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by akimov_aleks, 6 Jul 2010.

  1. akimov_aleks

    akimov_aleks New Member

    Joined:
    3 May 2009
    Messages:
    39
    Likes Received:
    1
    Reputations:
    0
    Добрый день делаю POST выдает ошибку
    HTTP/1.1 405 Method Not Allowed
    и ругаеться на строчку
    IdHTTP.pas
    Code:
    raise EIdHTTPProtocolException.CreateError(AResponseCode, FHTTP.ResponseText, LTempResponse.DataString);
    но главно что POST запрос выполняеться и я получаю результат.
    еслии я ее удоляю то вместо слова привет приходит
    %D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82
    подскажите как сделать чтоб игнорировать данную ошибку
    IdHTTP1.HandleRedirects:=true

    P/S Простите за русский...
     
  2. tracy

    tracy Elder - Старейшина

    Joined:
    24 Mar 2009
    Messages:
    244
    Likes Received:
    119
    Reputations:
    40
    Попробуй false
     
  3. akimov_aleks

    akimov_aleks New Member

    Joined:
    3 May 2009
    Messages:
    39
    Likes Received:
    1
    Reputations:
    0
    если false то HTTP/1.1 302
     
  4. ][yZ

    ][yZ Member

    Joined:
    3 Mar 2009
    Messages:
    66
    Likes Received:
    46
    Reputations:
    10
    try except, не?
     
  5. akimov_aleks

    akimov_aleks New Member

    Joined:
    3 May 2009
    Messages:
    39
    Likes Received:
    1
    Reputations:
    0

    try
    ляля
    ляля
    лял
    post(kz)

    except
     
  6. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Если используется старая версия Indy(7), то там есть с этим баг при редиректах, дело в том что редирект всегда должен быть GET'ом, а при POST запросе в Indy собственно после редиректа метод не изменяется и получается что редирект происходит с GET'ом.

    Если не ошибаюсь, то могу скинуть заплатки.
     
  7. DrCepbIu

    DrCepbIu New Member

    Joined:
    26 Jun 2010
    Messages:
    15
    Likes Received:
    2
    Reputations:
    0
    In the file IdHttp.pas for procedure call BuildAndSendRequest, I changed
    // write the headers
    for i := 0 to Request.RawHeaders.Count - 1 do
    if Length(Request.RawHeaders.Strings)>0 then
    FHTTP.WriteLn(Request.RawHeaders.Strings);
    to
    // write the headers
    for i := 0 to Request.RawHeaders.Count - 1 do
    if Length(Request.RawHeaders.Strings)>0 then
    if (AnsiStartsText('Content-Length') and (Request.Method = hmConnect) then
    FHTTP.WriteLn('Content-Length: 0')
    else
    FHTTP.WriteLn(Request.RawHeaders.Strings);
     
  8. akimov_aleks

    akimov_aleks New Member

    Joined:
    3 May 2009
    Messages:
    39
    Likes Received:
    1
    Reputations:
    0
    исправил но не так как хотел поставив
    Code:
    IdHTTP2.RedirectMaximum:=1;
    
    но это не выход
     
  9. DrCepbIu

    DrCepbIu New Member

    Joined:
    26 Jun 2010
    Messages:
    15
    Likes Received:
    2
    Reputations:
    0
    а чем то что я посоветовал не выход? если не понимаешь совсем по англ, то перевожу
    Code:
    В файле IdHttp.pas в процедуре которая называется BuildAndSendRequest, я изменил вот это
    // пишет заголовки
    for i := 0 to Request.RawHeaders.Count - 1 do
    if Length(Request.RawHeaders.Strings[i])>0 then
    FHTTP.WriteLn(Request.RawHeaders.Strings[i]);
    
    на
    Code:
    // пишет заголовки
    for i := 0 to Request.RawHeaders.Count - 1 do
    if Length(Request.RawHeaders.Strings[i])>0 then
    if (AnsiStartsText('Content-Length') and (Request.Method = hmConnect) then
    FHTTP.WriteLn('Content-Length: 0')
    else
    FHTTP.WriteLn(Request.RawHeaders.Strings[i]);
    
    
     
  10. enk

    enk New Member

    Joined:
    21 Feb 2011
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    Извиняюсь за поднятие темы, но у меня точно такая же проблема на Delphi XE.
    HTTP.RedirectMaximum := 1; тоже помогло, но не думаю, что это правильное решение проблемы.
     
  11. WendM

    WendM Member

    Joined:
    29 Jan 2012
    Messages:
    44
    Likes Received:
    7
    Reputations:
    3
    Что это дает ? А то я не могу понять код :)
     
  12. enk

    enk New Member

    Joined:
    21 Feb 2011
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    Решение:
    Code:
    procedure TForm1.HTTPRedirect(Sender: TObject; var dest: string;
      var NumRedirect: Integer; var Handled: Boolean; var VMethod: string);
    begin
     VMethod:='GET';
    end;
     
  13. ADR-007

    ADR-007 Member

    Joined:
    12 Jul 2010
    Messages:
    218
    Likes Received:
    9
    Reputations:
    0
    Я такой аналог сделал: (были проблемы то-ли с 301 то-ли 302)
    Code:
     
    type
      TIdHTTPRedirectHelper = class helper for TIdHTTP
        function GetWithRedirect(URL: string; MaxRedirectCount: Integer = 10): string;
      end;
    implementation
    
    function TIdHTTPRedirectHelper.GetWithRedirect(URL: string;
      MaxRedirectCount: Integer): string;
    var
      I: Integer;
    begin
      for I := 0 to MaxRedirectCount -1 do
      begin
        try
          Result := Get(URL);
        except
          on E : EIDHttpProtocolException do
            if (E.ErrorCode = 301) or (E.ErrorCode = 302) then
            begin
              URL := Response.Location;
              Continue;
            end
            else
              raise;
        end;
        Exit;
      end;
      URL := Response.Location;
    end;
    
    тока замениш на ПОСТ.

    пример использования:
    Code:
    var
      Http: TIdHTTP;
    begin
      Http := TIdHTTP.Create(nil);
      try
        Http.GetWithRedirect('my.com')
      finally
        Http.Free;
      end;
    end;