func (s *S) TestHTTPWebsocket(c *C) { done := make(chan struct{}) srv := httptest.NewServer( websocket.Handler(func(conn *websocket.Conn) { _, err := conn.Write([]byte("1")) c.Assert(err, IsNil) res := make([]byte, 1) _, err = conn.Read(res) c.Assert(err, IsNil) c.Assert(res[0], Equals, byte('2')) close(done) }), ) l, discoverd := newHTTPListener(c) defer l.Close() addHTTPRoute(c, l) discoverdRegisterHTTP(c, l, srv.Listener.Addr().String()) defer discoverd.UnregisterAll() conn, err := net.Dial("tcp", l.Addr) c.Assert(err, IsNil) defer conn.Close() conf, err := websocket.NewConfig("ws://example.com", "http://example.net") c.Assert(err, IsNil) wc, err := websocket.NewClient(conf, conn) c.Assert(err, IsNil) res := make([]byte, 1) _, err = wc.Read(res) c.Assert(err, IsNil) c.Assert(res[0], Equals, byte('1')) _, err = wc.Write([]byte("2")) c.Assert(err, IsNil) }
func (s *S) TestHTTPWebsocket(c *C) { done := make(chan struct{}) h := http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { if req.URL.Path != "/websocket" { w.Write([]byte("not a websocket upgrade\n")) return } websocket.Handler(func(conn *websocket.Conn) { _, err := conn.Write([]byte("1")) c.Assert(err, IsNil) res := make([]byte, 1) _, err = conn.Read(res) c.Assert(err, IsNil) c.Assert(res[0], Equals, byte('2')) done <- struct{}{} }).ServeHTTP(w, req) }) srv := httptest.NewServer(h) defer srv.Close() l := s.newHTTPListener(c) defer l.Close() addHTTPRoute(c, l) discoverdRegisterHTTP(c, l, srv.Listener.Addr().String()) tests := []struct { afterKeepAlive bool }{ {afterKeepAlive: false}, {afterKeepAlive: true}, // ensure that upgrade still works on reused conn } for _, test := range tests { conn, err := net.Dial("tcp", l.Addr) c.Assert(err, IsNil) defer conn.Close() if test.afterKeepAlive { req, err := http.NewRequest("GET", "http://example.com", nil) c.Assert(err, IsNil) err = req.Write(conn) c.Assert(err, IsNil) res, err := http.ReadResponse(bufio.NewReader(conn), req) c.Assert(err, IsNil) data, err := ioutil.ReadAll(res.Body) c.Assert(err, IsNil) res.Body.Close() c.Assert(res.StatusCode, Equals, 200) c.Assert(string(data), Equals, "not a websocket upgrade\n") } conf, err := websocket.NewConfig("ws://example.com/websocket", "http://example.net") c.Assert(err, IsNil) wc, err := websocket.NewClient(conf, conn) c.Assert(err, IsNil) res := make([]byte, 1) _, err = wc.Read(res) c.Assert(err, IsNil) c.Assert(res[0], Equals, byte('1')) _, err = wc.Write([]byte("2")) c.Assert(err, IsNil) <-done } }