// // rhimportd // // The Radio Helsinki Rivendell Import Daemon // // // Copyright (C) 2015 Christian Pointner // // This file is part of rhimportd. // // rhimportd is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // any later version. // // rhimportd is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with rhimportd. If not, see . // 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 webSocketSessionHandler() { } func webSocketHandler(conf *rhimport.Config, rddb *rhimport.RdDbChan, sessions *rhimport.SessionStoreChan, trusted bool, w http.ResponseWriter, r *http.Request) { rhdl.Printf("WebSocketHandler: request for '%s'", html.EscapeString(r.URL.Path)) ws, err := websocket.Upgrade(w, r, nil, 1024, 1024) if _, ok := err.(websocket.HandshakeError); ok { http.Error(w, "Not a websocket handshake", 400) return } else if err != nil { rhdl.Println("WebSocket Client", ws.RemoteAddr(), "error:", err) return } rhdl.Println("WebSocket Client", ws.RemoteAddr(), "connected") for { reqdata := newWebSocketRequestData(conf) if err := ws.ReadJSON(&reqdata); err != nil { rhdl.Println("WebSocket Client", ws.RemoteAddr(), "disconnected:", err) return } else { rhdl.Printf("Websocket Client %s got: %+v", ws.RemoteAddr(), reqdata) if trusted { reqdata.UserName = r.Header.Get("X-Forwarded-User") } switch reqdata.Command { case "new": sendWebSocketErrorResponse(ws, http.StatusNotImplemented, "new session - not yet implemented") return case "reconnect": 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 } } } return }