Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.04;
Скачать: 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 вся ветка

Текущий архив: 2007.02.04;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.058 c
2-1168951444
KyRo
2007-01-16 15:44
2007.02.04
Количество записей в таблице


8-1150105159
valent
2006-06-12 13:39
2007.02.04
Повернуть Изображение в TImage


15-1168920267
Slider007
2007-01-16 07:04
2007.02.04
С днем рождения ! 16 января


15-1168889829
The X
2007-01-15 22:37
2007.02.04
Корректное отображение кириллицы в названиях разделов в CHMхелпах


15-1168608312
kaZaNoVa
2007-01-12 16:25
2007.02.04
Идеальная защита лицензионного ПО