Форум: "Сети";
Текущий архив: 2007.02.04;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.045 c