-
Добрый вечер! Имеется функция аплоада картинки на сервер: function SendCJB(Path: string): string;
var
HTTP: TIdHTTP;
MPS: TIdMultiPartFormDataStream;
S: string;
begin
Result := '';
if not FileExists(path) then Exit;
HTTP := TIdHTTP.Create(nil);
MPS := TIdMultiPartFormDataStream.Create;
HTTP.HandleRedirects := True;
HTTP.Request.Referer := 'http://www.cjb.net/';
HTTP.ProtocolVersion := pv1_1;
HTTP.HTTPOptions := [hoKeepOrigProtocol];
MPS.AddFormField('images', '1');
MPS.AddFile('image', path, 'multipart/form-data');
try
S := HTTP.Post('http://upload.cjb.net/', MPS);
result := S;
finally
MPS.Free;
HTTP.Free;
end;
end; Если HandleRedirects = false, то вылетает EIdHTTPProtocolException 302 Found. Если же дать idhttp обработать редирект, то вылетает уже 405 - method not allowed. Мониторинг показал, что инди получает вот такой заголовок от сервера, который и вводит её в затруднения (делали post, а сервер предлагает в ответе перейти по редиректу): HTTP/1.1 302 Found Server: nginx Date: Sat, 05 Feb 2011 13:34:17 GMT Content-Type: text/html; charset=iso-8859-1 Connection: keep-alive Cache-Control: no-cache Location: http://www.cjb.net/images.html?c1c90.jpgContent-Length: 220 Помогите, пожалуйста, побороть 405-ю ошибку!
-
UPD: если посмотреть HTTP.Response.RawHeaders.GetText, то видим следующую забавную вещь, которая, возможно, объясняет этот 405:
Server: nginx Date: Sat, 05 Feb 2011 15:59:55 GMT Content-Type: text/html; charset=iso-8859-1 Transfer-Encoding: chunked Connection: keep-alive Allow: GET, HEAD, OPTIONS, TRACE
То есть upload.cjb.net может принять POST, а редирект идёт на обычный www.cjb.net, который крутится на nginx без POST, верно ли я понимаю?
-
Решено, но очень-очень некрасиво :( function SendCJB(Path: string): string;
var
HTTP: TIdHTTP;
MPS: TIdMultiPartFormDataStream;
S: string;
begin
Result := '';
if not FileExists(path) then Exit;
HTTP := TIdHTTP.Create(nil);
MPS := TIdMultiPartFormDataStream.Create;
HTTP.HandleRedirects := False;
HTTP.Request.Referer := 'http://www.cjb.net/';
HTTP.ProtocolVersion := pv1_1;
HTTP.HTTPOptions := [hoKeepOrigProtocol];
MPS.AddFormField('images', '1');
MPS.AddFile('image', path, 'multipart/form-data');
try
try
S := HTTP.Post('http://upload.cjb.net/', MPS);
except
S := HTTP.Response.RawHeaders.GetText;
S2 := Trim(Copy(S, Pos('Location: ', S), 100));
end;
S := HTTP.Get(S2);
S2 := Copy(S, Pos('<a href=\"', S)+9, 200);
Result := Copy(S2, 0, Pos('\"', S2)-1);
finally
MPS.Free;
HTTP.Free;
end;
end;
-
похоже так такая же ерунда...
-
> либо 302, либо 405
302 не ошибка
-
понятно, но инди ее как ошибку делает
если оставить разрешение редиректа, то метод post странно перескакивает на get говоришь post url1 он туда ломится, потом редиректится пару раз, потом вдруг get делает, уже по url3
не понимаю, как так..
-
как-то так работает, вроде repeat PostHttp302(idHTTP1, v, PostDATA, WD, R_URL); v := R_URL; until not(WD);
---------- procedure TForm1.PostHttp302(Http: TIdHTTP; URL: string; PostData: TStringList; var WasRedirect:Boolean; var NewUrl: string); begin WasRedirect := False; try Http.Post(URL, PostData); except on e: EIdHTTPProtocolException do begin if e.ErrorCode = 302 then begin WasRedirect := True; NewUrl := Http.Response.Location; print( 'e.ErrorCode = 302'); print(NewUrl); print(Format('%s: [%s]',['E.ClassName', E.ClassName])); print(Format('%s: [%s]',['E.Message', E.Message])); print(Format('%s: [%s]',['E.ErrorMessage', E.ErrorMessage])); print(Format('%s: [%s]',['Response.RawHeaders.GetText', Http.Response.RawHeaders.GetText])); print( '---e.ErrorCode = 302----'); end else begin print(Format('%s: [%s]',['E.ClassName', E.ClassName])); print(Format('%s: [%s]',['E.Message', E.Message])); print(Format('%s: [%s]',['E.ErrorMessage', E.ErrorMessage])); print(Format('%s: [%s]',['Response.RawHeaders.GetText', Http.Response.RawHeaders.GetText])); end; end; end; end;
procedure TForm1.Print(s: string); begin mmo1.Lines.Add(s); end;
-
О-о, а я тогда так и оставил вложенный except, не было времени, а потом и вообще проект перевёл на PHP/CURL, там curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE); отрабатывает хорошо, а в Indy код 302 вроде до сих пор так и выкидывает исключение.
|