Apache Версия 2.0 Сервера HTTP
это - сокращение 'n работа пасты от электронной почты (<022501c1c529$f63a9550$7f00000a@KOJ>) и только переформатированный для лучшей удобочитаемости. Это не современно, но может быть хорошее начало для дальнейшего исследования.
есть три основных типа фильтра (каждый из них фактически разломан вниз в две категории, но это прибывает позже).
CONNECTION
AP_FTYPE_CONNECTION
,
AP_FTYPE_NETWORK
)
PROTOCOL
AP_FTYPE_PROTOCOL
,
AP_FTYPE_TRANSCODE
)
RESOURCE
PROTOCOL
, но внутренний переадресовывает, и подзапросы могут изменить содержание, не заканчивая запрос. (
AP_FTYPE_RESOURCE
,
AP_FTYPE_CONTENT_SET
)
важно сделать различие между протоколом и фильтром ресурса. Фильтр ресурса привязан к определенному ресурсу, это может также быть привязано к информации удара головой, но главное закрепление к ресурсу. Если Вы пишете фильтр, и Вы хотите знать, является ли это ресурс или протокол, правильный вопрос, чтобы спросить: "это может проникнуть быть удаленным, если запрос переадресован к различному ресурсу?" Если ответ да, то это - фильтр ресурса. Если это - не, то это наиболее вероятно фильтр связи или протокол. Я не буду входить в фильтры связи, потому что они, кажется, хорошо поняты. С этим определением, могли бы помочь несколько примеров:
дальнейшее расстройство каждой категории еще в два типа фильтра - строго для заказа. Мы могли удалить это, и только учесть один тип фильтра, но заказ будет иметь тенденцию быть неправильным, и мы должны были бы рубить вещи, чтобы заставить это работать. В настоящее время,
RESOURCE
фильтры только имеют один тип фильтра, но это должно измениться.
это фактически довольно просто в теории, но кодекс сложен. Прежде всего, важно, что каждый понимает, что есть три списка фильтра для каждого запроса, но они все связаны вместе. Так, первый список
r->output_filters
, тогда
r->proto_output_filters
, и наконец
r->connection->output_filters
. они соответствуют
RESOURCE
,
PROTOCOL
, и
CONNECTION
фильтры соответственно. Проблема предварительно, был то, что мы использовали отдельно связанный список, чтобы создать стек фильтра, и мы начали с "правильного" местоположения. Это означает это, если я имел a
RESOURCE
фильтр на стеке, и я добавил a
CONNECTION
фильтр,
CONNECTION
фильтр игнорировался бы. Это должно иметь смысл, потому что мы вставили бы фильтр связи наверху
c->output_filters
список, но конец
r->output_filters
указанный фильтр, который имел обыкновение быть впереди
c->output_filters
. это очевидно неправильно. Новый кодекс вставки использует вдвойне связанный список. Это имеет преимущество, что мы никогда не теряем фильтр, который был вставлен. К сожалению, это идет с отдельным набором головных болей.
проблема состоит в том, что мы имеем два различных случая, были, мы используем подзапросы. Первое должно вставить больше данных в ответ. Второе должно заменить существующий ответ внутренним, переадресовывают. Они - два различных случая и нужно рассмотреться также.
в первом случае, мы создаем подзапрос изнутри тренера или фильтра. Это означает, что к следующему фильтру нужно передать
make_sub_request
функция, и последний ресурс просачиваются, подзапрос укажет на следующий фильтр, в основном просят. Это имеет смысл, потому что данные подзапроса должны течь через тот же самый набор фильтров как главный запрос. Графическое представление могло бы помочь:
Default_handler --> includes_filter --> byterange --> ...
если включает фильтр, создает запрос sub, то мы не хотим данные от того подзапроса пройти, включает фильтр, потому что это не могли бы быть данные ПЕРВОЙ СТЕПЕНИ ИНТЕГРАЦИИ. Так, подзапрос добавляет следующее:
Default_handler --> includes_filter -/-> byterange --> ... / Default_handler --> sub_request_core
что случается, является ли подзапрос данные ПЕРВОЙ СТЕПЕНИ ИНТЕГРАЦИИ? Хорошо, это легко,
includes_filter
является фильтром ресурса, таким образом это будет добавлено к запросу sub между
Default_handler
и
sub_request_core
фильтр.
второй случай для подзапросов - то, когда один подзапрос собирается становиться реальным запросом. Это случается всякий раз, когда подзапрос создан вне тренера, или фильтр, и ПУСТОЙ передают как следующий фильтр к
make_sub_request
функция.
в этом случае, фильтры ресурса больше не имеют смысл для нового запроса, потому что ресурс изменился. Так, вместо того, чтобы начинаться на пустом месте, мы просто указываем фронт фильтров ресурса для подзапроса на фронт фильтров протокола для старого запроса. Это означает, что мы не будем терять ни одного из фильтров протокола, и при этом мы не будем пробовать послать эти данные через фильтр, который не должен видеть это.
проблема состоит в том, что мы используем вдвойне-связанный список для наших стеков фильтра теперь. Но, Вы должны заметить, что это возможно для двух списков пересечься в этой модели. Так, Вы делаете Вы обращаетесь с предыдущим указателем? Это - очень трудный вопрос, чтобы ответить, потому что нет никакого "правильного" ответа, любой метод одинаково действителен. Я смотрел на то, почему мы используем предыдущий указатель. Единственная причина для этого состоит в том, чтобы учесть более легкое дополнение новых серверов. С этим сказанный, решение, которое я выбрал, состояло в том, чтобы заставить предыдущий указатель всегда остаться на оригинальном запросе.
это вызывает немного более сложной логики, но это работает для всех случаев. Мое беспокойство в наличии этого перемещается в подзапрос, - то, что для большего количества общего падежа (где подзапрос используется, чтобы добавить данные к ответу), главная цепь фильтра была бы неправильной. Это не походило на хорошую идею мне.
заключительная тема. :-) Mod_Asis - что - то вроде, рубят, но тренер должен удалить все фильтры за исключением фильтров связи, и послать данные. Если Вы используете
mod_asis
, все другие ставки выключены.
абсолютно последний пункт - то, что причина, которую этот кодекс был настолько трудно понять правильно, был то, потому что мы рубили так много, чтобы вынудить это работать. Я написал большинство рубления первоначально, таким образом я очень виноват. Однако, теперь, когда кодекс правилен, я начал удалять, некоторые рубят. Большинство людей должно было видеть что
reset_filters
и
add_required_filters
функции ушли. Те вставленные фильтры уровня протокола для ошибочных условий, фактически, обе функции сделали ту же самую вещь, один за другим, это было действительно странно. Поскольку мы не теряем фильтры протокола для ошибочных случаев больше, те рубят, ушел.
HTTP_HEADER
,
Content-length
, и
Byterange
фильтры все включены
insert_filters
фаза, потому что, если они были добавлены ранее, мы имели немного интересных взаимодействий. Теперь, те могли все быть перемещены, чтобы быть вставленными с
HTTP_IN
,
CORE
, и
CORE_IN
фильтры. Это сделало бы кодекс легче следовать.