in pkg/router/route.go [61:109]
func (rt *Route) RemoveAPI(api router.API) {
lowerCasePath := strings.ToLower(api.URLPattern)
key := getTrieKey(api.Method.HTTPVerb, lowerCasePath, false)
rt.lock.Lock()
defer rt.lock.Unlock()
// if api is exists
if exists, err := rt.tree.Contains(key); err != nil {
logger.Errorf("rt.tree.Get(key) err: %s", err.Error())
return
} else if exists {
// append new cluster to the node
if node, _, exists, err := rt.tree.Get(key); err != nil {
logger.Errorf("rt.tree.Get(key) err: %s", err.Error())
return
} else if exists {
bizInfoInterface := node.GetBizInfo()
bizInfo, ok := bizInfoInterface.(*Node)
if bizInfo == nil || !ok {
logger.Error("bizInfoInterface.(*Node) failed")
return
}
// avoid thread safe problem
clusters := strings.Split(bizInfo.method.HTTPBackendConfig.URL, ",")
if len(clusters) > 1 {
var i int
for i = 0; i < len(clusters); i++ {
if clusters[i] == api.URL {
break
}
}
if i == len(clusters) {
return
}
// operate pointer has no necessary to call update api
bizInfo.method.HTTPBackendConfig.URL = strings.Join(append(clusters[:i], clusters[i+1:]...), ",")
} else {
// double check, avoid removing api that does not exists
if !strings.Contains(bizInfo.method.HTTPBackendConfig.URL, api.URL) {
return
}
// if backend has only one node, then just directly remove
_, _ = rt.tree.Remove(key)
}
}
}
}