Nginx는 정말 흥미로운 소프트웨어이지만, 문서가 부족해서 저를 미쳤습니다.nginx 모듈 : 전체 응답 본문을 캡처하십시오.
목표 : 전체 응답 본문을 캡처하여 서버에 기록합니다.
문제점 : 나는 항상 크기가 0 인 단일 버퍼를 가지고 있습니다.
접근
나는 전체 버퍼 체인을 반복하기 전에last_buf
은 "대기"것
body filter이 요구 사항을 달성 할 수 있기를 기대
.
/**
* @param ngx_http_request_t *r HTTP request
* @param ngx_chain_t *in Buffer chain
*/
static ngx_int_t
create_response_snapshot(ngx_http_request_t *r, ngx_chain_t *in)
{
ngx_chain_t *chain = NULL;
int chain_contains_last_buffer = 0;
size_t buffer_size = 0;
// check if body is complete
chain = in;
for (; ;)
{
if (chain->buf->last_buf)
{
chain_contains_last_buffer = 1;
}
if (NULL == chain->next)
break;
chain = chain->next;
}
if (0 == chain_contains_last_buffer)
{
// response is not complete
return ngx_http_next_body_filter(r, in);
}
// Response Content-Length
ngx_log_error(NGX_LOG_ALERT,r->connection->log,0,"Content-Length: %d",
r->headers_out.content_length_n);
// lets iterate buffers chain
for (chain = in; NULL != chain; chain = chain->next)
{
buffer_size = ngx_buf_size(chain->buf);
ngx_log_error(NGX_LOG_ALERT,r->connection->log,0,"buffer_size#%d",buffer_size);
}
return ngx_http_next_body_filter(r, in);
}
설명서가 부족해서 나를 미치게 만들었습니다. 내가 찾은 유일한 가이드 (Evan Miller 's)는 대부분의'ngx_but_t' 멤버들의 목적을 설명하기 시작하지 않습니다. 이 경우 마지막 버프를 얻을 때까지 모듈 컨텍스트의 'busy'멤버에'in' 체인을 계속 추가해야한다고 생각합니다. 왜냐하면 필터가 여러 번 호출되기 때문이며 'last_buf'를 포함하는 필터가 최종 호출이므로 항상 본 것과 분리됩니다. – GVH
아, 그러면 최종 체인을 얻지 못했다면'ngx_http_next_body_filter'를 호출하는 대신'NGX_OK'를 반환 할 것입니다. 그런 다음 체인 전체를 한 번에 나머지 필터로 전달하십시오. 기본적으로 Nginx의 출력을 청크로 처리하는 기능을 제거하고 있습니다. – GVH
@GVH "이 경우 마지막 버프를 얻을 때까지 in chain을 모듈 컨텍스트의 바쁜 멤버에 계속 추가해야한다고 생각합니다." "바쁜 회원"에 대해 설명해 주시겠습니까? 나는 그것이 무엇이되어야하는지에 관해 모른다. Evan Miler의 튜토리얼에 따르면 "NGX_OK"를 반환하는 경우 각 필터는 다음 필터를 호출합니다. 다른 모듈을 깊이 파헤칩니다. – PauloASilva