From dadb388d79f6583899e5c86704054de6e3c91c1b Mon Sep 17 00:00:00 2001 From: fuzhongyun <15339891972@163.com> Date: Fri, 26 Jun 2026 10:47:50 +0800 Subject: [PATCH] =?UTF-8?q?feat(router):=20=E6=96=B0=E5=A2=9E=E5=85=B4?= =?UTF-8?q?=E4=B8=9A=E9=93=B6=E8=A1=8C=E8=B5=84=E8=B4=A8=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E4=BB=A3=E7=90=86=E8=BD=AC=E5=8F=91=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加对应的处理函数,包含请求日志记录、30秒超时控制、完整的请求响应转发与错误场景处理 --- internal/server/router/router.go | 55 ++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) 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 路由配置