Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

indy-компонент tidHttp, ошибка 411 Length Required [D7, WinXP]


ГостьНомер ©   (2006-04-15 11:39:00) 

Скажите, в компоненте tIdHTTP нужно вручную указывать параметр Request.ContentLength? Как вообще с ним правильно обращаться? Выполняю такой код:


var
   http:TIdHTTP;
   ssl:TIdSSLIOHandlerSocket;
   Response: TStringStream;
   stringsIn,stringsOut:TStringList;
   stream:TStringStream;
begin
http:=TIdHTTP.create(form1);
ssl:=TIdSSLIOHandlerSocket.Create(http);
Response:=TStringStream.Create('');
ssl.SSLOptions.Method:=sslvTLSv1;
HTTP.port:=443;
http.IOHandler:=ssl;
http.ProxyParams.ProxyPort:=3128;
http.ProxyParams.ProxyServer:='адрес прокси';

stringsIn:=tstringlist.Create;
stringsOut:=tstringlist.Create;

stringsIn.Clear;
stringsOut.Clear;
// stringsIn.add('тут тело запроса');
stringsIn.Add('тело продолжается');
stringsIn.Add('тело продолжается');
...
stringsIn.Add('тело закончилось');
stream:=tstringstream.create(stringsin.Text);

HTTP.Request.ContentType:= 'text/plain; charset=Windows-1251';
http.Request.CustomHeaders.Add('тут несколько CustomHeaders');
http.Request.CustomHeaders.Add('тут несколько CustomHeaders');

HTTP.Request.ContentLength:=Length(TStrings(stringsIn).Text);

try
  HTTP.Post('тут URL', stream, Response);
  stringsOut.Text := Response.DataString;
finally
 Response.Free;
end;
stringsIn.Free;
stringsOut.Free;


Пробовал в качестве параметра в http.post передавать TStringStream, TStringList. Пробовал указывать и не указывать ContentLength. Результат всегда один - ошибка 411 Length Required. Как правильно делать? И как следует обрабатывать символы конца строки (сервер ведь может быть на юниксе и принимать конец строки 1 символ \n, если на винде, то два символа \r\n, при этом меняется ContentLength). Delphi 7, Indy 9. Поиск результата не дал.


Чапаев   (2006-04-20 09:26:00) [1]

По стандарту Content-Length должен быть указан при использовании метода POST.

Ты уверен, что тебе именно POST нужен?


ГостьНомер   (2006-04-20 09:13:00) [2]

Отвечаю сам: ContentLength указывать не надо. Заработал вариант с параметром типа TStringStream, другие не пробовал.
Косяк был в неправильном URL.


Poirot   (2006-04-18 18:32:00) [3]

Насчёт \n это чётко прописано в спецификации и никаких разчилий не дожно быть - должно быть 2(0xD,0xA) байта между строками запроса и 4(0xD,0xA, 0xD,0xA) до тела запроса или ответ...
А само тело может содержать произволные символы.
ContentLength - он и буит меняться.. вопрос второй, на какой сервер вы кидаете это?! как он понимает то, что пислано в теле запроса?!
ЗЫ: См RFC на предмет 411 ошибки


Наверх

Титульная страница Поиск, карта сайта Написать письмо