package core import ( "fmt" "github.com/gorilla/websocket" "html/template" "log" "net/http" ) func echo(sub Subscriber) func(w http.ResponseWriter, r *http.Request) { var upgrader = websocket.Upgrader{} // use default options return func(w http.ResponseWriter, r *http.Request) { fmt.Println("upgrading to ws") c, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Print("upgrade:", err) return } //defer c.Close() go func() { for { if _, _, err := c.NextReader(); err != nil { c.Close() break } } }() dispatcherId, channel := sub.Subscribe() defer sub.Unsubscribe(dispatcherId) for { log.Println("") //if err != nil { // log.Println("read:", err) // break //} cmsg := <-channel err = c.WriteMessage(websocket.TextMessage, []byte(cmsg)) if err != nil { log.Println("write:", err) break } } } } func home(w http.ResponseWriter, r *http.Request) { //var homeTemplate = template.Must(template.NewDispatcher("").ParseFiles("index.html")) tpl, err := template.ParseFiles("index.html") if err != nil { log.Fatalln(err) } err = tpl.Execute(w, "ws://"+r.Host+"/echo") if err != nil { log.Fatalln(err) } } func NewHttpServer(sub Subscriber, httpPort string) { http.HandleFunc("/echo", echo(sub)) http.HandleFunc("/", home) http.Handle("/static/", http.FileServer(http.Dir("."))) log.Fatal(http.ListenAndServe(httpPort, nil)) }