Hello! On Tue, Nov 09, 2021 at 06:40:01PM -0500, frdcybermatrix wrote:
> Hi I'm having problem with my custom nginx module. > I created nginx module to detect wether the request is authorized or not, > and I need to check request body. So I use ngx_http_read_client_request_body > in NGX_HTTP_ACCESS_PHASE. > Modules work perfectly on one request at a time. For example: 'curl -v > localhost' > But the problem happen when second request happen using same connection. For > example: 'curl -v localhost localhost'. > > When I try to debug I got "http reading blocked". But when I remove > ngx_http_read_client_request_body, and leave body empty, it's work > > static ngx_int_t > ngx_http_ai_inspect_handler(ngx_http_request_t *r) > { > ngx_chain_t *in; > ngx_http_read_client_request_body(r, ngx_http_ai_inspect_post_handler); > off_t len = 0; > if (r->request_body != NULL) { > for (in = r->request_body->bufs; in; in = in->next) { > len += ngx_buf_size(in->buf); > } > } > > } First of all, it is not correct to use the request body after the ngx_http_read_client_request_body() call: the request body might not be available yet at this point. Instead, you should wait till the post handler is called, and only use the body after it's called. See the development guide for details: http://nginx.org/en/docs/dev/development_guide.html#http_request_body Second, when you are reading the request body from phase handlers, there are additional things to consider. In particular: - Things to do after the ngx_http_read_client_request_body() might differ from what one normally does in content handler, notably you'll have to call ngx_http_finalize_request(NGX_DONE) yourself; - It is important to restore phase processing after the request body is read and you've done with it, so you'll have to set r->write_event_handler back to ngx_http_core_run_phases in the post handler and run ngx_http_core_run_phases() when you're done. Refer to the src/http/modules/ngx_http_mirror_module.c for an example. -- Maxim Dounin http://mdounin.ru/ _______________________________________________ nginx mailing list nginx@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx