![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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 ошибки