我比较担心大家没有看懂我的问题,补充一下,我的跟踪headers里的内容借用的ngx_http_header_filter_module.c里的一段,如下。所以程序应该没问题。
ngx_list_part_t *part;
ngx_table_elt_t *header;
part = &r->headers_out.headers.part;
header = part->elts;
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "the number of elts per list = \"%d\" .", r->headers_out.headers.nalloc);
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "the size of elts = \"%d\" .", r->headers_out.headers.size);
for (i = 0; /* void */; i++) {
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "the real number of elts in this part = \"%d\" .", part->nelts);
if (i >= part->nelts) {
if (part->next == NULL) {
break;
}
part = part->next;
header = part->elts;
i = 0;
}
if (header[i].hash == 0) {
continue;
}
}
发现第一个part的nelts就是0……part->next就是NULL。
在 2013年4月15日星期一UTC+8下午4时57分35秒,Blueant Liu写道:
了解了一下r->headers_out结构,找着样子写了一个filter,打算处理response header的内容。测试时,一个正常的请求例子如下 :
* About to connect() to 127.0.0.1 port 80 (#0)
* Trying 127.0.0.1... connected
* Connected to 127.0.0.1 (127.0.0.1) port 80 (#0)
> GET /index.html HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-unknown-linux-gnu) libcurl/7.19.7 NSS/
3.12.6.2 zlib/1.2.3 libidn/1.18 libssh2/1.2.2
> Host: 127.0.0.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/1.2.7
< Date: Mon, 15 Apr 2013 08:48:34 GMT
< Content-Type: text/html
< Content-Length: 612
< Last-Modified: Mon, 25 Feb 2013 07:38:23 GMT
< Connection: keep-alive
< Accept-Ranges: bytes
但是从跟踪的日志看filter只截获了r->headers_out.status; r->headers_out.content_length_n等数据。
在r->headers_out.headers这个ngx_list_t中查找ngx_table_elt_t的时候,r->headers_out.headers.size是48字节,r->headers_out.headers.nalloc是20,
但居然r->headers_out.headers.part->nelts是0,请问真正的返回头难道不在headers里么?谢谢。