diff --git a/handle_misc.go b/handle_misc.go index 154da82a..6c3a7cd1 100644 --- a/handle_misc.go +++ b/handle_misc.go @@ -283,6 +283,16 @@ func (c *clientHandler) handleTYPE(param string) error { return nil } +func (c *clientHandler) handleMODE(param string) error { + if param == "S" { + c.writeMessage(StatusOK, "Using stream mode") + } else { + c.writeMessage(StatusNotImplementedParam, "Unsupported mode") + } + + return nil +} + func (c *clientHandler) handleQUIT(_ string) error { c.transferWg.Wait() diff --git a/handle_misc_test.go b/handle_misc_test.go index 8f5448ac..226c0c0f 100644 --- a/handle_misc_test.go +++ b/handle_misc_test.go @@ -418,3 +418,27 @@ func TestTYPE(t *testing.T) { require.NoError(t, err) require.Equal(t, StatusNotImplementedParam, returnCode) } + +func TestMode(t *testing.T) { + server := NewTestServer(t, false) + conf := goftp.Config{ + User: authUser, + Password: authPass, + } + + client, err := goftp.DialConfig(conf, server.Addr()) + require.NoError(t, err, "Couldn't connect") + + defer func() { panicOnError(client.Close()) }() + + raw, err := client.OpenRawConn() + require.NoError(t, err, "Couldn't open raw connection") + + returnCode, _, err := raw.SendCommand("MODE S") + require.NoError(t, err) + require.Equal(t, StatusOK, returnCode) + + returnCode, _, err = raw.SendCommand("MODE X") + require.NoError(t, err) + require.Equal(t, StatusNotImplementedParam, returnCode) +} diff --git a/server.go b/server.go index 67be9c04..c8d84eba 100644 --- a/server.go +++ b/server.go @@ -87,6 +87,7 @@ var commandsMap = map[string]*CommandDescription{ //nolint:gochecknoglobals // Connection handling "TYPE": {Fn: (*clientHandler).handleTYPE}, + "MODE": {Fn: (*clientHandler).handleMODE}, "PASV": {Fn: (*clientHandler).handlePASV}, "EPSV": {Fn: (*clientHandler).handlePASV}, "PORT": {Fn: (*clientHandler).handlePORT},