fix(cors): 同源请求跳过 CORS 校验,避免浏览器自家人拦自家人
修 bug: 用户从浏览器访问 /setup 提交表单时,浏览器对同源 POST
也会设 Origin 头(防 fetch 滥用)。原 CORS 中间件只看 Origin 是否
在 ALLOWED_ORIGINS 白名单,未配白名单时同源 POST 会被 403 拒,
表现为"安装失败: status code 403"。
此前用 curl 测试时没 Origin 头(CORS 跳过),所以本地测不出来。
浏览器必带。
修法: 在 CORS 校验前加同源豁免 — 比较 Origin 与 r.Host(含
X-Forwarded-Host / X-Forwarded-Proto 反向代理场景),一致就放行,
不进入 CORS 检查、不设 Vary 头。
测试 (被 .gitignore 排除, 本地保留):
- middleware/cors_test.go: 新增
- TestIsSameOrigin: 10 场景
- 空 origin / 同 host+port / 同 host https / 不同 port / 不同 host
- 大小写不敏感 / XFH 代理 / XFH 不匹配 / origin 带 path / 无 scheme
- TestSplitOrigin: 5 场景
- https://example.com:8080 / http://localhost / 带 path
- not-a-url / ://broken
e2e 验证 (本机跑通):
- install 无 Origin (curl): 200
- install 同源 Origin: 200 ✓ 修复
- install 跨域 Origin: 403 (仍正确拒绝)
- install 不同端口 Origin: 403 (仍正确拒绝)
未 push (等用户确认)