summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Pointner <equinox@helsinki.at>2015-12-29 02:31:16 (GMT)
committerChristian Pointner <equinox@helsinki.at>2015-12-29 02:31:16 (GMT)
commitcd8dd43123550f7e01bd09e6f5d8bb6dbd2bfee0 (patch)
tree65abef686c63c25f81988bd2f5a13e18f26d08a2
parent765566d593bea3fa6091eab5f3aa0960053eb4fe (diff)
implemented basic structure for web socket interface
-rw-r--r--src/helsinki.at/rhimportd/ctrlWebSocket.go83
-rw-r--r--src/helsinki.at/rhimportd/main.go2
-rw-r--r--test/socket.html6
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" }));
}
}