Handling large POST data in nginx module

Mapper Uno lists at ruby-forum.com
Sun Mar 30 10:20:30 UTC 2014


Hi,

I wrote an nginx module that handles POST data and returns back the same
(something similar to echo_read_request_body  in echo module) however,
in echo module the input buffer is passed as is to output buffer.
However, in my case, I need to copy the incoming buffer and then process
it and then send it back to client.

What I am seeing in my POST handler routine is, the incoming request
size is 1377344 bytes. However, the file I am sending via curl command
is 1420448 bytes. Where could I be losing the rest of the bytes.
Moreover the curl command on client hangs for a while and eventually
returns 18 error code.

Here is my POST handler code

-------------------------
static void ngx_my_post_handler(ngx_http_request_t *r)
{
    ngx_chain_t *cl, *in = r->request_body->bufs;
    ngx_buf_t *b;

    for (cl = in; cl; count++, cl=cl->next)
    {
        b = cl->buf;
  if (!ngx_buf_in_memory(b)) {
            if (b->in_file) {
                ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log,
0,
                               " What to do here ??????");
                return;
            }

        } else {
        in_count++;
            in_sz += b->last - b->pos;
        }
    }

    u_char *out_data = (unsigned char *)ngx_pcalloc(r->pool, in_sz);

    // Copy incoming data to outgoing data buffer
    for (cl = in; cl; count++, cl = cl->next) {
        b = cl->buf;

        if (ngx_buf_in_memory(b)) {
            out_data = ngx_copy(out_data, b->pos, b->last - b->pos);
        }
    }

    // Allocate response buffer and fill it out
    b = (ngx_buf_t *) ngx_pcalloc(r->pool, sizeof (ngx_buf_t));
    if (b == NULL)
        return;

    b->pos = out_data;
    b->last = out_data + out_len;
    b->memory = 1;
    b->last_buf = 1;
    b->last_in_chain = 1;

    out_chain.buf = b;
    out_chain.next = NULL;

    // Setup HTTP response headers
    r->headers_out.status = NGX_HTTP_OK;
    r->headers_out.content_length_n = out_len;
    r->headers_out.content_type.len = sizeof ("text/html") - 1;
    r->headers_out.content_type.data = (u_char *) "text/html";

    ngx_http_send_header(r);
    ngx_http_output_filter(r, &out_chain);
}

-- 
Posted via http://www.ruby-forum.com/.



More information about the nginx mailing list