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

2022-11-26 16:08:25 +08:00
 yaott2020

代码如下:

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 版本相同。本地却没有这样的问题。

2405 次点击
所在节点    Go 编程语言
16 条回复
learningman
2022-11-26 16:10:41 +08:00
你远端是不是套网关了
yaott2020
2022-11-26 16:12:19 +08:00
@learningman 没有,两端的配置文件一模一样,请求地址也一样,都是 Cloudflare ,而且情况是发生在发生请求前。应该和网关无关
learningman
2022-11-26 16:13:36 +08:00
既然是 cf ,那可以看下 cf 的 trace 吧,看看 cf 传的是啥
yaott2020
2022-11-26 16:15:03 +08:00
源站用 nginx ,根据 nginx"特性",默认会把 header 中含有"_"过滤掉,造成后端收不到含有"_"的 header 字段信息
yaott2020
2022-11-26 16:16:04 +08:00
@learningman cf 不会有问题的,有问题的话本地应该也请求失败才对
iamzuoxinyu
2022-11-26 16:16:42 +08:00
浏览器上看的头吗?有可能浏览器显示的是这样,实际上传输的就是小写和下划线。
yaott2020
2022-11-26 16:20:18 +08:00
@iamzuoxinyu 我这个是客户端请求,没有使用浏览器,请求前看了 request 里的 header ,就是有问题的
rozbo
2022-11-26 16:39:17 +08:00
这种 header 不规范,可能因为 nginx 的版本导致各种意想不到的差异,规范的做法是 X-USERNAME 。(虽然这个规范后来被废弃了,但是实际场景中还是有很多问题)
yaott2020
2022-11-26 16:52:24 +08:00
@rozbo header 确实没有一个统一强有力的规范,首字母大小写的规范不一样,每段首字母大小写的规范也不一样,甚至用横杠 /下划线分隔多段的规范也不一样。
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
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
2022-11-28 14:18:05 +08:00
@horsley 我的意思是 key 是横杠,设置 header 后 header 里面变成下划线。
ql562482472
2022-11-28 16:59:39 +08:00
spring 里面用 spring 工具取 header 时,不区分大小写,-或_都能取出来
horsley
2022-11-29 08:17:11 +08:00
@yaott2020 没错啊我也是这个意思,这就是设置的方法的文档里面说了,代码里面也可以看
yaott2020
2022-11-29 08:25:32 +08:00
@horsley 还是没懂我的意思,我知道 set 函数会自动格式化 key ,但是我这里的 key 进去是横杠,set 之后变成了下划线,难道函数有这样的实现吗
lysS
2022-11-29 13:44:49 +08:00
网关是真的搞,有次把我们的 sql 改了;查了小半周

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/898097

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX