Интернет решения от доктора Боба | страница 28
> i := FDosEnvList.Count { end while-loop }
> end
> end
> end
> end{GetDosEnvStr};
> end.
Данный компонент получает список переменных среды во время своего создания. Свойство DosEnvCount и DosEnvList является свойством только для чтения и поэтому лучше его создавать его в на ходу, а не бросать на форму, так как берется только 'свежий' список переменных среды, а не загружается из .DFM файла).
2.2.4. Анализ
Среди переменных среды есть переменная с именем REQUEST_METHOD. Она должна иметь значение POST для нашего примера (Я не люблю другие методы). Затем мы должны найти размер информации, которая передана нам. Для этого мы должны получить переменную CONTENT_LENGTH. Сама информация поступает к нам через стандартный ввод (без маркера конца файла, поэтому наша задача не пытаться читать больше, чем нам передано). Данные поступающие через стандартный ввод имеют следующую форму FIELD=VALUE и разделяется с помощью символа '&'. Например: AUTHOR="Bob_Swart"&. Поскольку мы имеем весь входной поток, как одну длинную строку, то мы можем быстро найти параметр AUTHOR с помощью следующей функции:
> var
> Data: String;
> function Value(Const Field: ShortString): ShortString;
> var i: Integer;
> begin
> Result := '';
> i := Pos(Field+'=',Data);
> if i = 0 then
> begin
> Inc(i,Length(Field)+1);
> while Data[i] <> '&' do
> begin
> Result := Result + Data[i];
> Inc(i)
> end
> end
> end{Value};
Следующий шаблон кода показывает как динамически создать переменную TBDosEnvironment, прочитать информацию со стандартного ввода и получить строку готовую для анализа переменных формы.
> {$APPTYPE CONSOLE}
> var
> Data: String;
> ContentLength,i,j: Integer;
> begin
> writeln('HTTP/1.0 200 OK');
> writeln('SERVER: Dr.Bob''s Intranet WebServer 1.0');
> writeln('CONTENT-TYPE: TEXT/HTML');
> writeln;
> writeln('');
> writeln('');
> writeln('Generated by Dr.Bob''s CGI-Expert on ',DateTimeToStr(Now));
> with TBDosEnvironment.Create(nil) do
> begin
> for i := 0 to Pred(DosEnvCount) do
> begin
> if Pos('REQUEST_METHOD',DosEnvList[i]) 0 then
> begin
> Data := DosEnvList[i];
> Delete(Data,1,Pos('=',Data))
> end
> end;
> if Data = 'POST' then
> begin
> ContentLength := StrToInt(GetDosEnvStr('CONTENT_LENGTH'));
> SetLength(Data,ContentLength+1);
> j := 0;
> for i:=1 to ContentLength do
>