processing request body in files

Maxim Dounin mdounin at
Fri Aug 8 16:42:41 UTC 2014


On Fri, Aug 08, 2014 at 10:44:59AM -0400, Jeff Kaufman wrote:

> In ngx_pagespeed we want to handle POSTs, processing them in our nginx
> module and performing an action.  This works fine for small POSTs, but
> if they're too big then r->request_body->temp_file is set and the data
> isn't available in memory.  Right now we just log an error, but I'd
> like to fix this.
> To read from that file, is it safe to just call
> ngx_open_tempfile(r->request_body->temp_file->, ...) and then
> ngx_read_file() until that returns 0 for EOF (like standard unix) or
> an error?  Or is there something more complex we need to do?
> (I've looked for existing modules that do this, but haven't found any.
> I'm not finding any modules that currently do that; just ones that
> issue a rename command to move r->request_body->temp_file into the
> final destination.)

The modules which read request body from a file don't do this via 
a file name (in most cases, there is no name at all, as temporary 
files are unlink()'ed after they are open), but rather through 
already opened file descriptor.  E.g., upstream does this (using 
output chain) to send a request body to a backend server.

In either case, reading temporary files might be suboptimal - you 
may consider using request body filters instead, an experimental 
patch can be found, e.g., here:

Maxim Dounin

More information about the nginx-devel mailing list