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
}