ngx_str_set截断值

问题描述 投票:0回答:1

在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个字符。

c nginx
1个回答
0
投票

根据定义,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);
© www.soinside.com 2019 - 2024. All rights reserved.