On Tue, Dec 2, 2008 at 10:58, Ashish Khare <[EMAIL PROTECTED]> wrote:
> Hi,
>
> I have tried with this option AP_FTYPE_PROTOCOL.
> But my input filter is not called.
> But when I change the type to AP_FTYPE_RESOURCE, my filter did get called
> but no header.
>
> I have checked the Apache code where following modules filters are
> registered with this option.
>
> ap_register_input_filter("HTTP_IN", ap_http_filter,NULL, AP_FTYPE_PROTOCOL);
> ap_register_input_filter  (ssl_io_buffer, ssl_io_filter_buffer, NULL,
> AP_FTYPE_PROTOCOL - 1);
> ap_register_input_filter("NET_TIME", net_time_filter, NULL,
> AP_FTYPE_PROTOCOL);
>
>
> Please find my code snippet below to check if I am doing correct or not.
> Let me know if I am doing correct or not.

Hello,

The apache2 call sequence is:

ap_process_http_connection->ap_read_request->create_request callbacks

->ap_get_mime_headers_core

->ap_process_request->insert_filter callbacks

As you see, ap_get_mime_headers_core is called before the
insert_filter callbacks. Thus, the headers are consumed by
ap_http_filter and they do not reach your filter.

Instead of calling ap_add_input_filter_handle from a insert_filter
callback, call it from a create_request callback. Thus, it will be
called before ap_http_filter.

I've attached the code.

S

>
> code snippet
> ============
>
> module AP_MODULE_DECLARE_DATA input_module = {
>  STANDARD20_MODULE_STUFF,
>  NULL,                         /* module initializer                  */
>  NULL,                         /* create per-dir    config structures */
>  NULL,                         /* merge  per-dir    config structures */
>  NULL,                         /* create per-server config structures */
>  my_table,            /* merge  per-server config structures */
>  mod_my_register_hooks,
> };
>
> static ap_filter_rec_t * globalInputFilter;
>
> static void
> mod_my_register_hooks (apr_pool_t * p)
> {
>  ap_hook_child_init (my_child_init, NULL, NULL, APR_HOOK_MIDDLE);
>  ap_hook_insert_filter(my_insertfilter , NULL, NULL, APR_HOOK_MIDDLE);
>  globalInputFilter= ap_register_input_filter("MY_READ_INPUT",
> my_input_filter ,NULL, AP_FTYPE_PROTOCOL );
> };
>
> static void my_insertfilter (request_rec * r)
> {
>   ReqRspCtx *ctx;
>   ctx = (ReqRspCtx *)apr_palloc(r->pool,sizeof(ReqRspCtx));
>   ap_add_input_filter_handle ( globalInputFilter, (void *)ctx, r,
> r->connection);
> }
>
> static apr_status_t my_input_filter (ap_filter_t * f, apr_bucket_brigade *
> bb,
>                                     ap_input_mode_t mode,apr_read_type_e
> block,
>                                     apr_off_t readbytes)
> {
> //Function Body.
> }
>
>
>
> Regards,
> Ashish
>
>
> On Tue, Dec 2, 2008 at 2:50 PM, Sorin Manolache <[EMAIL PROTECTED]> wrote:
>
>> On Tue, Dec 2, 2008 at 10:12, Ashish Khare <[EMAIL PROTECTED]> wrote:
>> > Hi Ryan,
>> >
>> > I need to access header in the input filter.
>> >
>> > I means all the unparsed data sent by the client in the request which
>> > contains header information also.
>> >
>> > Please let me know how to do this.
>> >
>> > I have tried implementing the input filter but ap_get_brigade() call
>> returns
>> > empty brigade, which means it is returning only body and no headers.
>> >
>> > But i want to access header data.
>> >
>> > Please help me in this.
>> >
>>
>> Make your filter of type AP_FTYPE_PROTOCOL.
>>
>> S
>>
>
#include <httpd.h>
#include <http_config.h>
#include <http_request.h>
#include <util_filter.h>
#include <http_log.h>

static ap_filter_rec_t * globalInputFilter;

static int
my_insertfilter(request_rec * r) {
  ap_add_input_filter_handle(globalInputFilter, NULL, r, r->connection);
  return OK;
}

static int
read_brigade(apr_bucket_brigade *bb, request_rec *req) {
  apr_bucket *e;
  const char *data;
  apr_size_t len;
  for (e = APR_BRIGADE_FIRST(bb); e != APR_BRIGADE_SENTINEL(bb); e = APR_BUCKET_NEXT(e)) {
    if (APR_BUCKET_IS_EOS(e))
      return 1;
    if (APR_BUCKET_IS_METADATA(e))
      continue;
    apr_bucket_read(e, &data, &len, APR_BLOCK_READ);
    ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, req, "%s", data);
  }
  return 0;
}

static apr_status_t
my_input_filter(ap_filter_t * f, apr_bucket_brigade *bb,
		ap_input_mode_t mode, apr_read_type_e block,
		apr_off_t readbytes) {
  ap_get_brigade(f->next, bb, mode, block, readbytes);
  ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, f->r, "In input filter");
  read_brigade(bb, f->r);
  return APR_SUCCESS;
}


static void
mod_my_register_hooks(apr_pool_t * p) {
  ap_hook_create_request(my_insertfilter, NULL, NULL, APR_HOOK_MIDDLE);
  globalInputFilter = ap_register_input_filter("MY_READ_INPUT", my_input_filter, NULL, AP_FTYPE_PROTOCOL);
}

module AP_MODULE_DECLARE_DATA input_module = {
  STANDARD20_MODULE_STUFF,
  NULL,                         /* module initializer                  */
  NULL,                         /* create per-dir    config structures */
  NULL,                         /* merge  per-dir    config structures */
  NULL,                         /* create per-server config structures */
  NULL,                         /* merge  per-server config structures */
  mod_my_register_hooks,
};

Reply via email to