Apache. Документация на русском


Разделы:   1    2    3    4    5    6    7    8    9    10      11      12    13    14    15    16  

Раздел 11. Документация для разработчиков

Пункты:   214    215    216    217    218      219      220    221    222    223  

 <         > 
  RU            EN  

Пункт 219. Преобразование модулей версии 1.3 в версию 2.x

Это первая попытка записать уроки, которые я усвоил, пытаясь преобразовать mod_mmap_static модуль в Apache 2.0. Это ни в коем случае не является окончательным и, вероятно, даже не будет правильным в некоторых отношениях, но это только начало.

Чем проще изменения...

Процедуры очистки

Теперь они должны быть типа apr_status_t и возвращать значение этого типа. Обычно возвращаемое значение будет APR_SUCCESS таким, если нет необходимости сигнализировать об ошибке при очистке. Имейте в виду, что даже если вы сообщаете об ошибке, не весь код еще проверяет и реагирует на ошибку.

Процедуры инициализации

Теперь их следует переименовать, чтобы лучше обозначить их место в общем процессе. Таким образом, имя получает небольшое изменение с mmap_init на mmap_post_config . Передаваемые аргументы претерпели радикальное изменение и теперь выглядят как

  • apr_pool_t *p
  • apr_pool_t *plog
  • apr_pool_t *ptemp
  • server_rec *s

Типы данных

Многие типы данных были перемещены в APR. Это означает, что у некоторых было изменено имя, например, как показано выше. Ниже приводится краткий список некоторых изменений, которые вам, вероятно, придется внести.

  • pool становится apr_pool_t
  • table становится apr_table_t

Более грязные изменения...

Регистрация хуков

В новой архитектуре используется ряд хуков, обеспечивающих вызов ваших функций. Их вам нужно будет добавить в свой модуль с помощью новой функции static void register_hooks(void) . Функция действительно достаточно проста, когда вы понимаете, что нужно сделать. Каждую функцию, которую нужно вызвать на каком-то этапе обработки запроса, нужно регистрировать, обработчики — нет. Существует несколько фаз, на которых можно добавлять функции, и для каждой из них вы можете указать с высокой степенью контроля относительный порядок, в котором функция будет вызываться.

Это код, который был добавлен в mod_mmap_static :

 статическая пустота register_hooks (пустота)
{
 static const char * const aszPre[]={ "http_core.c",NULL };
 ap_hook_post_config (mmap_post_config, NULL, NULL, HOOK_MIDDLE);
 ap_hook_translate_name (mmap_static_xlat, aszPre, NULL, HOOK_LAST);
}; 

Это регистрирует 2 функции, которые необходимо вызвать: одну на post_config этапе (практически каждому модулю она понадобится) и одну для translate_name фазы. обратите внимание, что хотя существуют разные имена функций, формат каждого из них идентичен. Итак, что такое формат?

ap_hook_phase_name(function_name, predecessors, successors, position);

Определено 3 положения крюка...

  • HOOK_FIRST
  • HOOK_MIDDLE
  • HOOK_LAST

Чтобы определить позицию, вы используете позицию, а затем изменяете ее с помощью предшественников и преемников. Каждый из модификаторов может быть списком функций, которые должны быть вызваны либо до запуска функции (предшественники), либо после запуска функции (преемники).

В этом mod_mmap_static случае меня не волновал этап post_config , но он mmap_static_xlat должен быть вызван после того, как основной модуль выполнил преобразование своего имени, отсюда и использование aszPre для определения модификатора позиции HOOK_LAST .

Определение модуля

Теперь при создании определения модуля нужно беспокоиться о гораздо меньшем количестве этапов. Старое определение выглядело так

 модуль MODULE_VAR_EXPORT имя_модуля _module =
{
 STANDARD_MODULE_STUFF,
 /* инициализатор */
 /* создатель конфигурации каталога */
 /* слияние каталогов --- по умолчанию используется переопределение */
 /* конфигурация сервера */
 /* объединить конфигурацию сервера */
 /* обработчики команд */
 /* обработчики */
 /* перевод имени файла */
 /* check_user_id */
 /* проверка авторизации */
 /* проверка доступа */
 /* type_checker */
 /* исправления */
 /* регистратор */
 /* парсер заголовков */
 /* дочерняя_инициализация */
 /* дочерний_выход */
 /* отправить запрос на чтение */
}; 

Новая структура намного проще...

 модуль MODULE_VAR_EXPORT имя_модуля _module =
{
 STANDARD20_MODULE_STUFF,
 /* создание структур конфигурации для каждого каталога */
 /* объединить структуры конфигурации для каждого каталога */
 /* создание структур конфигурации для каждого сервера */
 /* объединить структуры конфигурации для каждого сервера */
 /* обработчики команд */
 /* обработчики */
 /* регистрация хуков */
}; 

Некоторые из них читаются прямо, некоторые нет. Ниже я попытаюсь обобщить то, что нужно сделать.

Этапы, которые читаются прямо через:

/* dir config creater */
/* create per-directory config structures */
/* server config */
/* create per-server config structures */
/* dir merger */
/* merge per-directory config structures */
/* merge server config */
/* merge per-server config structures */
/* command table */
/* command apr_table_t */
/* handlers */
/* handlers */

Остальные старые функции должны быть зарегистрированы как хуки. На данный момент определены следующие этапы ловушки...

ap_hook_pre_config
выполнить любую настройку, необходимую перед обработкой директив конфигурации
ap_hook_check_config
просмотрите взаимозависимости директив конфигурации
ap_hook_test_config
выполняется только с -t опцией
ap_hook_open_logs
открыть любые указанные журналы
ap_hook_post_config
здесь _init регистрируются старые подпрограммы
ap_hook_http_method
получить метод http из запроса. (наследие)
ap_hook_auth_checker
проверить, требует ли ресурс авторизации
ap_hook_access_checker
проверить ограничения для конкретных модулей
ap_hook_check_user_id
проверьте идентификатор пользователя и пароль
ap_hook_default_port
получить порт по умолчанию для сервера
ap_hook_pre_connection
выполнить любые необходимые настройки непосредственно перед обработкой, но после принятия
ap_hook_process_connection
запустить правильный протокол
ap_hook_child_init
позвоните, как только ребенок заведется
ap_hook_create_request
??
ap_hook_fixups
последний шанс изменить что-то перед созданием контента
ap_hook_handler
генерировать контент
ap_hook_header_parser
позволяет модулям просматривать заголовки, не используемые большинством модулей, потому что они используют post_read_request для этого
ap_hook_insert_filter
чтобы вставить фильтры в цепочку фильтров
ap_hook_log_transaction
логировать информацию о запросе
ap_hook_optional_fn_retrieve
получить любые функции, зарегистрированные как необязательные
ap_hook_post_read_request
вызывается после чтения запроса, перед любой другой фазой
ap_hook_quick_handler
вызывается перед обработкой любого запроса, используемого модулями кеша.
ap_hook_translate_name
перевести URI в имя файла
ap_hook_type_checker
определить и/или установить тип документа


 <         > 

Пункты:   214    215    216    217    218      219      220    221    222    223  

Рейтинг@Mail.ru