forked from libp2p/go-ws-transport
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlistener.go
64 lines (51 loc) · 1.05 KB
/
listener.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
// +build !js
package websocket
import (
"fmt"
"net"
"net/http"
ma "github.com/multiformats/go-multiaddr"
manet "github.com/multiformats/go-multiaddr-net"
)
type listener struct {
net.Listener
laddr ma.Multiaddr
closed chan struct{}
incoming chan *Conn
}
func (l *listener) serve() {
defer close(l.closed)
_ = http.Serve(l.Listener, l)
}
func (l *listener) ServeHTTP(w http.ResponseWriter, r *http.Request) {
c, err := upgrader.Upgrade(w, r, nil)
if err != nil {
// The upgrader writes a response for us.
return
}
select {
case l.incoming <- NewConn(c):
case <-l.closed:
c.Close()
}
// The connection has been hijacked, it's safe to return.
}
func (l *listener) Accept() (manet.Conn, error) {
select {
case c, ok := <-l.incoming:
if !ok {
return nil, fmt.Errorf("listener is closed")
}
mnc, err := manet.WrapNetConn(c)
if err != nil {
c.Close()
return nil, err
}
return mnc, nil
case <-l.closed:
return nil, fmt.Errorf("listener is closed")
}
}
func (l *listener) Multiaddr() ma.Multiaddr {
return l.laddr
}