nonce 응답 추가
This commit is contained in:
@ -2,6 +2,7 @@ package wshandler
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"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 {
|
if found := hc.methods[funcname]; found != nil {
|
||||||
_, err := found(recv, r)
|
return found(recv, r)
|
||||||
if err != nil {
|
|
||||||
logger.Println("api call is failed. err :", err)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
logger.Println("api is not found :", funcname)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return nil, fmt.Errorf("api is not found : %s", funcname)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,7 +6,6 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
|
||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
@ -106,13 +105,3 @@ func TestPeerApiBroker(t *testing.T) {
|
|||||||
func1args, _ = json.Marshal([]any{float64(111.1), []int{99, 98}})
|
func1args, _ = json.Marshal([]any{float64(111.1), []int{99, 98}})
|
||||||
ws.Call(peer, "test.ApiFunc3", bytes.NewBuffer(func1args))
|
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)
|
|
||||||
}
|
|
||||||
|
|||||||
@ -2,6 +2,8 @@ package wshandler
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"net/http"
|
"net/http"
|
||||||
@ -44,7 +46,10 @@ func (ws *WebsocketPeerHandler) upgrade_core(conn *websocket.Conn, accid primiti
|
|||||||
ws.ClientConnected(peer, c)
|
ws.ClientConnected(peer, c)
|
||||||
|
|
||||||
var closeReason string
|
var closeReason string
|
||||||
|
|
||||||
|
response := make([]byte, 255)
|
||||||
for {
|
for {
|
||||||
|
response = response[:0]
|
||||||
messageType, r, err := c.NextReader()
|
messageType, r, err := c.NextReader()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if ce, ok := err.(*websocket.CloseError); ok {
|
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 {
|
if messageType == websocket.BinaryMessage {
|
||||||
var size [1]byte
|
var flag [1]byte
|
||||||
r.Read(size[:])
|
r.Read(flag[:])
|
||||||
cmd := make([]byte, size[0])
|
if flag[0] == 0xff {
|
||||||
r.Read(cmd)
|
// nonce
|
||||||
ws.Call(peer, string(cmd), r)
|
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)
|
ws.ClientDisconnected(peer, closeReason)
|
||||||
|
|||||||
Reference in New Issue
Block a user