func (t wsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { if r.Method != "GET" { http.Error(w, "Method not allowed", 405) t.Logf("bad method: %s", r.Method) return } if r.Header.Get("Origin") != "http://"+r.Host { http.Error(w, "Origin not allowed", 403) t.Logf("bad origin: %s", r.Header.Get("Origin")) return } ws, err := websocket.Upgrade(w, r, http.Header{"Set-Cookie": {"sessionID=1234"}}, 1024, 1024) if _, ok := err.(websocket.HandshakeError); ok { t.Logf("bad handshake: %v", err) http.Error(w, "Not a websocket handshake", 400) return } else if err != nil { t.Logf("upgrade error: %v", err) return } defer ws.Close() for { op, r, err := ws.NextReader() if err != nil { if err != io.EOF { t.Logf("NextReader: %v", err) } return } if op == websocket.PongMessage { continue } w, err := ws.NextWriter(op) if err != nil { t.Logf("NextWriter: %v", err) return } if _, err = io.Copy(w, r); err != nil { t.Logf("Copy: %v", err) return } if err := w.Close(); err != nil { t.Logf("Close: %v", err) return } } }
func (sh *Handler) serveWebSocket(rw http.ResponseWriter, req *http.Request) { ws, err := websocket.Upgrade(rw, req, nil, 1024, 1024) if _, ok := err.(websocket.HandshakeError); ok { http.Error(rw, "Not a websocket handshake", 400) return } else if err != nil { log.Println(err) return } c := &wsConn{ ws: ws, send: make(chan []byte, 256), sh: sh, queries: make(map[string]*watchedQuery), } sh.wsHub.register <- c go c.writePump() c.readPump() }