12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- 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))
- }
|