From c9ac5980a57e2d7a61d6d9210b0b0028da8cc55f Mon Sep 17 00:00:00 2001 From: mountain Date: Tue, 19 Dec 2023 17:04:14 +0900 Subject: [PATCH] =?UTF-8?q?nonce=20=EC=9D=91=EB=8B=B5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wshandler/api_handler_peer.go | 12 ++++---- wshandler/api_handler_test.go | 11 -------- wshandler/wshandler_peer.go | 52 +++++++++++++++++++++++++++++++---- 3 files changed, 52 insertions(+), 23 deletions(-) diff --git a/wshandler/api_handler_peer.go b/wshandler/api_handler_peer.go index 29ddbbb..64bc874 100644 --- a/wshandler/api_handler_peer.go +++ b/wshandler/api_handler_peer.go @@ -2,6 +2,7 @@ package wshandler import ( "encoding/json" + "fmt" "io" "reflect" "strings" @@ -175,13 +176,10 @@ func (hc *WebsocketPeerApiBroker) ClientDisconnected(recv any, reason string) { } } -func (hc *WebsocketPeerApiBroker) Call(recv any, funcname string, r io.Reader) { +func (hc *WebsocketPeerApiBroker) Call(recv any, funcname string, r io.Reader) (any, error) { if found := hc.methods[funcname]; found != nil { - _, err := found(recv, r) - if err != nil { - logger.Println("api call is failed. err :", err) - } - } else { - logger.Println("api is not found :", funcname) + return found(recv, r) } + + return nil, fmt.Errorf("api is not found : %s", funcname) } diff --git a/wshandler/api_handler_test.go b/wshandler/api_handler_test.go index 18f0378..33d4b77 100644 --- a/wshandler/api_handler_test.go +++ b/wshandler/api_handler_test.go @@ -6,7 +6,6 @@ import ( "encoding/json" "errors" "fmt" - "math" "reflect" "testing" @@ -106,13 +105,3 @@ func TestPeerApiBroker(t *testing.T) { func1args, _ = json.Marshal([]any{float64(111.1), []int{99, 98}}) ws.Call(peer, "test.ApiFunc3", bytes.NewBuffer(func1args)) } - -func TestOverflow(t *testing.T) { - var x uint32 - x = math.MaxUint32 - - var y uint32 - y = x + 1 - - fmt.Printf("%x, %x", x, y) -} diff --git a/wshandler/wshandler_peer.go b/wshandler/wshandler_peer.go index 80a49b6..18cdae7 100644 --- a/wshandler/wshandler_peer.go +++ b/wshandler/wshandler_peer.go @@ -2,6 +2,8 @@ package wshandler import ( "encoding/hex" + "encoding/json" + "fmt" "io" "math/rand" "net/http" @@ -44,7 +46,10 @@ func (ws *WebsocketPeerHandler) upgrade_core(conn *websocket.Conn, accid primiti ws.ClientConnected(peer, c) var closeReason string + + response := make([]byte, 255) for { + response = response[:0] messageType, r, err := c.NextReader() if err != nil { if ce, ok := err.(*websocket.CloseError); ok { @@ -61,11 +66,48 @@ func (ws *WebsocketPeerHandler) upgrade_core(conn *websocket.Conn, accid primiti } if messageType == websocket.BinaryMessage { - var size [1]byte - r.Read(size[:]) - cmd := make([]byte, size[0]) - r.Read(cmd) - ws.Call(peer, string(cmd), r) + var flag [1]byte + r.Read(flag[:]) + if flag[0] == 0xff { + // nonce + r.Read(response[1:5]) + + var size [1]byte + cmd := make([]byte, size[0]) + r.Read(cmd) + result, err := ws.Call(peer, string(cmd), r) + + if err != nil { + response[0] = 21 // 21 : Negative Ack + response = append(response, []byte(err.Error())...) + } else { + response[0] = 6 // 6 : Acknowledgement + + switch result := result.(type) { + case string: + response = append(response, []byte(result)...) + + case int8, int16, int32, int64, uint8, uint16, uint32, uint64: + response = append(response, []byte(fmt.Sprintf("%d", result))...) + + case float32, float64: + response = append(response, []byte(fmt.Sprintf("%f", result))...) + + case []byte: + response = append(response, result...) + + default: + j, _ := json.Marshal(result) + response = append(response, j...) + } + } + c.WriteMessage(websocket.BinaryMessage, response) + } else { + var size [1]byte + cmd := make([]byte, size[0]) + r.Read(cmd) + ws.Call(peer, string(cmd), r) + } } } ws.ClientDisconnected(peer, closeReason)