ngx_http_read_client_request_body() and ACCESS_PHASE handler

Srebrenko Šehić ssehic at gmail.com
Thu Apr 22 18:19:19 MSD 2010


Hi list,

I am trying to get a module working that can read a POST payload from
the client, have a look at it, and pass it on (unchanged) to the
upstream.

Below is the a sample code I wrote for testing purposes. The code
works as desired for very small POST payloads and with Firefox only.
It doesn't work (even for small payloads) in any other major browser I
tried. The reason for that is that FF sends the POST payload in the
same TCP packet as the HTTP headers - while other browser apparently
send at least 2 packets.

Return code from call to ngx_http_read_client_request_body() is
NGX_AGAIN for non-FF browsers.

What am I doing wrong here?

/usr/local/sbin/nginx -V
nginx version: nginx/0.8.35
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx
--conf-path=/etc/nginx/nginx.conf --sbin-path=/usr/local/sbin/nginx
--pid-path=/var/run/nginx.pid --lock-path=/var/nginx/tmp/nginx.lock
--http-client-body-temp-path=/var/nginx/tmp/client_body_temp
--http-proxy-temp-path=/var/nginx/tmp/proxy_temp
--http-fastcgi-temp-path=/var/nginx/tmp/fastcgi_temp
--http-log-path=/var/log/nginx/access.log
--error-log-path=/var/log/nginx/error.log --user=_nginx --group=_nginx
--with-http_ssl_module --with-http_stub_status_module --with-debug
--with-ipv6 --with-http_perl_module --with-http_sub_module
--add-module=/home/ssehic/dummy

#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_http.h>

static ngx_int_t ngx_http_dummy_init(ngx_conf_t *cf);

static ngx_http_module_t  ngx_http_dummy_module_ctx = {
    NULL,                                  /* preconfiguration */
    ngx_http_dummy_init,           /* postconfiguration */
    NULL,                                  /* create main configuration */
    NULL,                                  /* init main configuration */
    NULL,                                  /* create server configuration */
    NULL,                                  /* merge server configuration */
    NULL,                                  /* create location configuration */
    NULL                                   /* merge location configuration */
};


ngx_module_t  ngx_http_dummy_module = {
    NGX_MODULE_V1,
    &ngx_http_dummy_module_ctx,            /* module context */
    NULL,                                  /* 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_dummy_access_handler(ngx_http_request_t *r);

void
ngx_http_dummy_payload_handler(ngx_http_request_t *r)
{
    ngx_http_finalize_request(r, NGX_DONE);
}

static ngx_int_t
ngx_http_dummy_access_handler(ngx_http_request_t *r)
{
    if (r->method != NGX_HTTP_POST) {
        return NGX_OK;
    }

    return ngx_http_read_client_request_body(r, ngx_http_dummy_payload_handler);
}

static ngx_int_t
ngx_http_dummy_init(ngx_conf_t *cf)
{
    ngx_http_handler_pt        *h;
    ngx_http_core_main_conf_t  *cmcf;

    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);

    h = ngx_array_push(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers);
    if (h == NULL) {
        return NGX_ERROR;
    }

    *h = ngx_http_dummy_access_handler;

    return NGX_OK;
}



More information about the nginx-devel mailing list