// This validates the Routes and prepares the Trie data structure. // It must be called once the Routes are defined and before trying to find Routes. // The order matters, if multiple Routes match, the first defined will be used. func (rt *router) start() error { rt.trie = trie.New() rt.index = map[*Route]int{} for i, route := range rt.routes { // work with the PathExp urlencoded. pathExp, err := escapedPathExp(route.PathExp) if err != nil { return err } // insert in the Trie err = rt.trie.AddRoute( strings.ToUpper(route.HttpMethod), // work with the HttpMethod in uppercase pathExp, route, ) if err != nil { return err } // index rt.index[route] = i } if rt.disableTrieCompression == false { rt.trie.Compress() } return nil }
// This validates the Routes and prepares the Trie data structure. // It must be called once the Routes are defined and before trying to find Routes. // The order matters, if multiple Routes match, the first defined will be used. func (rt *router) start() error { rt.trie = trie.New() rt.index = map[*Route]int{} for i, route := range rt.routes { // PathExp validation if route.PathExp == "" { return errors.New("empty PathExp") } if route.PathExp[0] != '/' { return errors.New("PathExp must start with /") } urlObj, err := url.Parse(route.PathExp) if err != nil { return err } // work with the PathExp urlencoded. pathExp := escapedPath(urlObj) // make an exception for '*' used by the *splat notation // (at the trie insert only) pathExp = strings.Replace(pathExp, "%2A", "*", -1) // insert in the Trie err = rt.trie.AddRoute( strings.ToUpper(route.HttpMethod), // work with the HttpMethod in uppercase pathExp, route, ) if err != nil { return err } // index rt.index[route] = i } if rt.disableTrieCompression == false { rt.trie.Compress() } return nil }