If it matters, I’m using Nginx 1.23.3 and NJS 0.7.10

--
Lance Dockins

On Feb 10, 2023 at 8:24 PM -0600, Lance Dockins <la...@wordkeeper.com>, wrote:
> NJS seems to be throwing an error when trying to access the temp body file 
> created for POST bodies that are larger than the client body buffer size.
>
> I've verified that Nginx and NJS have access to this folder location.  As a 
> test, I placed a permanent file in the body temp folder location and can read 
> from that file without an issue in NJS code.  But if I grab the full path to 
> the temp body file from Nginx and then try to read that file's contents, NJS 
> throws an error indicating that the file doesn't exist.
>
> Here's a code sample:
> let body = '';
> if(!r.variables.request_body_file){
> > quote_type
> > body = r.requestText;
> }
> else{
> > quote_type
> > log.write(logpath, r.variables.request_body_file, r);
> > let fs = require('fs');
> > body = fs.readFileSync(r.variables.request_body_file);
> }
>
> The log.write call is a utility function that just allows me to log the 
> contents of the variable in the sample.  In this code, 
> r.variables.request_body_file logs a full file path to the temp file for the 
> POST body.  Something like this:
> /var/lib/nginx/body/0000000128
>
> But trying to access and read that file immediately following that yields an 
> error:
> 2023/02/10 20:14:05 [error] 609307#609307: *1555 js exception: Error: No such 
> file or directory
>     at fs.readFileSync (native)
>
> Again, it's not a permissions issue as a permanent test file exists in the 
> same folder and is readable in the same code block without an issue.
>
> This code is currently inside of a js_content filter.  Since js_content runs 
> very late in the process, the temp file seems like it "should" still be in 
> place.  After all, reading r.requestText works just fine.  The only time the 
> problem surfaces is when the client body exceeds the buffer size (even if the 
> buffer size is high) as that's where file access has to occur.  Since the 
> POST bodies can sometimes be very large in this particular route, it's not 
> really a viable option to try to match the client body buffer size to the 
> client body max size.  So being able to access and read the POST body temp 
> file is important since there are bound to be situations where a request 
> crosses beyond the buffer size regardless of how high it goes (not that 
> higher is necessarily always a good idea).
>
> This sort of NJS behavior "seems" like some sort of race condition where NJS 
> is trying to access the file after Nginx has already disposed of it.  Since 
> this is a js_content directive, it should be blocking and it seems to be one 
> of the few stages where access to the POST body is even possible.  So it's 
> unclear why the client body buffer file wouldn't exist at the time that this 
> code runs.
>
> Is this a bug in NJS?  Or is there some sort of alternative solution (e.g. 
> settings adjustment in Nginx itself) that might resolve the problem?
>
> Thanks in advance for any insights.
>
>
> --
> Lance Dockins
>
_______________________________________________
nginx mailing list
nginx@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx

Reply via email to