| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- package controller
- import (
- "fmt"
- "net/url"
- "github.com/labring/aiproxy/core/model"
- )
- type ParamsFunc interface {
- GetParams() (map[string]string, error)
- }
- type groupParams struct {
- mcpID string
- groupID string
- }
- func (g *groupParams) GetParams() (map[string]string, error) {
- param, err := model.CacheGetPublicMCPReusingParam(g.mcpID, g.groupID)
- if err != nil {
- return nil, fmt.Errorf("failed to get reusing params: %w", err)
- }
- return param.Params, nil
- }
- func newGroupParams(mcpID, groupID string) ParamsFunc {
- return &groupParams{
- mcpID: mcpID,
- groupID: groupID,
- }
- }
- type staticParams map[string]string
- func (s staticParams) GetParams() (map[string]string, error) {
- return s, nil
- }
- // ReusingParamProcessor 统一处理reusing参数
- type ReusingParamProcessor struct {
- mcpID string
- paramsFunc ParamsFunc
- }
- func NewReusingParamProcessor(mcpID string, paramsFunc ParamsFunc) *ReusingParamProcessor {
- return &ReusingParamProcessor{
- mcpID: mcpID,
- paramsFunc: paramsFunc,
- }
- }
- // ProcessProxyReusingParams 处理代理类型的reusing参数
- func (p *ReusingParamProcessor) ProcessProxyReusingParams(
- reusingParams map[string]model.PublicMCPProxyReusingParam,
- headers map[string]string,
- backendQuery *url.Values,
- ) error {
- if len(reusingParams) == 0 {
- return nil
- }
- param, err := p.paramsFunc.GetParams()
- if err != nil {
- return err
- }
- for key, config := range reusingParams {
- value, exists := param[key]
- if !exists {
- if config.Required {
- return fmt.Errorf("required reusing parameter %s is missing", key)
- }
- continue
- }
- if err := p.applyProxyParam(key, value, config.Type, headers, backendQuery); err != nil {
- return err
- }
- }
- return nil
- }
- // ProcessEmbedReusingParams 处理嵌入类型的reusing参数
- func (p *ReusingParamProcessor) ProcessEmbedReusingParams(
- reusingParams map[string]model.ReusingParam,
- ) (map[string]string, error) {
- if len(reusingParams) == 0 {
- return nil, nil
- }
- param, err := p.paramsFunc.GetParams()
- if err != nil {
- return nil, fmt.Errorf("failed to get reusing params: %w", err)
- }
- reusingConfig := make(map[string]string)
- for key, config := range reusingParams {
- value, exists := param[key]
- if !exists {
- if config.Required {
- return nil, fmt.Errorf("required reusing parameter %s is missing", key)
- }
- continue
- }
- reusingConfig[key] = value
- }
- return reusingConfig, nil
- }
- // applyProxyParam 应用代理参数到相应位置
- func (p *ReusingParamProcessor) applyProxyParam(
- key, value string,
- paramType model.ProxyParamType,
- headers map[string]string,
- backendQuery *url.Values,
- ) error {
- switch paramType {
- case model.ParamTypeHeader:
- headers[key] = value
- case model.ParamTypeQuery:
- backendQuery.Set(key, value)
- case model.ParamTypeURL:
- return fmt.Errorf("URL parameter %s cannot be set via reusing", key)
- default:
- return fmt.Errorf("unknown param type: %s", paramType)
- }
- return nil
- }
|