5.3.3 在create_request方法中构造请求
这里定义的mytest_upstream_create_request方法用于创建发送给上游服务器的HTTP请求,upstream模块将会回调它,实现如下。
static ngx_int_t
mytest_upstream_create_request(ngx_http_request_t*r)
{
/发往google上游服务器的请求很简单,就是模仿正常的搜索请求,以/search?q=……的URL来发起搜索请求。backendQueryLine中的%V等转化格式的用法,可参见表4-7/
static ngx_str_t backendQueryLine=
ngx_string("GET/search?q=%V HTTP/1.1\r\nHost:www.google.
com\r\nConnection:close\r\n\r\n");
ngx_int_t queryLineLen=backendQueryLine.len+r->args.len-2;
/必须在内存池中申请内存,这有以下两点好处:一个好处是,在网络情况不佳的情况下,向上游服务器发送请求时,可能需要epoll多次调度send才能发送完成,这时必须保证这段内存不会被释放;另一个好处是,在请求结束时,这段内存会被自动释放,降低内存泄漏的可能/
ngx_buf_t*b=ngx_create_temp_buf(r->pool,queryLineLen);
if(b==NULL)
return NGX_ERROR;
//last要指向请求的末尾
b->last=b->pos+queryLineLen;
//作用相当于snprintf,只是它支持表4-7中列出的所有转换格式
ngx_snprintf(b->pos,queryLineLen,
(char*)backendQueryLine.data,&r->args);
/r->upstream->request_bufs是一个ngx_chain_t结构,它包含着要发送给上游服务器的请求/
r->upstream->request_bufs=ngx_alloc_chain_link(r->pool);
if(r->upstream->request_bufs==NULL)
return NGX_ERROR;
//request_bufs在这里只包含1个ngx_buf_t缓冲区
r->upstream->request_bufs->buf=b;
r->upstream->request_bufs->next=NULL;
r->upstream->request_sent=0;
r->upstream->header_sent=0;
//header_hash不可以为0
r->header_hash=1;
return NGX_OK;
}