Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.049 c
4-1159092228
Psychedelic
2006-09-24 14:03
2007.02.04
Как отключить сервис ZoneAlarm?


15-1169034793
Ega23
2007-01-17 14:53
2007.02.04
Ну вот прошёл тестирование


15-1168520149
AleXerON
2007-01-11 15:55
2007.02.04
Cортировщик уинов


6-1157100295
tvv
2006-09-01 12:44
2007.02.04
Работа с каталогами по сети


3-1163410504
Gyrus
2006-11-13 12:35
2007.02.04
Скопировать таблицы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский