fix request pass-through aws channels can't test - #2693
Conversation
common.GetRequestBody(c) read bod is null
WalkthroughTest modification in Changes
Estimated code review effort🎯 2 (Simple) | ⏱️ ~8 minutes Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
@coderabbitai 帮我分析一下改的这几行上下,可能是我太菜了没看懂,感觉啥也没改呢 |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: Length of output: 20114
问题根源这是一个关于 Reader 被重复读取导致数据丢失 的问题。 修改前的代码:requestBody := bytes.NewBuffer(jsonData)
c.Request.Body = io.NopCloser(requestBody) // 使用同一个 buffer 实例
resp, err := adaptor.DoRequest(c, info, requestBody) // 传递同一个 buffer修改后的代码:requestBody := bytes.NewBuffer(jsonData)
c.Request.Body = io.NopCloser(bytes.NewBuffer(jsonData)) // 创建新的 buffer 实例
resp, err := adaptor.DoRequest(c, info, requestBody) // 传递原来的 buffer为什么会出问题?
修改前的流程: 修改后如何解决?现在创建了 两个独立的缓冲区,虽然内容相同,但互不干扰: 实际场景PR 标题提到的 "AWS 渠道透传测试失败" 就是这个原因:
所以虽然改动只有一行,但解决了一个很隐蔽的 bug!这种问题在 Go 中处理 希望这样解释清楚了!👍 |
这里aws测试的时候有用到c.Request.Body吗?测试流程里是直接用的requestBody还是用的c.Request |
|
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain
🏁 Script executed: Length of output: 22860 完美!我找到了关键证据。让我查看一下完整的流程: 🏁 Script executed: Length of output: 1940 🏁 Script executed: Length of output: 478 🏁 Script executed: Length of output: 236 🏁 Script executed: Length of output: 644 🏁 Script executed: Length of output: 142 🏁 Script executed: Length of output: 186 🏁 Script executed: Length of output: 760
AWS 测试的实际流程在 func doAwsClientRequest(c *gin.Context, info *relaycommon.RelayInfo, a *Adaptor, requestBody io.Reader) {
// ...
// 第 132 行:先读取 requestBody 参数
awsClaudeReq, err := formatRequest(requestBody, requestHeader) // ← 读取 requestBody
// ...
// 第 143/155 行:然后在透传模式下读取 c.Request.Body
awsReq.Body, err = buildAwsRequestBody(c, info, awsClaudeReq) // ← 读取 c.Request.Body
}formatRequest 函数(dto.go):func formatRequest(requestBody io.Reader, ...) {
err := common.DecodeJson(requestBody, &awsClaudeRequest) // ← 读取传入的 requestBody
}buildAwsRequestBody 函数(relay-aws.go:166):func buildAwsRequestBody(c *gin.Context, ...) {
if 透传模式启用 {
body, err := common.GetRequestBody(c) // ← 读取 c.Request.Body
}
}问题所在修改前的测试代码(两个变量指向同一个 buffer): requestBody := bytes.NewBuffer(jsonData)
c.Request.Body = io.NopCloser(requestBody) // ← 同一个实例!
resp, err := adaptor.DoRequest(c, info, requestBody)执行流程: 修改后的测试代码(两个独立的 buffer): requestBody := bytes.NewBuffer(jsonData)
c.Request.Body = io.NopCloser(bytes.NewBuffer(jsonData)) // ← 新的独立实例!
resp, err := adaptor.DoRequest(c, info, requestBody)执行流程: 总结你的问题问得非常好!AWS 测试确实同时使用了两者:
所以这个 PR 的修改是必需的,它保证了这两个读取操作互不干扰。这就是为什么"看起来啥也没改",但实际上解决了一个导致 AWS 透传测试失败的关键 bug!👍 |
|
看了眼感觉这个是可以改的🤔 |
|
这个提交主要修复的是Body重复读,第二次读会读到空的,必须buildAwsRequestBody方法的body, err := common.GetRequestBody(c)读到的是空值 |
嗯感觉可以在靠后的地方加判定,没有这个version就设置一个 |
这个修改让代码更难以阅读了 |
fix request pass-through aws channels can't test
common.GetRequestBody(c) read body is null
Summary by CodeRabbit
✏️ Tip: You can customize this high-level summary in your review settings.