nonce 응답 추가

This commit is contained in:
2023-12-19 17:04:14 +09:00
parent 17593f74c6
commit c9ac5980a5
3 changed files with 52 additions and 23 deletions

View File

@ -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)
}

View File

@ -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)
}

View File

@ -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)