package httpapi import ( "net/http" "strings" ) type desktopBillingConfigResponse struct { GatewayBaseURL string `json:"gatewayBaseUrl,omitempty"` GatewayBillingPath string `json:"gatewayBillingPath"` } type desktopConfigResponse struct { Billing desktopBillingConfigResponse `json:"billing"` } // getDesktopConfig godoc // @Summary 获取桌面端配置 // @Description 返回桌面端需要的 Gateway Web 账单入口配置。 // @Tags workspace // @Produce json // @Security BearerAuth // @Success 200 {object} desktopConfigResponse // @Failure 401 {object} ErrorEnvelope // @Router /api/workspace/desktop-config [get] func (s *Server) getDesktopConfig(w http.ResponseWriter, r *http.Request) { writeJSON(w, http.StatusOK, desktopConfigResponse{ Billing: desktopBillingConfigResponse{ GatewayBaseURL: firstNonEmpty( strings.TrimRight(strings.TrimSpace(s.cfg.WebBaseURL), "/"), strings.TrimRight(strings.TrimSpace(s.cfg.PublicBaseURL), "/"), requestOrigin(r), ), GatewayBillingPath: "/workspace/billing", }, }) } func requestOrigin(r *http.Request) string { host := strings.TrimSpace(r.Host) if host == "" { return "" } proto := strings.TrimSpace(r.Header.Get("X-Forwarded-Proto")) if proto == "" { proto = "http" } if comma := strings.Index(proto, ","); comma >= 0 { proto = strings.TrimSpace(proto[:comma]) } if proto == "" { proto = "http" } return proto + "://" + host }