1
1
package server
2
2
3
3
import (
4
- "encoding/json"
5
4
"errors"
6
5
"fmt"
6
+ "io"
7
7
"net/http"
8
8
9
- "github.com/gorilla/websocket"
10
9
"github.com/meteorhacks/goddp/utils/random"
10
+ "golang.org/x/net/websocket"
11
11
)
12
12
13
13
func New () Server {
14
14
s := Server {}
15
+ s .wsserver = websocket.Server {Handler : s .wsHandler , Handshake : handshake }
15
16
s .methods = make (map [string ]MethodFn )
16
- s .upgrader = websocket.Upgrader {
17
- ReadBufferSize : 1024 ,
18
- WriteBufferSize : 1024 ,
19
- CheckOrigin : checkOrigin ,
20
- }
21
-
22
17
return s
23
18
}
24
19
25
20
type Server struct {
26
21
methods map [string ]MethodFn
27
- upgrader websocket.Upgrader
22
+ wsserver websocket.Server
28
23
}
29
24
30
25
func (s * Server ) Listen (addr string ) error {
31
- http .HandleFunc ("/websocket" , s .Handler )
32
- http .HandleFunc ("/sockjs/websocket" , s .Handler )
26
+ http .Handle ("/websocket" , s .wsserver )
27
+ http .Handle ("/sockjs/websocket" , s .wsserver )
33
28
return http .ListenAndServe (addr , nil )
34
29
}
35
30
36
31
func (s * Server ) Method (name string , fn MethodFn ) {
37
32
s .methods [name ] = fn
38
33
}
39
34
40
- func (s * Server ) Handler (w http.ResponseWriter , r * http.Request ) {
41
- ws , err := s .upgrader .Upgrade (w , r , nil )
42
- if err != nil {
43
- // TODO => handle non-websocket requests
44
- return
45
- }
46
-
35
+ func (s * Server ) wsHandler (ws * websocket.Conn ) {
47
36
for {
48
- msg , err := readMessage (ws )
37
+ var msg Message
38
+ if err := websocket .JSON .Receive (ws , & msg ); err != nil {
39
+ if err != io .EOF {
40
+ fmt .Println ("Read Error: " , err )
41
+ }
49
42
50
- if err != nil {
51
43
break
52
44
}
53
45
@@ -59,6 +51,7 @@ func (s *Server) Handler(w http.ResponseWriter, r *http.Request) {
59
51
case "method" :
60
52
handleMethod (s , ws , msg )
61
53
default :
54
+ fmt .Println ("Error: unknown message type" , msg )
62
55
// TODO => send "error" ddp message
63
56
break
64
57
}
@@ -67,52 +60,33 @@ func (s *Server) Handler(w http.ResponseWriter, r *http.Request) {
67
60
ws .Close ()
68
61
}
69
62
70
- func checkOrigin (r * http.Request ) bool {
71
- return true
72
- }
73
-
74
- func readMessage (req Request ) (Message , error ) {
75
- t , str , err := req .ReadMessage ()
76
- msg := Message {}
77
-
78
- if err != nil {
79
- return msg , err
80
- }
81
-
82
- if t != 1 {
83
- err = errors .New ("DDP does not supports binary streams yet" )
84
- return msg , err
85
- }
86
-
87
- if err := json .Unmarshal (str , & msg ); err != nil {
88
- return msg , err
89
- }
90
-
91
- return msg , nil
63
+ func handshake (config * websocket.Config , req * http.Request ) error {
64
+ // accept all connections
65
+ return nil
92
66
}
93
67
94
- func handleConnect (s * Server , res Response , m Message ) error {
95
- return res . WriteJSON ( map [string ]string {
68
+ func handleConnect (s * Server , ws * websocket. Conn , m Message ) error {
69
+ return websocket . JSON . Send ( ws , map [string ]string {
96
70
"msg" : "connected" ,
97
71
"session" : random .Id (17 ),
98
72
})
99
73
}
100
74
101
- func handleMethod (s * Server , res Response , m Message ) error {
75
+ func handleMethod (s * Server , ws * websocket. Conn , m Message ) error {
102
76
fn , ok := s .methods [m .Method ]
103
77
104
78
if ! ok {
105
79
err := errors .New (fmt .Sprintf ("method %s not found" , m .Method ))
106
80
return err
107
81
}
108
82
109
- ctx := NewMethodContext (m , res )
83
+ ctx := NewMethodContext (m , ws )
110
84
go fn (ctx )
111
85
112
86
return nil
113
87
}
114
88
115
- func handlePing (s * Server , res Response , m Message ) error {
89
+ func handlePing (s * Server , ws * websocket. Conn , m Message ) error {
116
90
msg := map [string ]string {
117
91
"msg" : "pong" ,
118
92
}
@@ -121,5 +95,5 @@ func handlePing(s *Server, res Response, m Message) error {
121
95
msg ["id" ] = m .ID
122
96
}
123
97
124
- return res . WriteJSON ( msg )
98
+ return websocket . JSON . Send ( ws , msg )
125
99
}
0 commit comments