在 nginx C 模块中,我有以下代码:
static void
append_user_id(ngx_http_request_t *r, ngx_str_t *user_id)
{
ngx_table_elt_t *h;
h = ngx_list_push(&r->headers_in.headers);
h->hash = 1;
ngx_str_set(&h->key, "X-User-Id");
h->value = *user_id;
}
它试图在传递到上游之前添加 header 键值对。由于某种原因,新添加的 header 上的值似乎被截断为 7 个字符。将 user_id
打印到日志中表明它确实包含比 7 个字符长得多的内容,但是发送到上游的结果 header 上的值始终会被截断。
任何人都可以了解原因并提出修复建议吗? 谢谢
编辑:这是在 nginx 1.6.1 上,它总是被截断为 7 个字符。
最佳答案
根据定义,ngx_str_t 中同时包含数据和长度:
typedef struct {
size_t len;
u_char *data;
} ngx_str_t;
ngx_str_t user_id;
问题是,每当您使用宏 ngx_str_set(&user_id, x)
时,它所做的就是:
#define ngx_str_set(str, text)
\(str)->len = sizeof(text) - 1; (str)->data = (u_char *) text
基本上,它只是将 user_id.data
分配给您传入的文本
并将 user_id.len
设置为 sizeof(text)-1
。因此,只要 text 是常量字符串,sizeof(text)
就会正确显示长度
您传入的常量字符串,例如
ngx_str_set(&user_id, "某个用户名");
将正确设置:user_id.len = sizeof("Some User Name") - 1;//= 14
但是如果您有一些动态分配的内存(或者您有一个指向内存位置的指针),则 sizeof(text)-1 仅返回指针的大小 - 1 (即 7)。例如:
const char *x = "Some User Name";
ngx_str_set(&user_id, x); // len field will be 7 not 14 as sizeof(x)-1 is 8-1=7
任何不引用 len
字段的函数都可以正常工作,例如如果您调用 ngx_log_error(NGX_LOG_ERR, r->connection->log,0, user_id.data);
,则可以正常工作,因为您仅传递 user_id.data
。但是任何使用 ngx_str_t
的函数,例如 r->headers_in.headers
,都会查看 len
字段,其中写入了 7,并且它只会使用数据中的 7 个字符。
在您粘贴的这段特定代码中,您必须返回到设置 user_id
变量的位置。
可能的解决方案:
a) 自己设置 len 字段
some_value.len = ngx_strlen(x);
some_value.data = x;
b) 如果你想复制数据,那么:
some_value.len = ngx_strlen(x);
some_value.data = ngx_pstrdup(r->connection->pool, x);
关于c - ngx_str_set 截断值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26274518/