Здесь определяется действие просмотра по умолчанию. Если в запросе указано

что-то еще, это должно быть проверено на достоверность, прежде чем предполагать, что это

конкретный вики-модуль.

$файл =~ /\.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 завершен. Пара других

полезные модули заслуживают более пристального внимания, и они рассматриваются в следующем разделе.

ДОПОЛНИТЕЛЬНЫЕ ДОПОЛНИТЕЛЬНЫЕ КОМПОНЕНТЫ

Ниже приведены примеры того, как базовая вики может быть расширена за счет

просто добавление новых модулей. Один показывает, как обрабатывать содержимое страницы, а два

относятся к простому способу управления контролем доступа пользователей.