package coap import "net" type Broker struct { m map[string]muxEntry Mgr *Manager } type muxEntry struct { h Handler pattern string } func NewBroker() *Broker { mgr := NewManager() return &Broker{ Mgr: mgr, m: make(map[string]muxEntry), } } func pathMatch(pattern string, path string) bool { if len(pattern) == 0 { return false } n := len(pattern) if pattern[n-1] != '/' { return pattern == path } return len(path) >= n && path[0:n] == pattern } func (b *Broker) match(path string) (h Handler, pattern string) { var n = 0 for k, v := range b.m { if !pathMatch(k, path) { continue } if h == nil || len(k) > n { n = len(k) h = v.h pattern = v.pattern } } return } func notFoundHandler(l *net.UDPConn, a *net.UDPAddr, m Message) Message { if m.IsConfirmable() { return &BaseMessage{ Type: ACK, Code: NotFound, } } return nil } func (b *Broker) ServeCOAP(l *net.UDPConn, a *net.UDPAddr, m Message) Message { h, _ := b.match(m.PathString()) if h == nil { h, _ = funcHandler(notFoundHandler), "" } return h.ServeCOAP(l, a, m) } func (b *Broker) Handle(pattern string, handler Handler) { for pattern != "" && pattern[0] == '/' { pattern = pattern[1:] } if pattern == "" { panic("http: invalid pattern " + pattern) } if handler == nil { panic("http: nil handler") } b.m[pattern] = muxEntry{h: handler, pattern: pattern} } // HandleFunc configures a handler for the given path. func (b *Broker) HandleFunc(pattern string, f func(l *net.UDPConn, a *net.UDPAddr, m Message) Message) { b.Handle(pattern, b.Mgr.FuncHandler(f)) }