Files
QAyong 5b7f173102 feat: 完善创作工作台与用户诊断支持 (#295)
* feat(canvas): 参考素材 - 增加移除按钮并删除对应连线

* feat(canvas): 完善节点面板交互与拖拽反馈

* fix(canvas): 画布交互与小地图 - 统一浮层层级并完善节点识别

* feat(prompt-optimizer): 增加 AI 提示词优化器及宿主接入

* feat(canvas): 画布 - 增加自动整理节点按钮并补充文档

* chore(web): 前端 - 修正提示词优化器格式

* chore(backend): 后端 - 修正 Go 格式检查

* feat(workspace): 完善诊断导出与本地排障支持

* chore(web): 格式化诊断导出文件

* fix(web-test): 兼容 Bun 测试运行时

* fix(web-test): 对齐模型目录协议断言
2026-08-25 13:49:15 +08:00

71 lines
1.6 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package handler
import (
"crypto/rand"
"encoding/hex"
"regexp"
"strings"
"github.com/gin-gonic/gin"
)
const (
requestIDHeader = "X-Request-ID"
traceIDHeader = "X-Canvas-Trace-ID"
requestIDKey = "canvas.request_id"
traceIDKey = "canvas.trace_id"
)
var correlationIDPattern = regexp.MustCompile(`^[A-Za-z0-9._:-]{1,96}$`)
// RequestCorrelationMiddleware 为每个请求生成服务端 requestId,并保留一次业务操作的 traceId。
// requestId 不能被客户端覆盖;traceId 只接受有限字符集,避免把任意请求头内容写入日志和诊断包。
func RequestCorrelationMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
requestID := newCorrelationID("req")
traceID := normalizeCorrelationID(c.GetHeader(traceIDHeader))
if traceID == "" {
traceID = newCorrelationID("trace")
}
c.Set(requestIDKey, requestID)
c.Set(traceIDKey, traceID)
c.Header(requestIDHeader, requestID)
c.Header(traceIDHeader, traceID)
c.Next()
}
}
func RequestID(c *gin.Context) string {
if value, ok := c.Get(requestIDKey); ok {
if result, ok := value.(string); ok {
return result
}
}
return ""
}
func TraceID(c *gin.Context) string {
if value, ok := c.Get(traceIDKey); ok {
if result, ok := value.(string); ok {
return result
}
}
return ""
}
func normalizeCorrelationID(value string) string {
value = strings.TrimSpace(value)
if !correlationIDPattern.MatchString(value) {
return ""
}
return value
}
func newCorrelationID(prefix string) string {
var raw [12]byte
if _, err := rand.Read(raw[:]); err != nil {
return prefix + "-unavailable"
}
return prefix + "-" + hex.EncodeToString(raw[:])
}