On Thu, Apr 2, 2009 at 15:44, Xiaobin <xiaobin...@gmail.com> wrote:
>
>
>
> Sorin Manolache wrote:
>>
>> On Thu, Apr 2, 2009 at 13:28, Xiaobin <xiaobin...@gmail.com> wrote:
>>>
>>> Hi, everyone.
>>>
>>> I new to modlue developemnt of the Apache http server, and I have googled
>>> this question and can't find the answer. Hope you can help me. Thx.
>>>
>>> I am confused with the order of the processing of the http request.
>>>
>>> Without the input/output filters, the order seems quick clear, when one
>>> http
>>> request comes, it will go through different kinds of hooks  like "map to
>>> storage", "fixups" and "handler". And we can set some handlers to deal
>>> with
>>> these hooks.
>>>
>>> But what's the order after the introduction of the filter mechanism?
>>>
>>> When will the input filters begin to work?
>>> After the handlers of the fixups hook has been called and before the
>>> handlers of the "handler" hook begin to work?
>>> Or in some other order?
>>> And how can we specify the order of the input filters?
>>>
>>> And for the output filters, when did they begin to work? Before or after
>>> the
>>> "log transaction" hook ?
>>> And also how can we specify the order of the output filters?
>>>
>>> Thank you very much for your help!
>>
>> There are several types of filters: network, protocol, connection,
>> resource (the list is not exhaustive, check util_filters.h in the
>> apache sources).
>>
>> The input headers of the request are read after the create_request
>> hook and before the post_read_request, quick_handler, translate_name,
>> map_to_storage, header_parser, access_checker, ..., fixups,
>> insert_filter, and handler hooks.
>>
>> The output headers of the request are written during the handler
>> execution.
>>
>> When the headers are read/written, the protocol filters are called.
>>
>> The resource input/output filters are called only when you explicitly
>> read/write the body of the request. If you add filters with the
>> SetInputFilter/SetOutputFilter directives, the filter is added in the
>> insert_filter hook. This one is called after fixups and before
>> handler. Thus, you cannot use a filter added with
>> SetInputFilter/SetOutputFilter before the handler hook.
>>
>> log_transaction is called after the request was served and the
>> response was written to the socket and the socket flushed.
>>
>> If the filters are of the same type, they are run in the order they
>> were added. If they are of different types, then I think their type
>> takes precedence, but I am not sure of that. For output filters,
>> resource filters are called before network filters.
>>
>> S
>> --
>> A: Because it reverses the logical flow of conversation.
>> Q: Why is top-posting frowned upon?
>> A: Top-posting.
>> Q: What is the most annoying thing in e-mail?
>>
>>
>
>
> Thank you very much!
>
> So, the resouce/content input filter will be called after fixups hook and
> before
> handler hook, is this right?

No. They are run _after_ the fixup hook. They are invoked _from_ (not
before) the handler hook. In the handler you call ap_get_brigade and
it is this call that invokes the input filters.

Remember that the filters are not automatically invoked. You need to
call ap_get_brigade to call the input filters and ap_pass_brigade to
call the output filters. So simply adding a filter in translate_name
will not read anything.

If, for example, you don't care about the body of the POST request and
you don't call ap_get_brigade from the handler, the input filters are
not called, even if they are present.

> If this is right, is it possible to make the input filter run earlier? Like
> after the translate_name hook and before the map_to_storage hook?

Yes, it is possible. You hook the translate_name or the map_to_storage
hook. In your callback you call ap_add_input_filter, you do what you
want, and then you remove the filters. If you do not remove them,
insert_filter in ap_invoke_handler (which is called after fixups) will
add them a second time and then chances are that you won't get what
you want.

> And I am not so understand about this part:
>  "Thus, you cannot use a filter added with SetInputFilter/SetOutputFilter
> before the handler hook."
>
> Do you mean that in the httpd.conf file, the SetHandler instruction should
> be set before the SetInputFilter/SetOutputFilter instructions ?

No. It means that code that is run before the handler hook works in
the _absence_ of the filters. The filters are added just before the
handler hook. Only the handler hook will benefit of the presence of
the filters.

S

-- 
A: Because it reverses the logical flow of conversation.
Q: Why is top-posting frowned upon?
A: Top-posting.
Q: What is the most annoying thing in e-mail?

Reply via email to