在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;
}
它试图在传递上游之前添加标题键,值对。由于某种原因,新添加的标题上的值似乎被截断为7个字符。将user_id
打印到日志显示它确实包含比7个字符更长的内容,但是上游发送的结果标头上的值总是被截断。
任何人都可以看到为什么,并建议修复请。 TKS
编辑:这是在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, "Some User Name");
将正确设置: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);