Раздел «Дополнительные функции».
Затем HTTP-запрос анализируется, чтобы определить, что запрашивает пользователь. Первый
возможность GET — другими словами, простой запрос просмотра:
если ($ENV{REQUEST_METHOD} эквивалент GET){
мои $qs = $ENV{QUERY_STRING};
РАЗБОР ЗАПРОСОВ
251
$qs
s/($LinkPattern)\&// если только $qs
"="
$RawInput = $qs || $По умолчаниюЗаголовок;
$RawInput =~ s/ A ($LinkPattern)/$DefaultRequest=$l/;
}
Подстановка строки запроса — это небольшой хак, позволяющий «проглотить» заголовок страницы.
часть строки запроса, когда, например, поиск запрашивается со страницы
(...вики ?MyPage&search=xxx), если это не происходит в контексте другой конкретной страницы
команда, такая как edit (использующая "="). Обратите внимание на включение ИЛИ страницы по умолчанию, если ее нет.
указывается в запросе. Это значение по умолчанию не что иное, как главная страница с уникальным именем.
нашей вики.
Если запрос был POST, сначала прочитайте переданные данные формы:
если ($ENV{REQUEST_METHOD} эквивалент POST){
читать (STDIN, $ RawInput, $ ENV {CONTENT_LENGTH});
}
Теперь обработайте ввод и проанализируйте его компоненты:
$RawInput =~ s/\+/ /g;
foreach $_ (разделить (/&/, $RawInput)) {
s/\%(..)/pack(C/hex($1))/ge;
s/$mark//идти;
($_, $CookedInput) = разделить (/ = /, $_, 2);
$CookedInput{$_} = $CookedInput;
}
«Подготовленный ввод» состоит из компонентов HTTP-запроса с идентификацией по имени, из которых
обычно только один или два определяются для каждого запроса. Это используется в последующих тестах.
чтобы определить, какие подпрограммы выполнять, и какой механизм нам нужен вместо
явный вызов разных модулей.
если ($ENV{REQUEST_METHOD} эквивалент POST) {
$CookedInput{сообщение}
&& &HandlePost;
# добавить другие по мере необходимости
} еще {
Базовая вики допускает только один вариант POST (отправка редактирования страницы), но
мы сохраняем тот же формат теста, что и параметры GET, показанные далее, чтобы упростить
будущее расширение.
252
АЛЬТЕРНАТИВЫ И РАСШИРЕНИЯ
Варианты GET более разнообразны:
$CookedInput{обзор} && &HandleBrowse;
$CookedInput{править}
&& &HandleEdit;
$CookedInput{поиск} && &HandleSearch;
$CookedInput{обратная ссылка}
&& &Обработка поиска;