|
|
@@ -1,9 +1,9 @@
|
|
|
package ftp
|
|
|
|
|
|
import (
|
|
|
+ "bytes"
|
|
|
"errors"
|
|
|
"io"
|
|
|
- "io/ioutil"
|
|
|
"net"
|
|
|
"net/textproto"
|
|
|
"reflect"
|
|
|
@@ -19,6 +19,7 @@ type ftpMock struct {
|
|
|
proto *textproto.Conn
|
|
|
commands []string // list of received commands
|
|
|
rest int
|
|
|
+ fileCont *bytes.Buffer
|
|
|
dataConn *mockDataConn
|
|
|
sync.WaitGroup
|
|
|
}
|
|
|
@@ -135,7 +136,14 @@ func (mock *ftpMock) listen(t *testing.T) {
|
|
|
break
|
|
|
}
|
|
|
mock.proto.Writer.PrintfLine("150 please send")
|
|
|
- mock.recvDataConn()
|
|
|
+ mock.recvDataConn(false)
|
|
|
+ case "APPE":
|
|
|
+ if mock.dataConn == nil {
|
|
|
+ mock.proto.Writer.PrintfLine("425 Unable to build data connection: Connection refused")
|
|
|
+ break
|
|
|
+ }
|
|
|
+ mock.proto.Writer.PrintfLine("150 please send")
|
|
|
+ mock.recvDataConn(true)
|
|
|
case "LIST":
|
|
|
if mock.dataConn == nil {
|
|
|
mock.proto.Writer.PrintfLine("425 Unable to build data connection: Connection refused")
|
|
|
@@ -166,7 +174,7 @@ func (mock *ftpMock) listen(t *testing.T) {
|
|
|
|
|
|
mock.dataConn.Wait()
|
|
|
mock.proto.Writer.PrintfLine("150 Opening ASCII mode data connection for file list")
|
|
|
- mock.dataConn.conn.Write([]byte(testData[mock.rest:]))
|
|
|
+ mock.dataConn.conn.Write(mock.fileCont.Bytes()[mock.rest:])
|
|
|
mock.rest = 0
|
|
|
mock.proto.Writer.PrintfLine("226 Transfer complete")
|
|
|
mock.closeDataConn()
|
|
|
@@ -268,9 +276,12 @@ func (mock *ftpMock) listenDataConn() (int64, error) {
|
|
|
return p, nil
|
|
|
}
|
|
|
|
|
|
-func (mock *ftpMock) recvDataConn() {
|
|
|
+func (mock *ftpMock) recvDataConn(append bool) {
|
|
|
mock.dataConn.Wait()
|
|
|
- io.Copy(ioutil.Discard, mock.dataConn.conn)
|
|
|
+ if !append {
|
|
|
+ mock.fileCont = new(bytes.Buffer)
|
|
|
+ }
|
|
|
+ io.Copy(mock.fileCont, mock.dataConn.conn)
|
|
|
mock.proto.Writer.PrintfLine("226 Transfer Complete")
|
|
|
mock.closeDataConn()
|
|
|
}
|