Интернет решения от доктора Боба
Шрифт:
begin
FDosEnvList.Free;
FDosEnvList := nil;
inherited Destroy
end {Destroy};
function TBDosEnvironment.GetDosEnvCount: Word;
begin
Result := 0;
if Assigned(FDosEnvList) then Result := FDosEnvList.Count
end {GetDosEnvCount};
function TBDosEnvironment.GetDosEnvStr(Const Name: String): String;
var i: Integer;
Tmp: String;
begin
i := 0;
Result := '';
if Assigned(FDosEnvList) then while i <FDosEnvList.Count >do
begin
Tmp := FDosEnvList[i];
Inc(i);
if Pos(Name,Tmp) = 1 then
begin
Delete(Tmp,1,Length(Name));
if Tmp[1] = '=' then
begin
Delete(Tmp,1,1);
Result := Tmp;
i := FDosEnvList.Count { end while-loop }
end
end
end
end {GetDosEnvStr};
end.
Данный
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};
Следующий
{$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('<HTML>');
writeln('<BODY>');
writeln('<I>Generated by Dr.Bob''s CGI-Expert on </I>',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);
Поделиться:
Популярные книги
Под маской, или Страшилка в академии магии
Фантастика:
юмористическая фантастика
7.78
рейтинг книги
Повелитель механического легиона. Том III
3. Повелитель механического легиона
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Генерал Скала и сиротка
1. Генерал Скала и Лидия
Любовные романы:
любовно-фантастические романы
6.40
рейтинг книги
Кодекс Крови. Книга IХ
9. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Стеллар. Трибут
2. Стеллар
Фантастика:
боевая фантастика
рпг
8.75
рейтинг книги
Повелитель механического легиона. Том II
2. Повелитель механического легиона
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Жаба с кошельком
19. Любительница частного сыска Даша Васильева
Детективы:
иронические детективы
8.26
рейтинг книги
Мастер 4
4. Мастер
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Возвышение Меркурия. Книга 5
5. Меркурий
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я еще князь. Книга XX
20. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Книга 4. Игра Кота
4. ОДИН ИЗ СЕМИ
Фантастика:
фэнтези
боевая фантастика
рпг
6.68
рейтинг книги
Черный Маг Императора 5
5. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Дракон с подарком
3. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
6.62
рейтинг книги
Страж Кодекса. Книга II
2. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00