-
-
Notifications
You must be signed in to change notification settings - Fork 116
/
server.go
167 lines (157 loc) · 4.55 KB
/
server.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
// Package coap provides a CoAP client and server.
package coap
import (
"crypto/tls"
"errors"
"fmt"
piondtls "github.com/pion/dtls/v3"
"github.com/plgd-dev/go-coap/v3/dtls"
dtlsServer "github.com/plgd-dev/go-coap/v3/dtls/server"
"github.com/plgd-dev/go-coap/v3/mux"
"github.com/plgd-dev/go-coap/v3/net"
"github.com/plgd-dev/go-coap/v3/options"
"github.com/plgd-dev/go-coap/v3/tcp"
tcpServer "github.com/plgd-dev/go-coap/v3/tcp/server"
"github.com/plgd-dev/go-coap/v3/udp"
udpServer "github.com/plgd-dev/go-coap/v3/udp/server"
)
// ListenAndServe Starts a server on address and network specified Invoke handler
// for incoming queries.
func ListenAndServe(network string, addr string, handler mux.Handler) (err error) {
switch network {
case "udp", "udp4", "udp6", "":
l, err := net.NewListenUDP(network, addr)
if err != nil {
return err
}
defer func() {
if errC := l.Close(); errC != nil && err == nil {
err = errC
}
}()
s := udp.NewServer(options.WithMux(handler))
return s.Serve(l)
case "tcp", "tcp4", "tcp6":
l, err := net.NewTCPListener(network, addr)
if err != nil {
return err
}
defer func() {
if errC := l.Close(); errC != nil && err == nil {
err = errC
}
}()
s := tcp.NewServer(options.WithMux(handler))
return s.Serve(l)
default:
return fmt.Errorf("invalid network (%v)", network)
}
}
// ListenAndServeTCPTLS Starts a server on address and network over TLS specified Invoke handler
// for incoming queries.
func ListenAndServeTCPTLS(network, addr string, config *tls.Config, handler mux.Handler) (err error) {
l, err := net.NewTLSListener(network, addr, config)
if err != nil {
return err
}
defer func() {
if errC := l.Close(); errC != nil && err == nil {
err = errC
}
}()
s := tcp.NewServer(options.WithMux(handler))
return s.Serve(l)
}
// ListenAndServeDTLS Starts a server on address and network over DTLS specified Invoke handler
// for incoming queries.
func ListenAndServeDTLS(network string, addr string, config *piondtls.Config, handler mux.Handler) (err error) {
l, err := net.NewDTLSListener(network, addr, config)
if err != nil {
return err
}
defer func() {
if errC := l.Close(); errC != nil && err == nil {
err = errC
}
}()
s := dtls.NewServer(options.WithMux(handler))
return s.Serve(l)
}
// ListenAndServeWithOption Starts a server on address and network specified Invoke options
// for incoming queries. The options is only support tcpServer.Option and udpServer.Option
func ListenAndServeWithOptions(network, addr string, opts ...any) (err error) {
tcpOptions := []tcpServer.Option{}
udpOptions := []udpServer.Option{}
for _, opt := range opts {
switch o := opt.(type) {
case tcpServer.Option:
tcpOptions = append(tcpOptions, o)
// Duplicate the option for UDP if needed.
if udpOpt, ok := o.(udpServer.Option); ok {
udpOptions = append(udpOptions, udpOpt)
}
case udpServer.Option:
udpOptions = append(udpOptions, o)
default:
return errors.New("only support tcpServer.Option and udpServer.Option")
}
}
switch network {
case "udp", "udp4", "udp6", "":
l, err := net.NewListenUDP(network, addr)
if err != nil {
return err
}
defer func() {
if errC := l.Close(); errC != nil && err == nil {
err = errC
}
}()
s := udp.NewServer(udpOptions...)
return s.Serve(l)
case "tcp", "tcp4", "tcp6":
l, err := net.NewTCPListener(network, addr)
if err != nil {
return err
}
defer func() {
if errC := l.Close(); errC != nil && err == nil {
err = errC
}
}()
s := tcp.NewServer(tcpOptions...)
return s.Serve(l)
default:
return fmt.Errorf("invalid network (%v)", network)
}
}
// ListenAndServeTCPTLSWithOptions Starts a server on address and network over TLS specified Invoke options
// for incoming queries.
func ListenAndServeTCPTLSWithOptions(network, addr string, config *tls.Config, opts ...tcpServer.Option) (err error) {
l, err := net.NewTLSListener(network, addr, config)
if err != nil {
return err
}
defer func() {
if errC := l.Close(); errC != nil && err == nil {
err = errC
}
}()
s := tcp.NewServer(opts...)
return s.Serve(l)
}
// ListenAndServeDTLSWithOptions Starts a server on address and network over DTLS specified Invoke options
// for incoming queries.
func ListenAndServeDTLSWithOptions(network string, addr string, config *piondtls.Config, opts ...dtlsServer.Option) (err error) {
l, err := net.NewDTLSListener(network, addr, config)
if err != nil {
return err
}
defer func() {
if errC := l.Close(); errC != nil && err == nil {
err = errC
}
}()
s := dtls.NewServer(opts...)
return s.Serve(l)
}