<-
Apache > HTTP Server > Documentation > Version 2.0 > Developer Documentation

как фильтры работают в Apacheе 2.0

предупреждение

это - сокращение 'n работа пасты от электронной почты (<022501c1c529$f63a9550$7f00000a@KOJ>) и только переформатированный для лучшей удобочитаемости. Это не современно, но может быть хорошее начало для дальнейшего исследования.

top

Filter Types

есть три основных типа фильтра (каждый из них фактически разломан вниз в две категории, но это прибывает позже).

CONNECTION
фильтры этого типа действительны для целой жизни этой связи. ( AP_FTYPE_CONNECTION , AP_FTYPE_NETWORK )
PROTOCOL
фильтры этого типа действительны для целой жизни этого запроса с точки зрения клиента, это означает, что запрос действителен со времени, когда запрос посылают до времени, когда ответ получен. ( AP_FTYPE_PROTOCOL , AP_FTYPE_TRANSCODE )
RESOURCE
фильтры этого типа действительны в течение времени, когда это содержание используется, чтобы удовлетворить запрос. Для простых запросов, это идентично PROTOCOL , но внутренний переадресовывает, и подзапросы могут изменить содержание, не заканчивая запрос. ( AP_FTYPE_RESOURCE , AP_FTYPE_CONTENT_SET )

важно сделать различие между протоколом и фильтром ресурса. Фильтр ресурса привязан к определенному ресурсу, это может также быть привязано к информации удара головой, но главное закрепление к ресурсу. Если Вы пишете фильтр, и Вы хотите знать, является ли это ресурс или протокол, правильный вопрос, чтобы спросить: "это может проникнуть быть удаленным, если запрос переадресован к различному ресурсу?" Если ответ да, то это - фильтр ресурса. Если это - не, то это наиболее вероятно фильтр связи или протокол. Я не буду входить в фильтры связи, потому что они, кажется, хорошо поняты. С этим определением, могли бы помочь несколько примеров:

Byterange
мы закодировали это, чтобы быть вставленными для всех запросов, и это удалено если не используемый. Поскольку этот фильтр активен в начале всех запросов, это не может быть удалено, если это переадресовано, таким образом это - фильтр протокола.
http_header
этот фильтр фактически пишет удары головой сети. Это - очевидно необходимый фильтр (кроме в как есть случай, который является особенным и будет иметься дело с ниже), и таким образом это - фильтр протокола.
выкачать
администратор формирует этот фильтр, основанный, на котором требовали файл. Если мы делаем внутреннее переадресовывает от страницы автоиндекса до index.html страница, выкачивающийся фильтр может быть добавлен или удален основанный на config, таким образом это - фильтр ресурса.

дальнейшее расстройство каждой категории еще в два типа фильтра - строго для заказа. Мы могли удалить это, и только учесть один тип фильтра, но заказ будет иметь тенденцию быть неправильным, и мы должны были бы рубить вещи, чтобы заставить это работать. В настоящее время, RESOURCE фильтры только имеют один тип фильтра, но это должно измениться.

top

How are filters inserted?

это фактически довольно просто в теории, но кодекс сложен. Прежде всего, важно, что каждый понимает, что есть три списка фильтра для каждого запроса, но они все связаны вместе. Так, первый список 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 функция.

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

проблема состоит в том, что мы используем вдвойне-связанный список для наших стеков фильтра теперь. Но, Вы должны заметить, что это возможно для двух списков пересечься в этой модели. Так, Вы делаете Вы обращаетесь с предыдущим указателем? Это - очень трудный вопрос, чтобы ответить, потому что нет никакого "правильного" ответа, любой метод одинаково действителен. Я смотрел на то, почему мы используем предыдущий указатель. Единственная причина для этого состоит в том, чтобы учесть более легкое дополнение новых серверов. С этим сказанный, решение, которое я выбрал, состояло в том, чтобы заставить предыдущий указатель всегда остаться на оригинальном запросе.

это вызывает немного более сложной логики, но это работает для всех случаев. Мое беспокойство в наличии этого перемещается в подзапрос, - то, что для большего количества общего падежа (где подзапрос используется, чтобы добавить данные к ответу), главная цепь фильтра была бы неправильной. Это не походило на хорошую идею мне.

top

Asis

заключительная тема. :-) Mod_Asis - что - то вроде, рубят, но тренер должен удалить все фильтры за исключением фильтров связи, и послать данные. Если Вы используете mod_asis , все другие ставки выключены.

top

Explanations

абсолютно последний пункт - то, что причина, которую этот кодекс был настолько трудно понять правильно, был то, потому что мы рубили так много, чтобы вынудить это работать. Я написал большинство рубления первоначально, таким образом я очень виноват. Однако, теперь, когда кодекс правилен, я начал удалять, некоторые рубят. Большинство людей должно было видеть что reset_filters и add_required_filters функции ушли. Те вставленные фильтры уровня протокола для ошибочных условий, фактически, обе функции сделали ту же самую вещь, один за другим, это было действительно странно. Поскольку мы не теряем фильтры протокола для ошибочных случаев больше, те рубят, ушел. HTTP_HEADER , Content-length , и Byterange фильтры все включены insert_filters фаза, потому что, если они были добавлены ранее, мы имели немного интересных взаимодействий. Теперь, те могли все быть перемещены, чтобы быть вставленными с HTTP_IN , CORE , и CORE_IN фильтры. Это сделало бы кодекс легче следовать.