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;

}