Раздел «Дополнительные функции».

Затем 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{обратная ссылка}

&& &Обработка поиска;