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