遇到诡异的问题:字符串"突变" - V2EX
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 2921 次点击
    这是一个创建于 1081 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码如下:

    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     Solana     5181 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 47ms UTC 09:04 PVG 17:04 LAX 01:04 JFK 04:04
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86