Trim trailing whitespace from list commands

Listing a current directory (when the path argument is empty)
would send the command "LIST " with trailing whitespace to FTP
resulting in 500 errors with Solaris FTP server.
This patch fixes that.
This commit is contained in:
Ivan Andreev 2021-02-13 20:42:15 +03:00
parent 9aae4d1511
commit 24897db640
3 changed files with 31 additions and 2 deletions

View File

@ -7,6 +7,8 @@ import (
"strings"
"testing"
"time"
"github.com/stretchr/testify/assert"
)
const (
@ -300,3 +302,20 @@ func TestMissingFolderDeleteDirRecur(t *testing.T) {
// Wait for the connection to close
mock.Wait()
}
func TestListCurrentDir(t *testing.T) {
mock, c := openConn(t, "127.0.0.1")
_, err := c.List("")
assert.NoError(t, err)
assert.Equal(t, "LIST", mock.lastFull, "LIST must not have a trailing whitespace")
_, err = c.NameList("")
assert.NoError(t, err)
assert.Equal(t, "NLST", mock.lastFull, "NLST must not have a trailing whitespace")
err = c.Quit()
assert.NoError(t, err)
mock.Wait()
}

View File

@ -18,6 +18,7 @@ type ftpMock struct {
listener *net.TCPListener
proto *textproto.Conn
commands []string // list of received commands
lastFull string // full last command
rest int
fileCont *bytes.Buffer
dataConn *mockDataConn
@ -66,6 +67,7 @@ func (mock *ftpMock) listen(t *testing.T) {
for {
fullCommand, _ := mock.proto.ReadLine()
mock.lastFull = fullCommand
cmdParts := strings.Split(fullCommand, " ")

12
ftp.go
View File

@ -539,7 +539,11 @@ func (c *ServerConn) cmdDataConnFrom(offset uint64, format string, args ...inter
// NameList issues an NLST FTP command.
func (c *ServerConn) NameList(path string) (entries []string, err error) {
conn, err := c.cmdDataConnFrom(0, "NLST %s", path)
space := " "
if path == "" {
space = ""
}
conn, err := c.cmdDataConnFrom(0, "NLST%s%s", space, path)
if err != nil {
return nil, err
}
@ -570,7 +574,11 @@ func (c *ServerConn) List(path string) (entries []*Entry, err error) {
parser = parseListLine
}
conn, err := c.cmdDataConnFrom(0, "%s %s", cmd, path)
space := " "
if path == "" {
space = ""
}
conn, err := c.cmdDataConnFrom(0, "%s%s%s", cmd, space, path)
if err != nil {
return nil, err
}