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

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

Еще вопрос по поводу CGI. [D6, Win2k]


Vint45 ©   (2003-09-20 14:08:00) 

CGI-модуль принимает данные от веб-сервера кусками (пакетами). И чтоб считать все данные я использую следующую конструкцию:

SizeFile:=StrToInt(GetEnvironmentVariable("CONTENT_LENGTH"));
while SizeFile>Length(Str) do begin
StdIn:=GetStdHandle(STD_INPUT_HANDLE);
SizeBlock:=SetFilePointer(StdIn,0,nil,FILE_END);
SetFilePointer(StdIn,0,nil,FILE_BEGIN);
BeginBlock:=Length(Str);
SetLength(Str,BeginBlock+SizeBlock);
{ Читаем данные из стандартного устройства ввода}
ReadFile(StdIn,Str[BeginBlock+1],SizeBlock,Actual,nil);
end;

Вопрос: может ли данная конструкция привести к подвисанию веб-сервера? Т.е. если соединение между клиентом и веб-сервером плохое(допустим 1 бит в сек.), то веб-сервер не сможет обрабатывать другие запросы? Ведь циклы могут привести не только зависанию программы, но операционки(Win 98). Или может веб-сервер сначала закачивает все данные, а потом уже передает их кусками CGI-модулю?


Vint45   (2003-09-20 14:55:00) [1]

Ну что ж, раз сможет, тогда хорошо. :-) Спасибо.


Verg   (2003-09-20 14:46:00) [2]


> ИМХО тоже самое и у меня. Я прав?


Может быть...

> код взят из статьи этого портала "Написание CGI-приложений...".
>


А что, file|new|web Service application теперь пользоваться уже не модно?


> Единственное что я добавил, так запихнул исходный текст
> в цикл


Угу. Вместе с


> StdIn:=GetStdHandle(STD_INPUT_HANDLE);



> Я так понял в списке заносятся все переменные окружения,
> а потом выцепляется одна, а именно "Content_Length" и по
> ней идет цикл приема данных


Сейчас одна, потом еще одна другая может понадобиться и т.д.


> то веб-сервер не сможет обрабатывать другие запросы?


Сможет. По крайней мере Apache точно сможет.


Vint45   (2003-09-20 14:37:00) [3]

Непоятно что? код? код взят из статьи этого портала "Написание CGI-приложений...". Единственное что я добавил, так запихнул исходный текст в цикл, т.к. без цикла у меня принимался кусок данных только 8192 байта (первый пакет).
Непонятен вопрос? объяснил как мог :-)
Пробую разобраться с приведенным Вами кодом. Я так понял в списке заносятся все переменные окружения, а потом выцепляется одна, а именно "Content_Length" и по ней идет цикл приема данных - ИМХО тоже самое и у меня. Я прав?


Verg   (2003-09-20 14:19:00) [4]

Эпиграфы:
"Зачем ты усложнил то, что проще простого" (С) Наутилус-помпилиус
"Вы на Паскале или где!"

Я вообще с трудом прочитал то, что там написано. Уж лучше б на с++ - чес-слово....

Я бы что-то типа этого написал:

var P : Pchar;
S: string;
Fields : TStringList;
I : integer;
C : char;
begin
Fields:=TStringList.Create;
try
P:=GetEnvironmentStrings;
while P^<>#0 do
begin
S:=P;
Fields.Add(S);
inc(P, length(S)+1);
end;
S:="";
for I:=0 to StrToIntDef(Fields.Values["Content_Length"],0)-1 do
begin
Read(input, C);
S:=S+C;
end;
...............


Наверх

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