diff --git a/socketserver/server/backend.go b/socketserver/server/backend.go index f5b67c37..b0927f86 100644 --- a/socketserver/server/backend.go +++ b/socketserver/server/backend.go @@ -99,7 +99,8 @@ func HTTPBackendUncachedPublish(w http.ResponseWriter, r *http.Request) { count = PublishToMultiple(strings.Split(channel, ","), cm) case MsgTargetTypeGlobal: count = PublishToAll(cm) - case MsgTargetTypeInvalid: fallthrough + case MsgTargetTypeInvalid: + fallthrough default: w.WriteHeader(422) fmt.Fprint(w, "Invalid 'scope'. must be chat, multichat, channel, or global") diff --git a/socketserver/server/handlecore.go b/socketserver/server/handlecore.go index 7ab17b1e..4200b758 100644 --- a/socketserver/server/handlecore.go +++ b/socketserver/server/handlecore.go @@ -15,6 +15,7 @@ import ( "sync" "sync/atomic" "time" + "unicode/utf8" ) // SuccessCommand is a Reply Command to indicate success in reply to a C2S Command. @@ -179,6 +180,11 @@ var CloseFirstMessageNotHello = websocket.CloseError{ Code: websocket.ClosePolicyViolation, } +var CloseNonUTF8Data = websocket.CloseError{ + Code: 4001, + Text: "Non UTF8 data recieved. Network corruption likely.", +} + const sendMessageBufferLength = 125 const sendMessageAbortLength = 50 @@ -298,6 +304,13 @@ RunLoop: break RunLoop } + for _, char := range msg.Command { + if char == utf8.RuneError { + closeReason = CloseNonUTF8Data + break RunLoop + } + } + DispatchC2SCommand(conn, &client, msg) case msg := <-serverMessageChan: diff --git a/socketserver/server/publisher.go b/socketserver/server/publisher.go index 83aa8b87..4ec4dbf3 100644 --- a/socketserver/server/publisher.go +++ b/socketserver/server/publisher.go @@ -6,9 +6,9 @@ import ( "net/http" "sort" "strconv" + "strings" "sync" "time" - "strings" ) type PushCommandCacheInfo struct { diff --git a/socketserver/server/subscriptions_test.go b/socketserver/server/subscriptions_test.go index f52ffdbf..a9a09ac0 100644 --- a/socketserver/server/subscriptions_test.go +++ b/socketserver/server/subscriptions_test.go @@ -141,19 +141,19 @@ func TCheckResponse(tb testing.TB, resp *http.Response, expected string, desc st } type TURLs struct { - Websocket string - Origin string + Websocket string + Origin string UncachedPubMsg string // uncached_pub - SavePubMsg string // cached_pub + SavePubMsg string // cached_pub } func TGetUrls(testserver *httptest.Server) TURLs { addr := testserver.Listener.Addr().String() return TURLs{ - Websocket: fmt.Sprintf("ws://%s/", addr), - Origin: fmt.Sprintf("http://%s", addr), - UncachedPubMsg: fmt.Sprintf("http://%s/uncached_pub", addr), - SavePubMsg: fmt.Sprintf("http://%s/cached_pub", addr), + Websocket: fmt.Sprintf("ws://%s/", addr), + Origin: fmt.Sprintf("http://%s", addr), + UncachedPubMsg: fmt.Sprintf("http://%s/uncached_pub", addr), + SavePubMsg: fmt.Sprintf("http://%s/cached_pub", addr), } }