package cmpSnipper import ( "time" "net/http" "github.com/gorilla/websocket" ) type cmpWbsCliStruct struct { W http.ResponseWriter Connect *websocket.Conn HostPort string } var upgrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, HandshakeTimeout: 60 * time.Second, } func (app *App) HttpWebSockHand(w http.ResponseWriter, req *http.Request) { conn, err := upgrader.Upgrade(w, req, nil) defer conn.Close() if err != nil { app.Log(err) return } app.Log("HttpWebSockHand:for") HostPort := req.Header.Get("X-Real-Ip") if HostPort == "" { HostPort = req.Header.Get("X-Forwarded-For") } if HostPort == "" { HostPort = req.RemoteAddr } app.Log("New client: %s", HostPort) var cmpWbsCli cmpWbsCliStruct = cmpWbsCliStruct{ w, conn, HostPort, } app.CliList = append(app.CliList, cmpWbsCli) app.Log(app.CliList) for i, cli := range app.CliList { app.Log("Client %s, %s", i, cli.HostPort) } for { var inp = map[string]interface{}{} var out = map[string]interface{}{ "snip": "", "result": nil, } err := conn.ReadJSON(&inp) if err != nil { app.Log("Read JSON: %s", err) app.Log(err) var list []cmpWbsCliStruct for _, ii := range app.CliList { if ii.HostPort == HostPort { continue } list = append(list, ii) } app.CliList = list return } app.Log("Received message: %+v", inp) out["snip"] = inp["snip"] // app.Log("Copy snip OK") var snip string; snip = inp["snip"].(string) // app.Log("Look snip") if app.SnipExists(snip) { out["result"], err = app.SnipCall(cmpWbsCli, snip, inp) if err != nil { out["error"] = "Server error" } } else { out["error"] = "Unknown snip" app.Log("Unknow snip:", inp["snip"]) } err = conn.WriteJSON(out) if err != nil { app.Log(err) } // for } return } func (app *App) HttpWebSockSendTo(cmpWbsCli cmpWbsCliStruct, snip string, result map[string]interface{}) { var err error out := map[string]interface{}{ "snip": snip, "result": result, } err = cmpWbsCli.Connect.WriteJSON(out) if err != nil { app.Log(err) return } return } func (app *App) HttpWebSockSendAll(snip string, result map[string]interface{}) { var err error app.Log("Send to all") out := map[string]interface{}{ "snip": snip, "result": result, } for _, ii := range app.CliList { if ii.HostPort == "" { break } err = ii.Connect.WriteJSON(out) if err != nil { app.Log(err) continue } } return }