rc = ngx_http_read_client_request_body ( r, ngx_http_mymodule_body_handler ) ; // " " <br/>
// , , NGX_AGAIN, <br/>
<br/>
if ( rc >= NGX_HTTP_SPECIAL_RESPONSE ) { <br/>
return rc ; <br/>
} <br/>
<br/>
return NGX_DONE ;
rc = ngx_http_read_client_request_body ( r, ngx_http_mymodule_body_handler ) ; // " " <br/>
// , , NGX_AGAIN, <br/>
<br/>
if ( rc >= NGX_HTTP_SPECIAL_RESPONSE ) { <br/>
return rc ; <br/>
} <br/>
<br/>
return NGX_DONE ;
static void ngx_http_mymodule_body_handler ( request_body * r ) { <br/>
ngx_int_t rc = NGX_OK ; <br/>
<br/>
rc = ngx_http_mymodule_phase_handler ( r ) ; // <br/>
if ( rc >= NGX_HTTP_SPECIAL_RESPONSE ) { <br/>
ngx_http_finalize_request ( f, 0 ) ; // , , . <br/>
} <br/>
return ; <br/>
} <br/>
static void ngx_http_mymodule_body_handler ( request_body * r ) { <br/>
ngx_int_t rc = NGX_OK ; <br/>
<br/>
rc = ngx_http_mymodule_phase_handler ( r ) ; // <br/>
if ( rc >= NGX_HTTP_SPECIAL_RESPONSE ) { <br/>
ngx_http_finalize_request ( f, 0 ) ; // , , . <br/>
} <br/>
return ; <br/>
} <br/>
<br/>
ngx_int_t ngx_http_mymodule_phase_handler ( request_body * r ) { <br/>
<br/>
ngx_int_t rc = NGX_OK ; <br/>
if ( r - > request_body == NULL ) { <br/>
// POST , <br/>
rc = ngx_http_read_client_request_body ( r, ngx_http_mymodule_body_handler ) ; <br/>
<br/>
if ( rc >= NGX_HTTP_SPECIAL_RESPONSE ) { <br/>
return rc ; <br/>
} <br/>
<br/>
return NGX_DONE ; <br/>
} <br/>
<br/>
// ? <br/>
if ( r - > request_body - > rest ) { <br/>
return NGX_DONE ; <br/>
} <br/>
return rc ; <br/>
} <br/>
<br/>
ngx_int_t ngx_http_mymodule_phase_handler ( request_body * r ) { <br/>
<br/>
ngx_int_t rc = NGX_OK ; <br/>
if ( r - > request_body == NULL ) { <br/>
// POST , <br/>
rc = ngx_http_read_client_request_body ( r, ngx_http_mymodule_body_handler ) ; <br/>
<br/>
if ( rc >= NGX_HTTP_SPECIAL_RESPONSE ) { <br/>
return rc ; <br/>
} <br/>
<br/>
return NGX_DONE ; <br/>
} <br/>
<br/>
// ? <br/>
if ( r - > request_body - > rest ) { <br/>
return NGX_DONE ; <br/>
} <br/>
return rc ; <br/>
} <br/>
typedef struct { <br/>
ngx_temp_file_t * temp_file ; // ( ) <br/>
ngx_chain_t * bufs ; // . <br/>
ngx_buf_t * buf ; // <br/>
off_t rest ; <br/>
ngx_chain_t * to_write ; <br/>
ngx_http_client_body_handler_pt post_handler ; <br/>
} ngx_http_request_body_t ; <br/>
typedef struct { <br/>
ngx_temp_file_t * temp_file ; // ( ) <br/>
ngx_chain_t * bufs ; // . <br/>
ngx_buf_t * buf ; // <br/>
off_t rest ; <br/>
ngx_chain_t * to_write ; <br/>
ngx_http_client_body_handler_pt post_handler ; <br/>
} ngx_http_request_body_t ; <br/>
// core/ngx_buf.h
struct ngx_chain_s {
ngx_buf_t * buf ;
ngx_chain_t * next ;
} ;
size -- ( start end) Content-Length r->headers_in->off_t ;
- .
.
// core/ngx_buf.h
struct ngx_chain_s {
ngx_buf_t * buf ;
ngx_chain_t * next ;
} ;
size -- ( start end) Content-Length r->headers_in->off_t ;
- .
.
Source: https://habr.com/ru/post/76963/
All Articles