func()

in pkg/router/route.go [144:180]


func (rt *Route) PutOrUpdateAPI(api router.API) error {
	lowerCasePath := strings.ToLower(api.URLPattern)
	key := getTrieKey(api.Method.HTTPVerb, lowerCasePath, false)
	rn := &Node{
		fullPath: lowerCasePath,
		method:   &api.Method,
		headers:  api.Headers,
	}
	rt.lock.Lock()
	defer rt.lock.Unlock()

	// if api is exists
	if exists, err := rt.tree.Contains(key); err != nil {
		return err
	} else if exists {
		// append new cluster to the node
		if node, _, exists, err := rt.tree.Get(key); err != nil {
			return err
		} else if exists {
			bizInfoInterface := node.GetBizInfo()
			bizInfo, ok := bizInfoInterface.(*Node)
			if bizInfo == nil || !ok {
				return errors.New("bizInfoInterface.(*Node) failed")
			}
			if !strings.Contains(bizInfo.method.HTTPBackendConfig.URL, api.URL) {
				// operate pointer has no necessary to call update api
				bizInfo.method.HTTPBackendConfig.URL = bizInfo.method.HTTPBackendConfig.URL + "," + api.URL
			}
		}
	} else {
		if ok, err := rt.tree.PutOrUpdate(key, rn); !ok {
			return err
		}
	}

	return nil
}