Здесь определяется действие просмотра по умолчанию. Если в запросе указано
что-то еще, это должно быть проверено на достоверность, прежде чем предполагать, что это
конкретный вики-модуль.
$файл =~ /\.cgi$/
? &вызвать()
: &копировать();
Если это разумное имя модуля, запустите его; в противном случае сделайте что-нибудь другое
разумные предположения в подпрограмме копирования.
закрыть (НС);
}
Мы закончили, поэтому вернитесь к циклу бездействия верхнего уровня.
Подпрограмма вызова обрабатывает детали действительного запроса модуля.
подвызов {
местный (%ENV);
$ ENV { REQUESTjyiETHOD} = $ метод;
$ENV{QUERY_STRING} = $запрос, если $запрос;
228
ПРОВЕРЕННЫЕ КОМПОНЕНТЫ WIKI
$ ENV{CONTENT_LENGTH} = $head{'длина содержимого'}, если $head
{'длина содержимого'};
$ ENV {HTTP_REFERER} = $head{'referer'}, если $head{'referer'} ;
# $ENV{REM0TE_USER} = ' ' ;
Каждый запрос устанавливает локальную среду и определяет соответствующие переменные сервера.
из проанализированного запроса. Это важно, потому что более поздний вики-код может использовать эти
ценности.
напечатать NS "HTTP/1.0 200\r\n";
сделать $ файл;
Здесь сервер вызывает модуль как подпрограмму. При последующем возврате отправляет
из любого сообщения об ошибке из последней оценки Perl.
выведите NS join('<br>', split("\n",$@)) если
}
Следующая подпрограмма обрабатывает различные ситуации, когда запрос браузера не
не указывать допустимое имя модуля; например, когда пользователь прерывает
передача.
дополнительная копия {
открыть (F, $ файл);
бинмод F;
копировать: в то время как ($ len = sysread (F, $ buf, 10240)) {
если (! определено $len) {
следующий, если $!
/Прервано/;
последний экземпляр;
}
$ смещение = 0;
while ($len) { # Обработка частичной записи.
$writing = syswritefNS, $buf, $len,
$ смещение);
последняя копия, если не определено $writing;
$len -= $написано;
$ смещение + = $ написано;
}
}
закрыть (Ф);
}
ДОПОЛНИТЕЛЬНЫЕ ДОПОЛНИТЕЛЬНЫЕ КОМПОНЕНТЫ
229
Наконец, хотя в этом простом примере он не используется, мы можем кратко показать, как
сервер Quicki можно настроить для отображения списка файлов в каталоге. Затем подпрограмма
вызывается, если URL-адрес запроса заканчивается косой чертой.
подиндекс {
$file =~ s/\/$//;
opendir(D, $файл);
печатать NS
"<hl>$file/</hlxul>\n",
карта("<li><a href=$file/$_>$_</a>\n",
"</ul>\n";
закрытый(D);
readdir(D)),
}
На этом анализ кода ядра QuickiWiki завершен. Пара других
полезные модули заслуживают более пристального внимания, и они рассматриваются в следующем разделе.
ДОПОЛНИТЕЛЬНЫЕ ДОПОЛНИТЕЛЬНЫЕ КОМПОНЕНТЫ
Ниже приведены примеры того, как базовая вики может быть расширена за счет
просто добавление новых модулей. Один показывает, как обрабатывать содержимое страницы, а два
относятся к простому способу управления контролем доступа пользователей.