5.6.3 子请求结束时的处理方法
定义mytest_subrequest_post_handler作为子请求结束时的回调方法,如下所示:
static ngx_int_t mytest_subrequest_post_handler(ngx_http_request_t*r,
void*data,ngx_int_t rc){
//当前请求r是子请求,它的parent成员指向父请求
ngx_http_request_t
*pr=r->parent;
/注意,由于上下文是保存在父请求中的(参见5.6.5节),所以要由pr取上下文。其实有更简单的方法,即参数data就是上下文,初始化subrequest时就对其进行设置。这里仅为了说明如何获取到父请求的上下文/
ngx_http_mytest_ctx_t*myctx=ngx_http_get_module_ctx(pr,ngx_http_mytest_module);
pr->headers_out.status=r->headers_out.status;
/如果返回NGX_HTTP_OK(也就是200),则意味着访问新浪服务器成功,接着将开始解析HTTP包体/
if(r->headers_out.status==NGX_HTTP_OK)
{
int flag=0;
/在不转发响应时,buffer中会保存上游服务器的响应。特别是在使用反向代理模块访问上游服务器时,如果它使用upstream机制时没有重定义input_filter方法,upstream机制默认的input_filter方法会试图把所有的上游响应全部保存到buffer缓冲区中/
ngx_buf_t*pRecvBuf=&r->upstream->buffer;
/以下开始解析上游服务器的响应,并将解析出的值赋到上下文结构体myctx->stock数组中/
for(;pRecvBuf->pos!=pRecvBuf->last;pRecvBuf->pos++)
{
if(pRecvBuf->pos==','||pRecvBuf->pos=='\"')
{
if(flag>0)
{
myctx->stock[flag-1].len=pRecvBuf->pos-myctx->stock[flag-1].
data;
}
flag++;
myctx->stock[flag-1].data=pRecvBuf->pos+1;
}
if(flag>6)
break;
}
//设置接下来父请求的回调方法,这一步很重要
pr->write_event_handler=mytest_post_handler;
return NGX_OK;
}