client.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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 client struct {
  11. conn *websocket.Conn
  12. resp *http.Response
  13. }
  14. func NewClient(r *http.Request) (transport.Client, error) {
  15. dialer := websocket.DefaultDialer
  16. conn, resp, err := dialer.Dial(r.URL.String(), r.Header)
  17. if err != nil {
  18. return nil, err
  19. }
  20. return &client{
  21. conn: conn,
  22. resp: resp,
  23. }, nil
  24. }
  25. func (c *client) Response() *http.Response {
  26. return c.resp
  27. }
  28. func (c *client) NextReader() (*parser.PacketDecoder, error) {
  29. var reader io.Reader
  30. for {
  31. t, r, err := c.conn.NextReader()
  32. if err != nil {
  33. return nil, err
  34. }
  35. switch t {
  36. case websocket.TextMessage:
  37. fallthrough
  38. case websocket.BinaryMessage:
  39. reader = r
  40. return parser.NewDecoder(reader)
  41. }
  42. }
  43. }
  44. func (c *client) NextWriter(msgType message.MessageType, packetType parser.PacketType) (io.WriteCloser, error) {
  45. wsType, newEncoder := websocket.TextMessage, parser.NewStringEncoder
  46. if msgType == message.MessageBinary {
  47. wsType, newEncoder = websocket.BinaryMessage, parser.NewBinaryEncoder
  48. }
  49. w, err := c.conn.NextWriter(wsType)
  50. if err != nil {
  51. return nil, err
  52. }
  53. ret, err := newEncoder(w, packetType)
  54. if err != nil {
  55. return nil, err
  56. }
  57. return ret, nil
  58. }
  59. func (c *client) Close() error {
  60. return c.conn.Close()
  61. }