mirror of
https://github.com/mainflux/mainflux.git
synced 2025-04-27 13:48:49 +08:00

* Bring old CoAP code back Signed-off-by: Dušan Borovčanin <dusan.borovcanin@mainflux.com> * Fix channel ID formatting due to type change Uncomment error handling for authorization. Signed-off-by: Dušan Borovčanin <dusan.borovcanin@mainflux.com> * Update CoAP adapter docs Signed-off-by: Dušan Borovčanin <dusan.borovcanin@mainflux.com> * Add copyright headers Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Remove redundant type declaration Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Add CoAP adapter to the list of services Add CoAp adapter in Makefile services list and fix corresponding documentation. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Refactor CoAP code Merge multipe `const` block int single and declare consts before vars. Un-export notFound handler since there is no need to export it. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Update http version endpoint This separates CoAP and HTTP APIs. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Refactor CoAP POST method handling This PR is a part of CoAP adapter refactoring that will simplify adapter implementation. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Refactor CoAP adapter Change CoAP message handling to simplify adapter implementation. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Add backoff timeout for server ping to client Update CoAP adapter to provide subset of necessary features from protocol specification. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Fix leaking locked goroutine In case of the stopped ticker, its channel is NOT closed, so pinging might be left stuck waiting for the stopped ticker to send a notification. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Format code Use more meaningful name for Handlers map. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Use and stop ticker from the same goroutine Stop handler Ticker from ping goroutine rather than the cancel goroutine. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Check if subscription already exists in put method Fix potential leak of handlers providing check inside of put method. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Use MessageID as Observe option Since MessageID satisfies observe option behaviour, use Message ID instead of local timestamp. Remove Thicker from handler and use it on transport layer. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Use name Observer insted of Handler Name `Observer` is used in protocol specification, so this naming makes code more self-documenting. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Add CoAP adapter to docker-compose.yml Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Add copyright headers Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Remove unused constants Fix service name in startup log message. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Add metrics endpoint Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Refactor code Config fields from main.go should not be exported; minor style changes. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Update authorization URI-Query option Use `authorization` value in URI-Query option instead of `key`. This mimics Authorization header in some other protocols (e.g. HTTP). Please note that this value can be replaced with simple `auth` to save space, due to constrained URI-Query option size. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com>
95 lines
2.1 KiB
Go
95 lines
2.1 KiB
Go
package coap
|
|
|
|
import (
|
|
"net"
|
|
)
|
|
|
|
// ServeMux provides mappings from a common endpoint to handlers by
|
|
// request path.
|
|
type ServeMux struct {
|
|
m map[string]muxEntry
|
|
}
|
|
|
|
type muxEntry struct {
|
|
h Handler
|
|
pattern string
|
|
}
|
|
|
|
// NewServeMux creates a new ServeMux.
|
|
func NewServeMux() *ServeMux { return &ServeMux{m: make(map[string]muxEntry)} }
|
|
|
|
// Does path match pattern?
|
|
func pathMatch(pattern, path string) bool {
|
|
if len(pattern) == 0 {
|
|
// should not happen
|
|
return false
|
|
}
|
|
n := len(pattern)
|
|
if pattern[n-1] != '/' {
|
|
return pattern == path
|
|
}
|
|
return len(path) >= n && path[0:n] == pattern
|
|
}
|
|
|
|
// Find a handler on a handler map given a path string
|
|
// Most-specific (longest) pattern wins
|
|
func (mux *ServeMux) match(path string) (h Handler, pattern string) {
|
|
var n = 0
|
|
for k, v := range mux.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 &Message{
|
|
Type: Acknowledgement,
|
|
Code: NotFound,
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
var _ = Handler(&ServeMux{})
|
|
|
|
// ServeCOAP handles a single COAP message. The message arrives from
|
|
// the given listener having originated from the given UDPAddr.
|
|
func (mux *ServeMux) ServeCOAP(l *net.UDPConn, a *net.UDPAddr, m *Message) *Message {
|
|
h, _ := mux.match(m.PathString())
|
|
if h == nil {
|
|
h, _ = funcHandler(notFoundHandler), ""
|
|
}
|
|
// TODO: Rewrite path?
|
|
return h.ServeCOAP(l, a, m)
|
|
}
|
|
|
|
// Handle configures a handler for the given path.
|
|
func (mux *ServeMux) 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")
|
|
}
|
|
|
|
mux.m[pattern] = muxEntry{h: handler, pattern: pattern}
|
|
}
|
|
|
|
// HandleFunc configures a handler for the given path.
|
|
func (mux *ServeMux) HandleFunc(pattern string,
|
|
f func(l *net.UDPConn, a *net.UDPAddr, m *Message) *Message) {
|
|
mux.Handle(pattern, FuncHandler(f))
|
|
}
|