Welcome! Log In Create A New Profile

Advanced

Re: module which handles POST request help

Maxim Dounin
September 18, 2023 08:46PM
Hello!

On Mon, Sep 18, 2023 at 09:27:36AM -0600, Ben Mesander via nginx wrote:

> I'm working on an nginx module which will handle POST requests. I've never
> written an nginx module before, but I have worked on apache modules. My
> goal is to have it do unbuffered reads and process the data being posted as
> it arrives. Initially, I'm doing just a simple blocking read of the POST
> body. I've simplified things down almost to the "hello world" level.
>
> When I do a POST, my module gets called, but I get a 404 not found, I am
> not sure why. I do see the file I post being uploaded and stored in a file
> in the nginx temporary file area. I do not see an entry in the access log
> showing the POST, again I am not sure why. How can I fix these things?
>
> Source to my module:
> https://github.com/benmesander/ngx-dashll-module/tree/main

In no particular order:

Your module registers an access phase handler, which means it is
to either accept or reject requests for later processing with
other handlers. Unless you do something to handle the request,
the 404 response code is the most expected one, and likely the
reason why you are getting 404 response.

Your module fails to properly account for request reference
counting as needed during request body reading: you fail to call
ngx_http_finalize_request() after calling
ngx_http_read_client_request_body() during phase processing before
the content phase. Due to reference count leak the request will
hang during termination, waiting for the
ngx_http_finalize_request() call (which will never happen).
That's why you are not seeing the request in the access log - the
request is still running.

Also, your module fails to properly restore phase processing after
you've stopped it to read the request body: in addition to calling
ngx_http_core_run_phases() you have to restore
r->write_event_handler, since it can be overwritten during request
body reading.

In general, if you want to read the request body during the
access phase, consider looking into the mirror module request body
handling:

http://hg.nginx.org/nginx/file/tip/src/http/modules/ngx_http_mirror_module.c#l104

If you actually want to handle such requests yourself,
consider instead using a content handler. In a content handler
request finalization happens automatically, and there is no need
to recover phase processing, so reading the request body is more
or less trivial. An example code can be seen in the development
guide:

http://nginx.org/en/docs/dev/development_guide.html#http_request_body

Hope this helps.

--
Maxim Dounin
http://mdounin.ru/
_______________________________________________
nginx mailing list
nginx@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx
Subject Author Posted

module which handles POST request help

Ben Mesander via nginx September 18, 2023 11:28AM

Re: module which handles POST request help

Maxim Dounin September 18, 2023 08:46PM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 230
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready