/
connect.go
83 lines (65 loc) · 1.48 KB
/
connect.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
package websocket
import (
"net"
"net/http"
"net/url"
"sync"
"time"
"github.com/gorilla/websocket"
"github.com/googollee/go-socket.io/engineio/packet"
"github.com/googollee/go-socket.io/engineio/transport"
)
// conn implements base.Conn
type conn struct {
transport.FrameReader
transport.FrameWriter
ws wrapper
url url.URL
remoteHeader http.Header
closed chan struct{}
closeOnce sync.Once
}
func newConn(ws *websocket.Conn, url url.URL, header http.Header) *conn {
w := newWrapper(ws)
closed := make(chan struct{})
return &conn{
url: url,
remoteHeader: header,
ws: w,
closed: closed,
FrameReader: packet.NewDecoder(w),
FrameWriter: packet.NewEncoder(w),
}
}
func (c *conn) URL() url.URL {
return c.url
}
func (c *conn) RemoteHeader() http.Header {
return c.remoteHeader
}
func (c *conn) LocalAddr() net.Addr {
return c.ws.LocalAddr()
}
func (c *conn) RemoteAddr() net.Addr {
return c.ws.RemoteAddr()
}
func (c *conn) SetReadDeadline(t time.Time) error {
return c.ws.SetReadDeadline(t)
}
func (c *conn) SetWriteDeadline(t time.Time) error {
// TODO: is locking really needed for SetWriteDeadline? If so, what about
// the read deadline?
c.ws.writeLocker.Lock()
err := c.ws.SetWriteDeadline(t)
c.ws.writeLocker.Unlock()
return err
}
func (c *conn) ServeHTTP(w http.ResponseWriter, r *http.Request) {
<-c.closed
}
func (c *conn) Close() error {
c.closeOnce.Do(func() {
close(c.closed)
})
return c.ws.Close()
}