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

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

Transfer-encoding: chunked


Орион ©   (2006-08-30 17:28:00) 

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;


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

> [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;


Орион   (2006-08-30 18:21:00) [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)
В за ссылку спасибо!


han_malign   (2006-08-30 17:53:00) [3]

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

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


Наверх

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