diff --git a/internal/server/router/router.go b/internal/server/router/router.go index 5cc3ecb..8e12bd7 100644 --- a/internal/server/router/router.go +++ b/internal/server/router/router.go @@ -7,6 +7,7 @@ import ( "encoding/json" "fmt" "io" + "log" "net/http" "strings" "sync" @@ -16,6 +17,11 @@ import ( "github.com/gofiber/websocket/v2" ) +const ( + scbankQualificationProxyURL = "http://101.204.7.15:11857" + scbankQualificationProxyTimeout = 30 * time.Second +) + type RouterServer struct { app *fiber.App service *services.ChatService @@ -106,6 +112,7 @@ func SetupRoutes(app *fiber.App, ChatService *services.ChatService, sessionServi // 转发Python服务 r.All("/proxy/fingerprint", forwardToPythonService) + r.All("/proxy/scbank/qualification", forwardScbankQualification) } func forwardToPythonService(c *fiber.Ctx) error { @@ -150,6 +157,54 @@ func forwardToPythonService(c *fiber.Ctx) error { return c.Send(body) } +func forwardScbankQualification(c *fiber.Ctx) error { + // 调用外部权益接口前记录目标地址与关键请求信息,便于排查白名单和超时问题。 + startAt := time.Now() + log.Printf("开始转发权益校验请求 | method=%s | path=%s | target=%s", c.Method(), c.Path(), scbankQualificationProxyURL) + + req, err := http.NewRequestWithContext(c.Context(), c.Method(), scbankQualificationProxyURL, c.Context().Request.BodyStream()) + if err != nil { + log.Printf("创建权益中转请求失败 | target=%s | err=%v", scbankQualificationProxyURL, err) + return c.Status(fiber.StatusInternalServerError).SendString(err.Error()) + } + + c.Request().Header.VisitAll(func(key, value []byte) { + req.Header.Add(string(key), string(value)) + }) + + if c.Context().QueryArgs().Len() > 0 { + q := req.URL.Query() + c.Context().QueryArgs().VisitAll(func(key, value []byte) { + q.Add(string(key), string(value)) + }) + req.URL.RawQuery = q.Encode() + } + + client := &http.Client{Timeout: scbankQualificationProxyTimeout} + resp, err := client.Do(req) + if err != nil { + log.Printf("权益中转请求失败 | target=%s | timeout=%s | cost=%s | err=%v", scbankQualificationProxyURL, scbankQualificationProxyTimeout, time.Since(startAt), err) + return c.Status(fiber.StatusBadGateway).SendString(err.Error()) + } + defer resp.Body.Close() + + for key, values := range resp.Header { + for _, value := range values { + c.Set(key, value) + } + } + + body, err := io.ReadAll(resp.Body) + if err != nil { + log.Printf("读取权益中转响应失败 | target=%s | status=%d | err=%v", scbankQualificationProxyURL, resp.StatusCode, err) + return c.Status(fiber.StatusInternalServerError).SendString(err.Error()) + } + + log.Printf("权益中转请求完成 | target=%s | status=%d | cost=%s", scbankQualificationProxyURL, resp.StatusCode, time.Since(startAt)) + c.Status(resp.StatusCode) + return c.Send(body) +} + func routerSocket(app *fiber.App, chatService *services.ChatService) { ws := app.Group("ws/v1/") // WebSocket 路由配置