// Find returns a *route.Pool that matches exactly the URI parameter, nil if no match was found. func (r *Trie) Find(uri route.Uri) *route.Pool { key := strings.TrimPrefix(uri.String(), "/") node := r for { pathParts := parts(key) SegmentValue := pathParts[0] matchingChild, ok := node.ChildNodes[SegmentValue] if !ok { return nil } node = matchingChild if len(pathParts) <= 1 { break } key = pathParts[1] } if nil != node.Pool { return node.Pool } return nil }
func (r *Trie) Insert(uri route.Uri, value *route.Pool) *Trie { key := strings.TrimPrefix(uri.String(), "/") node := r for { pathParts := parts(key) SegmentValue := pathParts[0] matchingChild, ok := node.ChildNodes[SegmentValue] if !ok { matchingChild = NewTrie() matchingChild.Segment = SegmentValue matchingChild.Parent = node node.ChildNodes[SegmentValue] = matchingChild } node = matchingChild if len(pathParts) != 2 { break } key = pathParts[1] } node.Pool = value return node }
func (r *Trie) Delete(uri route.Uri) bool { key := strings.TrimPrefix(uri.String(), "/") node := r initialKey := key for { pathParts := parts(key) SegmentValue := pathParts[0] // It is currently impossible to Delete a non-existent path. This invariant is // provided by the fact that a call to Find is done before Delete in the registry. matchingChild, _ := node.ChildNodes[SegmentValue] node = matchingChild if len(pathParts) <= 1 { break } key = pathParts[1] } node.Pool = nil r.deleteEmptyNodes(initialKey) return true }
func parseContextPath(uri route.Uri) string { contextPath := "/" split := strings.SplitN(strings.TrimPrefix(uri.String(), "/"), "/", 2) if len(split) > 1 { contextPath += split[1] } return contextPath }
import ( "code.cloudfoundry.org/gorouter/route" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) var _ = Describe("URIs", func() { Context("RouteKey", func() { var key route.Uri It("creates a route key based on uri", func() { key = route.Uri("dora.app.com").RouteKey() Expect(key.String()).To(Equal("dora.app.com")) key = route.Uri("dora.app.com/").RouteKey() Expect(key.String()).To(Equal("dora.app.com")) key = route.Uri("dora.app.com/v1").RouteKey() Expect(key.String()).To(Equal("dora.app.com/v1")) }) Context("has a context path", func() { It("creates route key with context path", func() { key = route.Uri("dora.app.com/v1").RouteKey() Expect(key.String()).To(Equal("dora.app.com/v1"))