如何展平nginx缓冲链?

如何展平nginx缓冲链?,nginx,Nginx,我正在尝试使用nginx缓冲链,并在一些实验代码中使用它。为了做到这一点,我需要首先将链展平为单个内存块。到目前为止,我得到的是实际生产代码有点不同,因此这是未经测试的: u_char *flatten_chain(ngx_chain_t *out) { off_t bsize; ngx_chain_t *out_ptr; u_char *ret, *ret_ptr; uint64_t flattenSize = 0; o

我正在尝试使用nginx缓冲链,并在一些实验代码中使用它。为了做到这一点,我需要首先将链展平为单个内存块。到目前为止,我得到的是实际生产代码有点不同,因此这是未经测试的:

u_char *flatten_chain(ngx_chain_t   *out) {
    off_t       bsize;
    ngx_chain_t *out_ptr;
    u_char      *ret, *ret_ptr;
    uint64_t    flattenSize = 0;

    out_ptr = out;

    while (out_ptr) {
        if(!out_ptr->buf->in_file) {
            bsize = ngx_buf_size(out_ptr->buf);
            flattenSize += bsize;
        }
        out_ptr = out_ptr->next;
    }

    ret = malloc(flattenSize);
    ret_ptr = ret;

    out_ptr = out;

    while (out_ptr) {
        bsize = ngx_buf_size(out_ptr->buf);

        if(!out_ptr->buf->in_file) {
            memcpy(ret_ptr, out_ptr->buf->pos, (size_t)bsize);
            ret_ptr += bsize;
        }
        out_ptr = out_ptr->next;
    }

    return(ret);

}
然而,它似乎不起作用。免责声明:有可能它确实起作用,而我的数据在其他地方被损坏。。。但是,当我调查这一点时,是否有人能证实或否认上述方法是有效的


谢谢

它怎么不起作用?如果你在函数返回之前检查ret指向的内容,比如说打印出来,它们不是你期望的吗?我知道你认为这不是生产代码,但如果可能的话,你应该使用ngx_pcalloc而不是malloc,并给它请求的池成员。这样,在处理请求时,Nginx会自动释放内存。