Skip to content

Commit

Permalink
fix: message header length read error
Browse files Browse the repository at this point in the history
Signed-off-by: ZhangJian He <shoothzj@gmail.com>
  • Loading branch information
shoothzj committed Sep 23, 2024
1 parent 287a74f commit 1e07e95
Show file tree
Hide file tree
Showing 6 changed files with 108 additions and 42 deletions.
2 changes: 1 addition & 1 deletion examples/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ func main() {

config := &opcua.ClientConfig{
Address: netx.Address{
Host: "127.0.0.1",
Host: "localhost",
Port: 4840,
},
Logger: logger,
Expand Down
8 changes: 6 additions & 2 deletions examples/server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,18 @@ func main() {
logger := slog.Default()

config := &opcua.ServerConfig{
Host: "127.0.0.1",
Host: "localhost",
Port: 4840,
ReceiverBufferSize: 1024,
ReadTimeout: 5 * time.Second,
Logger: logger,
}

server := opcua.NewServer(config)
server, err := opcua.NewServer(config)
if err != nil {
logger.Error("Failed to create server", slog.String("error", err.Error()))
os.Exit(1)
}

port, err := server.Run()
if err != nil {
Expand Down
4 changes: 4 additions & 0 deletions opcua/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,10 @@ func (c *Client) Send(buf *buffer.Buffer) (*buffer.Buffer, error) {
if err != nil {
return nil, err
}
err = result.Skip(8)
if err != nil {
return nil, err
}
return result, nil
}

Expand Down
35 changes: 0 additions & 35 deletions opcua/client_test.go

This file was deleted.

12 changes: 9 additions & 3 deletions opcua/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,20 @@ type Server struct {
quit chan bool
}

func NewServer(config *ServerConfig) *Server {
func NewServer(config *ServerConfig) (*Server, error) {
if config.ReceiverBufferSize == 0 {
config.ReceiverBufferSize = 1024
}
if config.ReceiverBufferSize < 9 {
return nil, fmt.Errorf("receiver buffer size must be at least 9 bytes")
}
server := &Server{
config: config,
quit: make(chan bool),
logger: config.Logger,
}
server.logger.Info("server initialized", slog.String("host", config.Host), slog.Int("port", config.Port))
return server
return server, nil
}

func (s *Server) Run() (int, error) {
Expand Down Expand Up @@ -181,7 +187,7 @@ func (s *Server) react(conn *opcuaConn, bytes []byte) ([]byte, error) {
var err error
switch messageType {
case "HEL":
buf, err = s.handleHello(bytes[4:])
buf, err = s.handleHello(bytes[8:])
default:
return nil, fmt.Errorf("unknown message type: %s", messageType)
}
Expand Down
89 changes: 88 additions & 1 deletion opcua/server_test.go
Original file line number Diff line number Diff line change
@@ -1,20 +1,56 @@
package opcua

import (
"github.com/shoothzj/gox/netx"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"log/slog"
"testing"
)

type testSimpleClientServer struct {
client *Client
server *Server
}

func newTestSimpleClientServer(t *testing.T, serverConfig *ServerConfig, clientConfig *ClientConfig) *testSimpleClientServer {
server, err := NewServer(serverConfig)
require.NoError(t, err, "Server creation should not fail")

port, err := server.Run()
require.NoError(t, err, "Server should start without error")

clientConfig.Address = netx.Address{
Host: serverConfig.Host,
Port: port,
}
client, err := NewClient(clientConfig)
require.NoError(t, err, "Client creation should not fail")

return &testSimpleClientServer{
client: client,
server: server,
}
}

func (s *testSimpleClientServer) close() {
if s.client != nil {
s.client.close()
}
if s.server != nil {
_ = s.server.Close()
}
}

func TestStartWithZeroPort(t *testing.T) {
config := &ServerConfig{
Host: "localhost",
Port: 0,
Logger: slog.Default(),
}

server := NewServer(config)
server, err := NewServer(config)
require.NoError(t, err)

port, err := server.Run()
require.NoError(t, err, "Server should start without error")
Expand All @@ -24,3 +60,54 @@ func TestStartWithZeroPort(t *testing.T) {
err = server.Close()
assert.NoError(t, err, "Server should close without error")
}

func TestClientConnect(t *testing.T) {
logger := slog.Default()

serverConfig := &ServerConfig{
Host: "localhost",
Port: 0,
Logger: logger,
}

clientConfig := &ClientConfig{
Logger: logger,
}

simpleClientServer := newTestSimpleClientServer(t, serverConfig, clientConfig)
defer simpleClientServer.close()
}

func TestMessageHello(t *testing.T) {
logger := slog.Default()

serverConfig := &ServerConfig{
Host: "localhost",
Port: 0,
ReceiverBufferSize: 1024,
Logger: logger,
}

clientConfig := &ClientConfig{
Logger: logger,
}

simpleClientServer := newTestSimpleClientServer(t, serverConfig, clientConfig)
defer simpleClientServer.close()

messageAcknowledge, err := simpleClientServer.client.Hello(&MessageHello{
Version: 0,
ReceiveBufferSize: 65535,
SendBufferSize: 65535,
MaxMessageSize: 2097152,
MaxChunkCount: 0,
EndpointUrl: "opc.tcp://localhost:4840/opcua",
})
require.NoError(t, err)

assert.Equal(t, uint32(0), messageAcknowledge.Version)
assert.Equal(t, uint32(65535), messageAcknowledge.ReceiveBufferSize)
assert.Equal(t, uint32(65535), messageAcknowledge.SendBufferSize)
assert.Equal(t, uint32(2097152), messageAcknowledge.MaxMessageSize)
assert.Equal(t, uint32(64), messageAcknowledge.MaxChunkCount)
}

0 comments on commit 1e07e95

Please sign in to comment.