c - ngx_str_set 截断值

标签 c nginx

在 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/

相关文章:

c - fread'ing 和 fwrite'ing 包含指针的结构

c指针段错误

c - 嵌入式设备(Linux 内核)上的微秒(或一毫秒)时间分辨率

c - Thales Connect HSM - DeriveKey 操作

node.js - Stripe TLS 1.2 Webhook 问题

ubuntu - nginx 子域

关于静态库和共享库的C题

nginx - 如何在特定类型的 URL 上禁用 mod_pagespeed

Nginx X-Forwarded-host 引起的 Django CSRF 错误

ssl - Nginx中的负载平衡-TCP,SSL,HTTPS