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