server.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package websocket
  2. import (
  3. "io"
  4. "net/http"
  5. "github.com/googollee/go-engine.io/message"
  6. "github.com/googollee/go-engine.io/parser"
  7. "github.com/googollee/go-engine.io/transport"
  8. "github.com/gorilla/websocket"
  9. )
  10. type Server struct {
  11. callback transport.Callback
  12. conn *websocket.Conn
  13. }
  14. func NewServer(w http.ResponseWriter, r *http.Request, callback transport.Callback) (transport.Server, error) {
  15. conn, err := websocket.Upgrade(w, r, nil, 10240, 10240)
  16. if err != nil {
  17. return nil, err
  18. }
  19. ret := &Server{
  20. callback: callback,
  21. conn: conn,
  22. }
  23. go ret.serveHTTP(w, r)
  24. return ret, nil
  25. }
  26. func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  27. w.WriteHeader(http.StatusBadRequest)
  28. }
  29. func (s *Server) NextWriter(msgType message.MessageType, packetType parser.PacketType) (io.WriteCloser, error) {
  30. wsType, newEncoder := websocket.TextMessage, parser.NewStringEncoder
  31. if msgType == message.MessageBinary {
  32. wsType, newEncoder = websocket.BinaryMessage, parser.NewBinaryEncoder
  33. }
  34. w, err := s.conn.NextWriter(wsType)
  35. if err != nil {
  36. return nil, err
  37. }
  38. ret, err := newEncoder(w, packetType)
  39. if err != nil {
  40. return nil, err
  41. }
  42. return ret, nil
  43. }
  44. func (s *Server) Close() error {
  45. return s.conn.Close()
  46. }
  47. func (s *Server) serveHTTP(w http.ResponseWriter, r *http.Request) {
  48. defer s.callback.OnClose(s)
  49. for {
  50. t, r, err := s.conn.NextReader()
  51. if err != nil {
  52. s.conn.Close()
  53. return
  54. }
  55. switch t {
  56. case websocket.TextMessage:
  57. fallthrough
  58. case websocket.BinaryMessage:
  59. decoder, err := parser.NewDecoder(r)
  60. if err != nil {
  61. return
  62. }
  63. s.callback.OnPacket(decoder)
  64. decoder.Close()
  65. }
  66. }
  67. }