diff options
author | Christian Pointner <equinox@helsinki.at> | 2015-12-29 02:31:16 (GMT) |
---|---|---|
committer | Christian Pointner <equinox@helsinki.at> | 2015-12-29 02:31:16 (GMT) |
commit | cd8dd43123550f7e01bd09e6f5d8bb6dbd2bfee0 (patch) | |
tree | 65abef686c63c25f81988bd2f5a13e18f26d08a2 | |
parent | 765566d593bea3fa6091eab5f3aa0960053eb4fe (diff) |
implemented basic structure for web socket interface
-rw-r--r-- | src/helsinki.at/rhimportd/ctrlWebSocket.go | 83 | ||||
-rw-r--r-- | src/helsinki.at/rhimportd/main.go | 2 | ||||
-rw-r--r-- | test/socket.html | 6 |
3 files changed, 77 insertions, 14 deletions
diff --git a/src/helsinki.at/rhimportd/ctrlWebSocket.go b/src/helsinki.at/rhimportd/ctrlWebSocket.go index 2ba2192..09095dd 100644 --- a/src/helsinki.at/rhimportd/ctrlWebSocket.go +++ b/src/helsinki.at/rhimportd/ctrlWebSocket.go @@ -26,12 +26,63 @@ package main import ( // "encoding/json" + "fmt" "github.com/gorilla/websocket" "helsinki.at/rhimport" "html" "net/http" ) +type webSocketRequestData struct { + Command string `json:"COMMAND"` + Id string `json:"ID"` + UserName string `json:"LOGIN_NAME"` + Password string `json:"PASSWORD"` + ShowId uint `json:"SHOW_ID"` + ClearShowCarts bool `json:"CLEAR_SHOW_CARTS"` + MusicPoolGroup string `json:"MUSIC_POOL_GROUP"` + Cart uint `json:"CART_NUMBER"` + ClearCart bool `json:"CLEAR_CART"` + Cut uint `json:"CUT_NUMBER"` + Channels uint `json:"CHANNELS"` + NormalizationLevel int `json:"NORMALIZATION_LEVEL"` + AutotrimLevel int `json:"AUTOTRIM_LEVEL"` + UseMetaData bool `json:"USE_METADATA"` + SourceUri string `json:"SOURCE_URI"` +} + +func newWebSocketRequestData(conf *rhimport.Config) *webSocketRequestData { + rd := new(webSocketRequestData) + rd.Command = "" + rd.Id = "" + rd.UserName = "" + rd.Password = "" + rd.ShowId = 0 + rd.ClearShowCarts = false + rd.MusicPoolGroup = "" + rd.Cart = 0 + rd.ClearCart = false + rd.Cut = 0 + rd.Channels = conf.ImportParamDefaults.Channels + rd.NormalizationLevel = conf.ImportParamDefaults.NormalizationLevel + rd.AutotrimLevel = conf.ImportParamDefaults.AutotrimLevel + rd.UseMetaData = conf.ImportParamDefaults.UseMetaData + rd.SourceUri = "" + + return rd +} + +type webSocketErrorResponseData struct { + ResponseCode int `json:"RESPONSE_CODE"` + ErrorString string `json:"ERROR_STRING"` +} + +func sendWebSocketErrorResponse(ws *websocket.Conn, code int, err_str string) { + if err := ws.WriteJSON(webSocketErrorResponseData{code, err_str}); err != nil { + rhdl.Println("WebScoket Client", ws.RemoteAddr(), "write error:", err) + } +} + func webSocketHandler(conf *rhimport.Config, rddb *rhimport.RdDbChan, trusted bool, w http.ResponseWriter, r *http.Request) { rhdl.Printf("WebSocketHandler: request for '%s'", html.EscapeString(r.URL.Path)) @@ -46,17 +97,33 @@ func webSocketHandler(conf *rhimport.Config, rddb *rhimport.RdDbChan, trusted bo rhdl.Println("WebSocket Client", ws.RemoteAddr(), "connected") for { - msgtype, msg, err := ws.ReadMessage() - if err != nil { + reqdata := newWebSocketRequestData(conf) + if err := ws.ReadJSON(&reqdata); err != nil { rhdl.Println("WebSocket Client", ws.RemoteAddr(), "disconnected:", err) return - } - if msgtype == websocket.TextMessage { - // TODO: implement the actual proto - rhdl.Println("Websocket Client", ws.RemoteAddr(), "got:", string(msg)) + } else { + rhdl.Printf("Websocket Client %s got: %+v", ws.RemoteAddr(), reqdata) + if trusted { + reqdata.UserName = r.Header.Get("X-Forwarded-User") + } - if err := ws.WriteMessage(websocket.TextMessage, msg); err != nil { - rhdl.Println("WebScoket Client", ws.RemoteAddr(), "write error:", err) + switch reqdata.Command { + case "new": + sendWebSocketErrorResponse(ws, http.StatusNotImplemented, "new session - not yet implemented") + return + case "get": + if reqdata.UserName == "" { + sendWebSocketErrorResponse(ws, http.StatusBadRequest, "missing mandotary field LOGIN_NAME") + return + } + if reqdata.Id == "" { + sendWebSocketErrorResponse(ws, http.StatusBadRequest, "missing mandotary field ID") + return + } + sendWebSocketErrorResponse(ws, http.StatusNotImplemented, "get session - not yet implemented") + return + default: + sendWebSocketErrorResponse(ws, http.StatusBadRequest, fmt.Sprintf("unknown command '%s'", reqdata.Command)) return } } diff --git a/src/helsinki.at/rhimportd/main.go b/src/helsinki.at/rhimportd/main.go index 8a212f9..3ce61da 100644 --- a/src/helsinki.at/rhimportd/main.go +++ b/src/helsinki.at/rhimportd/main.go @@ -164,7 +164,7 @@ func main() { } defer rddb.Cleanup() - go session_test(conf, rddb.GetInterface()) + // go session_test(conf, rddb.GetInterface()) var wg sync.WaitGroup diff --git a/test/socket.html b/test/socket.html index d110c81..9ee91b6 100644 --- a/test/socket.html +++ b/test/socket.html @@ -20,12 +20,8 @@ this.sock.onmessage = function (event) { $('#rawmsg').text(event.data); } - this.seqnum = 0; this.update = function() { - if ((this.seqnum % 15) == 0) { - this.sock.send(JSON.stringify({ test: "hello world", seq: this.seqnum })); - } - this.seqnum += 1; + this.sock.send(JSON.stringify({ COMMAND: "new" })); } } |