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;

}