Главная страница
    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.052 c
2-1169151584
Альберт
2007-01-18 23:19
2007.02.04
а как узнать path окошка?


2-1169004241
a5p
2007-01-17 06:24
2007.02.04
Панель задач


2-1168786829
Kostafey
2007-01-14 18:00
2007.02.04
Подтверждение SaveAs для Word и Excel


2-1168863693
Obormot
2007-01-15 15:21
2007.02.04
Программное управление формой


4-1158738392
Petrovitch
2006-09-20 11:46
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский