Thank you for the quick reply !
The context is what I am looking into right now, and It is indeed a
right solution to my original question. I just want to know a little bit
more detail if you do not mind, you said:
"I typically destroy it by placing a callback in the cleanup hook of the
req->pool. "
What exactly is the callback function that I need to look for ? When it
executes, can we be sure that all the data has been processed, and our
ctx will be maintained at that state ?
Best, Vu
On 03/12/2013 10:36 AM, Sorin Manolache wrote:
On 2013-03-12 10:16, Hoang-Vu Dang wrote:
Hi all,
When I write an input_filter, I notice that the data sent from client is
not always available in one chunk if it's large.
In other words, The input_filter() function will be called multiple
times per request. My question is how to have a control on this (for
example the size of the chunk until it breaks in to two) ? what should
we look into in order to check if the two filters are called from the
same request.
You can keep the state from one filter invokation to the other in
f->ctx, the filter's context.
There are many ways to do this.
One way I've seen is to check if f->ctx is NULL (if it was NULL then
it would mean that it is the first invokation of the filter). If it's
NULL, we build the context. Subsequent invokations have the context !=
NULL. You'll have to destroy the context at the end of the request. I
typically destroy it by placing a callback in the cleanup hook of the
req->pool.
Another way to destroy it, but in my opinion a wrong way, is to
destroy it when you encounter EOS in the data processed by the filter.
I'd say it's wrong because a wrongly written filter could send data
_after_ an EOS bucket and then you could not distinguish between a new
request and a request sending data after EOS.
Another way to initialize the context is by placing a filter init
function when you declare the filter and to initialize the context in
this function. This is more elegant in my opinion, because the context
is already initialized when the filter is called the first time.
The filter context could be any structure, so you can track the filter
processing state in it.
Regards,
Sorin