2012-06-19 13 views
5

He estado codificando un módulo de filtro NGINX que puede leer/escribir cookies para solicitudes entrantes. Si una cookie en particular no está configurada correctamente (es decir, una cookie de autenticación), establecerá el estado del encabezado saliente en el código de error apropiado. Esto funciona bien según las instrucciones de Evan Miller's tutorial. La siguiente parte que estoy tratando de poner en práctica (y no hasta ahora) es hacer que se invoque el filtro corporal para poder insertar/reemplazar el texto de respuesta del cuerpo cuando se encuentran respuestas de error. De nuevo, seguí Evan Miller's tutorial en los filtros del cuerpo, y no puedo por mi vida hacer que esto funcione. Aquí está mi configuración:Módulos de filtro de cabecera y cuerpo NGINX

static ngx_http_output_header_filter_pt ngx_http_next_header_filter; 
static ngx_http_output_body_filter_pt ngx_http_next_body_filter; 
... 
... 


static ngx_http_module_t ngx_http_source_cookie_module_ctx = { 
    NULL,        /* preconfiguration */ 
    ngx_http_source_cookie_init,    /* postconfiguration */ 

    NULL,        /* create main configuration */ 
    NULL,        /* init main configuration */ 

    NULL,        /* create server configuration */ 
    NULL,        /* merge server configuration */ 

    ngx_http_source_cookie_create_loc_conf, /* create location configuration */ 
    ngx_http_source_cookie_merge_loc_conf /* merge location configuration */ 
}; 

ngx_module_t ngx_http_source_cookie_module = { 
    NGX_MODULE_V1, 
    &ngx_http_source_cookie_module_ctx,  /* module context */ 
    ngx_http_source_cookie_commands,   /* module directives */ 
    NGX_HTTP_MODULE,     /* module type */ 
    NULL,        /* init master */ 
    NULL,        /* init module */ 
    NULL,        /* init process */ 
    NULL,        /* init thread */ 
    NULL,        /* exit thread */ 
    NULL,        /* exit process */ 
    NULL,        /* exit master */ 
    NGX_MODULE_V1_PADDING 
}; 
/*--------------------------------------------------------------------------*/ 

/*--------------------------------------------------------------------------*/ 
static ngx_int_t 
ngx_http_source_cookie_header_filter(ngx_http_request_t *r) 
{ 
    // this gets invoked 
    ... 
} 

/*--------------------------------------------------------------------------*/ 

/*--------------------------------------------------------------------------*/ 
static ngx_int_t 
ngx_http_body_filter(ngx_http_request_t *r, ngx_chain_t *in) 
{ 
    // this never get invoked 
    ... 
} 

/*--------------------------------------------------------------------------*/ 

/*--------------------------------------------------------------------------*/ 
static ngx_int_t 
ngx_http_source_cookie_init(ngx_conf_t *cf) 
{ 
    // registering of my filters 

    ngx_http_next_header_filter = ngx_http_top_header_filter; 
    ngx_http_top_header_filter = ngx_http_source_cookie_header_filter; 

    ngx_http_next_body_filter = ngx_http_top_body_filter; 
    ngx_http_top_body_filter = ngx_http_body_filter; 

    return NGX_OK; 
} 

Esta es mi configuración básica, y por lo que puedo decir, que es puesto en todos los ejemplos/tutoriales que he encontrado. Me pregunto si hay algo completamente diferente que deba habilitar ... como una opción de configuración NGINX, la opción de compilación NGINX ./configure, etc.

Cualquier ayuda es muy apreciada.

+0

¿Cuál es la versión de NGINX que está utilizando? ¿Qué parámetros ./configure usaste? Tuve un problema similar al tratar de ejecutar un módulo de filtro de cuerpo con la versión estable, luego probé con la versión dev (1.3.5) y funcionó (no sé por qué). – Alex

Respuesta

0

Noto que Evan no arregla la longitud del contenido http en ngx_http_<module_name>_header_filter().

Si no agrego la longitud del contenido http (r->headers_out.content_length_n), el texto insertado hasta el final de la solicitud no se generará desde nginx-1.2.7 estable.

También puede ver footer filter module.