Вниз
Скачать: CL | DM;

Transfer-encoding: chunked   Найти похожие ветки 

 
Орион ©   (2006-08-30 17:28) [0]

Indy 10, TidTCPClient.

Как правильно принять ответ сервера при "Transfer-encoding: chunked"?

Сейчас код такой:

Chunked: boolean - флаг, если true значит есть поле "Transfer-encoding: chunked"
Tunnel: TidTCPClient - шлет серверу запрос, затем ждет ответ.
AData: TStringStream - буфер для хранения ответа.

if Chunked then
repeat
Line:=Tunnel.AIOHandler.ReadLn;
AData.WriteString(Line+EOL);
until Line="0";


Так вот. В принципе такая конструкция работает, но на некоторых серверах браузер не может правильно понять ответ сервера и шлет один и тот же запрос бесконечное число раз (может и не бесконечное, но траффик дороже :) ).

Так вот, каким же образом правильно принять ответ от сервера?
К TidHTTP не отправляйте, мне нужен именно TIdTCPClient;


 
han_malign ©   (2006-08-30 17:53) [1]

ReadLn - это смело, там вообще то бинарные данные идут, и строка "0"CRLF - может встречаться не раз...
а "0" - может быть и "0;" + <chunk-ext-name [ "=" chunk-ext-val ]>
а после еще дополнительный RFC-822 заголовок может идти...

Так что шел бы ты к TidHTTP, ну или к RFC-2616 (http://www.ietf.org/rfc/rfc2616.txt)


 
Орион ©   (2006-08-30 18:21) [2]

> [1] han_malign ©   (30.08.06 17:53)

> ReadLn - это смело, там вообще то бинарные данные идут, и строка "0"CRLF - может встречаться не раз...

Да я в курсе. Это так, для теста. Тем более именно тот сервер, о котором я писал передает таким образом html страницу. И "кусок" там всего 1!

> Так что шел бы ты к TidHTTP
Писал же, нужен именно TCPClient

> ну или к RFC-2616 (http://www.ietf.org/rfc/rfc2616.txt)
В за ссылку спасибо!


 
Орион ©   (2006-08-31 15:39) [3]

> [1] han_malign ©   (30.08.06 17:53)

Еще раз спасибо)

Вот, кусок с небольшими пояснениями, может кому пригодится.

function ChunkSize(s: string): integer;
var
i: Integer;
begin
i:=Pos(" ", s);
if i>0 then s:=Copy(s, 1, i-1);
Result:=StrToIntDef("$"+s, 0);
end;

if Chunked then
repeat
Line:=Tunnel.IOHandler.Readln(EOL); //получаем строку с размером куска и, возможно, дополнительными данными, которые нам не нужны.
Size:=ChunkSize(Line); //извлекаем из строки размер куска
AData.WriteString(Line+EOL);
if Size>0 then
begin
 Stream:=TIdStreamVCL.Create(AData, False);
 Tunnel.IOHandler.ReadStream(Stream, Size);
 Stream.Free;
end;
AData.WriteString(Tunnel.IOHandler.ReadLn+EOL); //здесь идет пустая строка, но ее обязательно нужно забрать из буфера.
until Size=0;



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.026 c
2-1168787790
novice007
2007-01-14 18:16
2007.02.04
TIdHTTPServer и запись в файл


2-1169148215
malyar
2007-01-18 22:23
2007.02.04
idpop3.delete (удаление письма)


2-1169037394
vitv
2007-01-17 15:36
2007.02.04
Результат запроса


4-1159123015
Fio
2006-09-24 22:36
2007.02.04
Поиск и регистрация процессов в WinXP


2-1168940153
PKM
2007-01-16 12:35
2007.02.04
Работа с TStringGrid.




   Наверх