require header match
This commit is contained in:
33
packet.go
33
packet.go
@@ -31,11 +31,44 @@ type Packet struct {
|
||||
StatusCode uint32
|
||||
}
|
||||
|
||||
var headerData = make([]byte, 4)
|
||||
|
||||
func matchHeader(conn io.Reader) error {
|
||||
|
||||
pos := 0
|
||||
for pos < 4 {
|
||||
|
||||
l, err := conn.Read(headerData)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for i := 0; i < l; i++ {
|
||||
if headerData[i] == header[pos] {
|
||||
pos++
|
||||
if pos == 4 {
|
||||
return nil
|
||||
}
|
||||
} else {
|
||||
pos = 0
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func ReadPacket(conn io.Reader, packet *Packet) error {
|
||||
err := matchHeader(conn)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return binary.Read(conn, binary.LittleEndian, packet)
|
||||
}
|
||||
|
||||
func ReadCartPacket(conn io.Reader, packet *CartPacket) error {
|
||||
err := matchHeader(conn)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return binary.Read(conn, binary.LittleEndian, packet)
|
||||
}
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ func NewCartTCPClient(address string) (*CartTCPClient, error) {
|
||||
}
|
||||
|
||||
func (m *CartTCPClient) SendPacket(messageType CartMessage, id CartId, data []byte) error {
|
||||
|
||||
m.Conn.Write(header[:])
|
||||
err := binary.Write(m.Conn, binary.LittleEndian, CartPacket{
|
||||
Version: CurrentPacketVersion,
|
||||
MessageType: messageType,
|
||||
|
||||
@@ -70,7 +70,7 @@ func (m *TCPCartServerMux) handleFunction(connection net.Conn, messageType CartM
|
||||
m.mu.RUnlock()
|
||||
if ok {
|
||||
responseType, responseData, err := fn(id, data)
|
||||
|
||||
connection.Write(header[:])
|
||||
if err != nil {
|
||||
errData := []byte(err.Error())
|
||||
err = binary.Write(connection, binary.LittleEndian, CartPacket{
|
||||
@@ -96,6 +96,8 @@ func (m *TCPCartServerMux) handleFunction(connection net.Conn, messageType CartM
|
||||
packetsSent.Inc()
|
||||
_, err = connection.Write(responseData)
|
||||
return true, err
|
||||
} else {
|
||||
log.Printf("No cart handler for type: %d\n", messageType)
|
||||
}
|
||||
return false, nil
|
||||
}
|
||||
|
||||
@@ -23,23 +23,24 @@ func TestCartTcpHelpers(t *testing.T) {
|
||||
return nil
|
||||
})
|
||||
server.HandleCall(666, func(id CartId, data []byte) (CartMessage, []byte, error) {
|
||||
log.Printf("Received call: %s\n", string(data))
|
||||
log.Printf("Received 666 call: %s\n", string(data))
|
||||
return 3, []byte("Hello, client!"), fmt.Errorf("Det blev fel")
|
||||
})
|
||||
server.HandleCall(2, func(id CartId, data []byte) (CartMessage, []byte, error) {
|
||||
log.Printf("Received call: %s\n", string(data))
|
||||
return 3, []byte("Hello, client!"), nil
|
||||
log.Printf("Received 2 call: %s\n", string(data))
|
||||
return 4, []byte("Hello, client!"), nil
|
||||
})
|
||||
// server.HandleCall(Ping, func(id CartId, data []byte) (CartMessage, []byte, error) {
|
||||
// return Pong, nil, nil
|
||||
// })
|
||||
id := ToCartId("kalle")
|
||||
client.SendPacket(1, id, []byte("Hello, world!"))
|
||||
answer, err := client.Call(2, id, 3, []byte("Hello, server!"))
|
||||
answer, err := client.Call(2, id, 4, []byte("Hello, server!"))
|
||||
if err != nil {
|
||||
t.Errorf("Error calling: %v\n", err)
|
||||
}
|
||||
s, err := client.Call(666, id, 3, []byte("Hello, server!"))
|
||||
client.Close()
|
||||
if err != nil {
|
||||
t.Errorf("Error calling: %v\n", err)
|
||||
}
|
||||
|
||||
@@ -92,8 +92,14 @@ func NewTCPClient(address string) (*TCPClient, error) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (m *TCPClient) SendPacket(messageType PoolMessage, data []byte) error {
|
||||
type PacketHeader [4]byte
|
||||
|
||||
var (
|
||||
header = PacketHeader([4]byte{0x01, 0x02, 0x03, 0x04})
|
||||
)
|
||||
|
||||
func (m *TCPClient) SendPacket(messageType PoolMessage, data []byte) error {
|
||||
m.Conn.Write(header[:])
|
||||
err := binary.Write(m.Conn, binary.LittleEndian, Packet{
|
||||
Version: CurrentPacketVersion,
|
||||
MessageType: messageType,
|
||||
|
||||
@@ -69,6 +69,7 @@ func (m *TCPServerMux) handleFunction(connection net.Conn, messageType PoolMessa
|
||||
function, ok := m.functions[messageType]
|
||||
m.mu.RUnlock()
|
||||
if ok {
|
||||
connection.Write(header[:])
|
||||
responseType, responseData, err := function(data)
|
||||
if err != nil {
|
||||
errData := []byte(err.Error())
|
||||
@@ -93,6 +94,8 @@ func (m *TCPServerMux) handleFunction(connection net.Conn, messageType PoolMessa
|
||||
packetsSent.Inc()
|
||||
_, err = connection.Write(responseData)
|
||||
return true, err
|
||||
} else {
|
||||
log.Printf("No pool handler for type: %d\n", messageType)
|
||||
}
|
||||
return false, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user