V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
yaott2020
V2EX  ›  Go 编程语言

遇到诡异的问题:字符串"突变"

  •  
  •   yaott2020 · 2022-11-26 16:08:25 +08:00 · 2333 次点击
    这是一个创建于 488 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码如下:

    for k, value := range MetaMap {
    	k = "Meta-" + k
    	header.Set(k, value)
    }
    

    其中 header ==> http.Header{}, MetaMap ==> map[string]string 且只有一个键值对: Password: admin123 ,但是 Debug 发现 header 中却是 Meta_password ,而不是 Meta-Password 。有人遇到过这种问题吗

    Debug 是在远程主机上运行的,本地和远端代码一模一样,本地通过 git push 到 GitHub ,远端直接 git pull ,且两端的编译命令相同,go 版本相同。本地却没有这样的问题。

    第 1 条附言  ·  2022-11-26 16:53:14 +08:00
    有可能是我远端主机的问题,换其他机器就没问题了。
    16 条回复    2022-11-29 13:44:49 +08:00
    learningman
        1
    learningman  
       2022-11-26 16:10:41 +08:00 via Android
    你远端是不是套网关了
    yaott2020
        2
    yaott2020  
    OP
       2022-11-26 16:12:19 +08:00
    @learningman 没有,两端的配置文件一模一样,请求地址也一样,都是 Cloudflare ,而且情况是发生在发生请求前。应该和网关无关
    learningman
        3
    learningman  
       2022-11-26 16:13:36 +08:00 via Android
    既然是 cf ,那可以看下 cf 的 trace 吧,看看 cf 传的是啥
    yaott2020
        4
    yaott2020  
    OP
       2022-11-26 16:15:03 +08:00
    源站用 nginx ,根据 nginx"特性",默认会把 header 中含有"_"过滤掉,造成后端收不到含有"_"的 header 字段信息
    yaott2020
        5
    yaott2020  
    OP
       2022-11-26 16:16:04 +08:00
    @learningman cf 不会有问题的,有问题的话本地应该也请求失败才对
    iamzuoxinyu
        6
    iamzuoxinyu  
       2022-11-26 16:16:42 +08:00 via Android
    浏览器上看的头吗?有可能浏览器显示的是这样,实际上传输的就是小写和下划线。
    yaott2020
        7
    yaott2020  
    OP
       2022-11-26 16:20:18 +08:00
    @iamzuoxinyu 我这个是客户端请求,没有使用浏览器,请求前看了 request 里的 header ,就是有问题的
    rozbo
        8
    rozbo  
       2022-11-26 16:39:17 +08:00
    这种 header 不规范,可能因为 nginx 的版本导致各种意想不到的差异,规范的做法是 X-USERNAME 。(虽然这个规范后来被废弃了,但是实际场景中还是有很多问题)
    yaott2020
        9
    yaott2020  
    OP
       2022-11-26 16:52:24 +08:00 via Android
    @rozbo header 确实没有一个统一强有力的规范,首字母大小写的规范不一样,每段首字母大小写的规范也不一样,甚至用横杠 /下划线分隔多段的规范也不一样。
    horsley
        10
    horsley  
       2022-11-28 08:45:02 +08:00
    header.set 会经过 mime 标准化,就是会换成横杠的,不想被转换要用 header[k] = []string{v}

    文档其实说的很清楚的
    Set sets the header entries associated with key to the single element value. It replaces any existing values associated with key. The key is case insensitive; it is canonicalized by textproto.CanonicalMIMEHeaderKey. To use non-canonical keys, assign to the map directly.
    GopherDaily
        11
    GopherDaily  
       2022-11-28 12:18:50 +08:00
    // Set sets the header entries associated with key to the
    // single element value. It replaces any existing values
    // associated with key. The key is case insensitive; it is
    // canonicalized by textproto.CanonicalMIMEHeaderKey.
    // To use non-canonical keys, assign to the map directly.
    func (h Header) Set(key, value string) {
    textproto.MIMEHeader(h).Set(key, value)
    }
    yaott2020
        12
    yaott2020  
    OP
       2022-11-28 14:18:05 +08:00 via Android
    @horsley 我的意思是 key 是横杠,设置 header 后 header 里面变成下划线。
    ql562482472
        13
    ql562482472  
       2022-11-28 16:59:39 +08:00
    spring 里面用 spring 工具取 header 时,不区分大小写,-或_都能取出来
    horsley
        14
    horsley  
       2022-11-29 08:17:11 +08:00
    @yaott2020 没错啊我也是这个意思,这就是设置的方法的文档里面说了,代码里面也可以看
    yaott2020
        15
    yaott2020  
    OP
       2022-11-29 08:25:32 +08:00 via Android
    @horsley 还是没懂我的意思,我知道 set 函数会自动格式化 key ,但是我这里的 key 进去是横杠,set 之后变成了下划线,难道函数有这样的实现吗
    lysS
        16
    lysS  
       2022-11-29 13:44:49 +08:00
    网关是真的搞,有次把我们的 sql 改了;查了小半周
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2516 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 16:00 · PVG 00:00 · LAX 09:00 · JFK 12:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.